5.4 KiB
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 作为静态服务器,及代理服务器
项目架构如下:
本系统中有三个主要模块 OMS,DAS 和一个 Eureka 注册中心。其中 OMS 和 DAS 使用有 activemq 消息队列,来进行大量数据的交互然后各自使用一个 mysql 数据库存储主要的业务数据。使用 elastricsearch 存储超大量的数据。
传统软件部署和 docker 部署
本项目在 windows 部署时是将其作为三个部分来进行安装的--ENV 环境包(保护 mysql,es 等),OMS 产品包,DAS 产品包。所以最初我的设想是一个容器中装 ENV 环境包所需的所有软件,一个容器装 DAS,一个容器装 OMS。然后再实践的过程中越来越感觉不对劲,环境配置比较复杂,而且也有种把容器当虚拟机用的感觉,一点没有简化的感觉。
遂停下了操作,开始学习一波 docker 到底是怎么用的。用租房子来做比喻:
- 传统软件部署方式相当于租到一个零家具,零装修的房子。我们想要住进去首先必须买齐必要的家具,然后想要住的舒心呢,还得花功夫装饰装饰,让房子好看点。这样就会对这个具体的房子产生较强的依赖,很难迁移到另一个房子中(想想那么多的家具,家电,杂物。。)。如果全部放弃重新换一个房子代价又太大了。
- 使用 docker 相当于租到一个全家电,精装修的房子。我们只需带上自己的个人物品即可开始入住。想要换一个房子也是轻而易举,带上自己的东西麻溜的就换了。
使用 docker 推荐操作是一个进程放到一个容器中,做到更好的隔离性,同时也更容易进行管理。下面来使用容器技术部署我们应用。还是分为三部分,但是每个进程使用一个容器,做到 0 配置启动容器。
实战
在此默认已经会安装 docker,且了解基本操作。如不了解的先看这两篇:安装,基本使用
部署 ENV 环境包
环境包中诸如 elastricsearch,mysql 这样的数据存储工具,需要满足如下两个要求:
- 保留数据,不论容器如何创建、销毁,数据不能丢。
- 需要使用个性化的配置文件,每次启动根据该配置文件来启动。
部署 mysql
曾经最初的时候在 linux 上手动装一个 mysql 能花上半天的时间,而且还不会进行数据迁移,感觉 mysql 能如此如此快速的查询大量数据很强大。。现在我已然能够熟练的掌握 mysql 安装、卸载。
使用容器部署 mysql 过程如下:
- 首先从 docker.hub 中根据各自的需求 pull 对应的 mysql 镜像
docker pull mysql:5.7.24
- 启动镜像
由于 mysql 是用来存数据的,数据无论什么情况都不能丢失,所以数据存在容器外部,通过映射操作,映射到容器内部,参数如下:
# 将宿主机的路径,映射到容器内部。这个路径既可以是文件夹,也可以是文件
-v hostPath/containerPath
显然我们通过这个桉树将外部的数据文件夹,配置文件映射到容器中。最后启动这个容器的命令如下:
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
命令查看时间和时区都正常。