technology-note/linux/docker/3.docker部署java应用.md
2019-02-01 17:27:09 +08:00

93 lines
5.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
id="2019-02-01-14-05"
title="3.从零开始在docker中部署java应用"
headWord="在没有docker之前发布项目测试项目都是一件非常头疼的你可能经常会听到这样的话,'测试过几天要测试了过来搭个测试环境。一顿操作后。测试提bug开发"
tags=["docker","springboot","jar","war","elastricsearch","activemq"]
category="linux"
serie="docker教程"
---
# 前言
  在没有 docker 前,项目转测试是比较麻烦的一件事。首先会化较长的时间搭建测试环境,然后在测试过程中又经常出现测试说是 bug开发说无法复现的情况导致撕逼。
  本篇记录了如何将一个 java 应用部署到 docker 中。主要讲述了以下几个部分:
- docker 部署 mysql
- docker 部署 activemq
- docker 部署 elastricsearch 集群
- docker 部署 java 应用
- docker 部署 nginx 作为静态服务器,及代理服务器
项目架构如下:
![项目架构](https://raw.githubusercontent.com/FleyX/files/master/blogImg/linux/docker/20190201151250.png)
本系统中有三个主要模块 OMS,DAS 和一个 Eureka 注册中心。其中 OMS 和 DAS 使用有 activemq 消息队列,来进行大量数据的交互然后各自使用一个 mysql 数据库存储主要的业务数据。使用 elastricsearch 存储超大量的数据。
## 传统软件部署和 docker 部署
  本项目在 windows 部署时是将其作为三个部分来进行安装的--ENV 环境包(保护 mysqles 等OMS 产品包DAS 产品包。所以最初我的设想是一个容器中装 ENV 环境包所需的所有软件,一个容器装 DAS一个容器装 OMS。然后再实践的过程中越来越感觉不对劲环境配置比较复杂而且也有种把容器当虚拟机用的感觉一点没有简化的感觉。
  遂停下了操作,开始学习一波 docker 到底是怎么用的。用租房子来做比喻:
- 传统软件部署方式相当于租到一个零家具,零装修的房子。我们想要住进去首先必须买齐必要的家具,然后想要住的舒心呢,还得花功夫装饰装饰,让房子好看点。这样就会对这个具体的房子产生较强的依赖,很难迁移到另一个房子中(想想那么多的家具,家电,杂物。。)。如果全部放弃重新换一个房子代价又太大了。
![搬家](https://raw.githubusercontent.com/FleyX/files/master/blogImg/linux/docker/20190201161044.png)
- 使用 docker 相当于租到一个全家电,精装修的房子。我们只需带上自己的个人物品即可开始入住。想要换一个房子也是轻而易举,带上自己的东西麻溜的就换了。
![轻松搬家](https://raw.githubusercontent.com/FleyX/files/master/blogImg/linux/docker/20190201161301.png)
  使用 docker 推荐操作是一个进程放到一个容器中,做到更好的隔离性,同时也更容易进行管理。下面来使用容器技术部署我们应用。还是分为三部分,但是每个进程使用一个容器,做到 0 配置启动容器。
# 实战
  在此默认已经会安装 docker且了解基本操作。如不了解的先看这两篇[安装](http://tapme.top/blog/detail/2018-11-20-10-38-05)[基本使用](http://tapme.top/blog/detail/2018-12-26-13-18)
## 部署 ENV 环境包
  环境包中诸如 elastricsearchmysql 这样的数据存储工具,需要满足如下两个要求:
1. 保留数据,不论容器如何创建、销毁,数据不能丢。
2. 需要使用个性化的配置文件,每次启动根据该配置文件来启动。
### 部署 mysql
  曾经最初的时候在 linux 上手动装一个 mysql 能花上半天的时间,而且还不会进行数据迁移,感觉 mysql 能如此如此快速的查询大量数据很强大。。现在我已然能够熟练的掌握 mysql 安装、卸载。
  使用容器部署 mysql 过程如下:
1. 首先从 docker.hub 中根据各自的需求 pull 对应的 mysql 镜像
```bash
docker pull mysql:5.7.24
```
2. 启动镜像
  由于 mysql 是用来存数据的,数据无论什么情况都不能丢失,所以数据存在容器外部,通过映射操作,映射到容器内部,参数如下:
```bash
# 将宿主机的路径,映射到容器内部。这个路径既可以是文件夹,也可以是文件
-v hostPath/containerPath
```
显然我们通过这个桉树将外部的数据文件夹,配置文件映射到容器中。最后启动这个容器的命令如下:
```bash
docker run --name=mysql -itd -p 3308:3306 -v /etc/localtime:/etc/localtime -v /etc/timezone:/etc/timezone -v /opt/mysql/data:/var/lib/myql -v /opt/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.25
```
**注意:如果 mysql 版本为 8.x还需要映射/var/lib/mysql-files 目录,否则启动报错**
下面介绍具体参数含义:
- -it 标准输入输出有关
- -d 后台启动
- -v 文件映射
- -e 设置环境变量到容器中
  可能你们会问为什么要映射`/etc/timezone``/etc/timezone`,这是为了让容器的时间和时区与宿主机保持一致。默认情况下容器为 UTC 标准时间。`/etc/timezone`让容器时间,时区和宿主机一致。但是如果不映射`/etc/timezone`java 应用中的时区还是错的,虽然使用`date -R`命令查看时间和时区都正常。
### 部署elastricsearch容器