docker快速部署java+nginx+mysql运行环境
我们在工作中会经常遇到快速部署项目的需求,如果采用纯手动搭建将会是一件非常麻烦的事情,尤其是在Linux服务器上,它牵扯到基础环境安装及配置等繁琐的步骤。
本文将介绍一种docker部署方式,将使这项工作变得非常方便快捷。
1 构建java运行容器
首先 springboot
依赖 java
环境,我们需要找一个 java8
的基础镜像来进行改造
经不断的寻找和测试,fiadlie/java8-jre符合要求
经过改造后的 dockerfile
如下:
# 1. 从java8-jre镜像来构建新镜像
FROM fiadliel/java8-jre
MAINTAINER chrischen "chrischen083@126.com"
# 2. 设置项目路径,也就是SpringBoot Jar包路径
ENV DOCKER_PORJECT_PATH /project
# 3. 修改jvm配置,解决Linux下服务启动慢问题
ADD java.security /usr/lib/jvm/default-jvm/jre/lib/security/java.security
WORKDIR $DOCKER_PORJECT_PATH
# 4. 对外开放8001端口
EXPOSE 8001
# 5. 校正容器时区问题,改为中国时间
RUN apk add -U tzdata
RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone
# 6. 这里将默认启动 /project 目录下的第一个jar包,用于外部挂载目录,确保该目录下只有一个jar文件
ENTRYPOINT java -jar $DOCKER_PORJECT_PATH/$(ls | grep .jar -m 1) --server.port=8001 --spring.profiles.active=prod
java.security
文件改动如下
securerandom.source=file:/dev/./urandom
将文件保存为如下目录
docker_base
├── Dockerfile
└── java.security
执行镜像构建命令
cd docker_base
sudo docker build -t java/springboot:1.0 .
将打包好的jar包和yml文件放入挂载目录下,然后启动容器
sudo docker run --name my_service -v /my_project:/project -p 8001:8001 -d java/springboot:1.0
通过docker日志检查服务启动状态
sudo docker logs my_service -f
2 构建MySQL容器
直接使用dockerhub mysql官方镜像即可轻松构建
创建空的挂载路径例如 mkdir /mysql_path
sudo docker run --name mysql57 \
-v /mysql_path:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d -p 3306:3306 \
mysql:5.7.26
注意 -e MYSQL_ROOT_PASSWORD=root
设置 root
密码为 root
3 构建Nginx容器
直接使用dockerhub nginx官方镜像即可轻松构建
docker run --name nginx \
-v /my_nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
-v /my_nginx/html:/etc/nginx/html -d -p 8080:8080 \
nginx:1.17.0
可以打开浏览器进行验证,http://server_ip:8080
4 docker compose容器整合
上述步骤讲述了SpringBoot、MySQL、Nginx容器独立运行的方式,接下来将进行整合,目标是实现3个容器整体打包启动,并内部组网
首先我们规划一下工程目录结构
my_project # 项目部署根目录
├── docker-compose # docker-compose目录
│ └── docker-compose.yml # docker-compose.yml配置文件
├── mysql # mysql数据保存目录
├── nginx # nginx前端程序运行目录
│ ├── dist # 前端dist打包文件目录
│ └── nginx.conf # nginx配置文件
└── service # 后端服务目录
├── application-prod.yml # springboot配置文件
└── my_service.jar # springboot打包jar文件
docker-compose.yml
配置
version: "3"
services:
nginx:
image: nginx:1.17.0
ports:
- "8080:8080"
volumes:
- "/my_project/nginx/dist:/etc/nginx/html"
- "/my_project/nginx/nginx.conf:/etc/nginx/nginx.conf:ro"
links:
- springboot
springboot:
image: java/springboot:1.0
ports:
- "8001:8001"
volumes:
- "/my_project/service:/project"
links:
- mysql57
mysql57:
image: mysql:5.7.26
ports:
- "3306:3306"
volumes:
- "/my_project/mysql:/var/lib/mysql"
environment:
MYSQL_ROOT_PASSWORD: root
可以看出,其实是将前3步配置进行了整合,然后增加links,让3个容器内部组网
services
下描述的内容全部都是各个容器的构建和启动方式
nginx
、springboot
、mysql57
,分别是3个容器的别名
links
中直接填写别名,让容器自动建立网络通信,那么在对应的配置文件的网络部分也要做相应的调整
在 application-prod.yml
中连接数据库字符串,我们将
jdbc:log4jdbc:mysql://127.0.0.1/dbname
改为 links
中的别名,也就是 mysql57
jdbc:log4jdbc:mysql://mysql57/dbname
nginx.conf
中的转发地址也要调整为对应容器的网络别名
location /api/ {
rewrite ^/api/(.*)$ /$1 break;
proxy_pass http://127.0.0.1:8001;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
改为
location /api/ {
rewrite ^/api/(.*)$ /$1 break;
proxy_pass http://springboot:8001;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
这样容器启动时会根据内部网络地址自动组网联通,如果单独部署就会遇到serverip变化导致请求失败问题
最后,启动整合容器
cd /my_project/docker-compose
docker-compose up -d
也可以指定配置文件路径执行
docker-compose -f "/my_project/docker-compose/docker-compose.yml" up -d
停止容器
cd /my_project/docker-compose
docker-compose down
5 总结
我们日常工作中经常会遇到项目部署需求,使用docker部署是一种非常高效便捷的方式,由于其特殊的隔离机制,它不会原系统产生影响
需要注意的点在于
- java8在Linux下启动时需要修改随机数生成方式,不然会导致启动慢问题
- 注意容器内部的时区问题,容器时区往往默认为0,我们要改为
+8
或Asia/Shanghai
- 利用
Links
自动组网机制,解决繁琐的IP配置问题
服务器环境的部署需提前规划好工程目录,并做好对应记录,在后续更新维护时方便查阅