93 lines
5.4 KiB
Markdown
93 lines
5.4 KiB
Markdown
|
---
|
|||
|
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 环境包(保护 mysql,es 等),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 环境包
|
|||
|
|
|||
|
  环境包中诸如 elastricsearch,mysql 这样的数据存储工具,需要满足如下两个要求:
|
|||
|
|
|||
|
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容器
|