PS:小白最近刚使用docker进行tomcat的项目部署,后面学习使用docker-compose,再后面看到docker stack启动docker-compose,技术迭代的过程真的很有意思,下面讲述一下具体我的tomcat项目部署的配置、方法和思路(个人的部署方案,等学到其他技术打算再升级部署方案)。
1、项目分析
(1)我的tomcat项目有配置文件,首先我要把配置文件使用docker config create命令(从文件或STDIN创建配置文件作为内容)创建配置文件在docker swarm 容器管理中使用,避免每次上传都要修改配置文件
(2)我的tomcat项目有上传目录,我必须要把上传目录挂载到外部使用,不然部署新版本重新启动容器我的上传文件都被清除了
(3)数据库也要挂载到外部文件夹,也是同样的问题,重新部署mysql的时候避免数据丢失
搞清楚我的目的后,开始部署工作
2、首先我们先把war包打成tomcat启动的镜像(安装docker很简单,上网查一下很多的)
docker pull tomcat //默认下载最新的tomcat版本,你也可以指定tomcat版本
-
我的文件目录
-
创建打包的工具类 build-image.sh
#!/bin/bash
# usage:
# ./build-image
mkdir $1 //创建一个版本文件夹
mv $2 $1/ //把war包移到版本文件夹下保存起来作数据备份,有问题可以翻出来检查
cp Dockerfile $1/ //把外部的Dockerfile移进来作数据备份,有问题可以翻出来检查
cd $1 //进入版本文件夹
unzip $2 -d blackberry //解压war包
docker build -t black-web:$1 . //然后在文件夹里面进行镜像构建
启动的脚本命令先赋予脚本权限
chmod u+x build-image.sh
再执行命令
./build-image.sh 1.0.1 blackberry.war (代表脚本的2个参数,1.0.1代表版本号,可以是1.0.2,1.0.3,blackberry.war代表我的项目war包)
主要是以后怕有问题可以翻看资料,所以自己做了数据备份
-
创建Dockerfile
FROM tomcat:last
RUN rm -rf /usr/local/tomcat/webapps //清除容器webapps的所有文件
RUN mkdir -p /usr/local/tomcat/webapps/blackberry //创建新的文件夹
COPY ./blackberry /usr/local/tomcat/webapps/blackberry //将宿主机的war解压出来的文件拷贝到容器中
3、编辑docker-compose.yml
version: '3.7'
services:
fl_mysql:
restart: always
image: mysql:5.7.22
ports:
- 33306:3306 //自己使用的开放外部端口测试用,正式上线环境建议开个白名单,就不要暴露端口了
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: root
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
--max_allowed_packet=128M
--sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
volumes:
- ./fl-mysql:/var/lib/mysql //挂载本地目录
- /etc/localtime:/etc/localtime:ro
fl_tomcat:
image: black-web:1.0.1 //刚刚上面打包的镜像
configs:
- source: black-config //这个要使用docker config create 创建外部配置文件,下面有介绍
target: /usr/local/tomcat/webapps/blackberry/WEB-INF/classes/config/application.yml //替换掉配置文件
depends_on:
- fl_mysql //代表先运行mysql镜像
volumes:
- black-web:/usr/local/tomcat/webapps/blackberry //将项目挂载到外部文件目录,下面有介绍
- /home/docker/black-userfiles:/usr/local/tomcat/webapps/blackberry/userfiles //将上传的文件夹挂载到外部目录
- /etc/localtime:/etc/localtime:ro
nginx:
image: nginx
depends_on:
- fl_tomcat
ports:
- 8773:8773
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf //将nginx.conf挂载到外部目录
- ./nginx/conf.d:/etc/nginx/conf.d //将conf.d 挂载到外部目录
- ./nginx/www:/www //将www 挂载到外部目录,自己的目录结构,你想怎样挂载你有你的想法
- /etc/localtime:/etc/localtime:ro
configs:
black-config:
external: true
volumes:
black-web:
external: true
-
docker config create创建配置文件
主要在docker swarm 容器管理中使用
docker swarm init
docker config create black-config /home/docker/black-config/application.yml
-
docker volume create black-web
命令创建目录,默认路径在/var/lib/docker/volumes/black-web/_data",可以自行查看
-
nginx配置我只修改了nginx/conf.d的default.conf
server {
listen 8773; //监听8773端口
server_name fl_tomcat;
location /blackberry {
proxy_pass http://fl_tomcat:8080/blackberry; //容器名称:端口号/包名称
proxy_set_header Host $host:8773; /
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Client-Verify SUCCESS;
proxy_set_header X-Client-DN $ssl_client_s_dn;
proxy_set_header X-SSL-Subject $ssl_client_s_dn;
proxy_set_header X-SSL-Issuer $ssl_client_i_dn;
}
}
-
MYSQL启动后你要导入自己的mysql文件,在重启一下服务,数据库导入没有写
-
具体的挂载目录
4、单机版使用docker stack
-
在swarm manager节点操作
docker swarm init
-
在manager节点部署服务:
docker stack deploy black --compose-file=docker-compose.yml //docker-compose.yml所处的路径,我运行这命令在它的当前目录
测试了一下启动没问题<_>
4、更新war包版本
-
更新镜像的工具类 deploy-release.sh
#!/bin/bash
docker service update --image black-web:$1 black_black-web
例如:
./deploy-release.sh 1.0.1 //传入版本号更新 1.0.1是镜像的版本