PS:小白最近剛使用docker進(jìn)行tomcat的項目部署铣缠,后面學(xué)習(xí)使用docker-compose谚咬,再后面看到docker stack啟動docker-compose鹦付,技術(shù)迭代的過程真的很有意思,下面講述一下具體我的tomcat項目部署的配置择卦、方法和思路(個人的部署方案敲长,等學(xué)到其他技術(shù)打算再升級部署方案)。
1秉继、項目分析
(1)我的tomcat項目有配置文件祈噪,首先我要把配置文件使用docker config create命令(從文件或STDIN創(chuàng)建配置文件作為內(nèi)容)創(chuàng)建配置文件在docker swarm 容器管理中使用,避免每次上傳都要修改配置文件
(2)我的tomcat項目有上傳目錄尚辑,我必須要把上傳目錄掛載到外部使用辑鲤,不然部署新版本重新啟動容器我的上傳文件都被清除了
(3)數(shù)據(jù)庫也要掛載到外部文件夾,也是同樣的問題杠茬,重新部署mysql的時候避免數(shù)據(jù)丟失
搞清楚我的目的后月褥,開始部署工作
2弛随、首先我們先把war包打成tomcat啟動的鏡像(安裝docker很簡單,上網(wǎng)查一下很多的)
docker pull tomcat //默認(rèn)下載最新的tomcat版本宁赤,你也可以指定tomcat版本
image.png
-
我的文件目錄
image.png
-
創(chuàng)建打包的工具類 build-image.sh
#!/bin/bash
# usage:
# ./build-image
mkdir $1 //創(chuàng)建一個版本文件夾
mv $2 $1/ //把war包移到版本文件夾下保存起來作數(shù)據(jù)備份舀透,有問題可以翻出來檢查
cp Dockerfile $1/ //把外部的Dockerfile移進(jìn)來作數(shù)據(jù)備份,有問題可以翻出來檢查
cd $1 //進(jìn)入版本文件夾
unzip $2 -d blackberry //解壓war包
docker build -t black-web:$1 . //然后在文件夾里面進(jìn)行鏡像構(gòu)建
啟動的腳本命令先賦予腳本權(quán)限
chmod u+x build-image.sh
再執(zhí)行命令
./build-image.sh 1.0.1 blackberry.war (代表腳本的2個參數(shù),1.0.1代表版本號决左,可以是1.0.2愕够,1.0.3,blackberry.war代表我的項目war包)
主要是以后怕有問題可以翻看資料佛猛,所以自己做了數(shù)據(jù)備份
-
創(chuàng)建Dockerfile
FROM tomcat:last
RUN rm -rf /usr/local/tomcat/webapps //清除容器webapps的所有文件
RUN mkdir -p /usr/local/tomcat/webapps/blackberry //創(chuàng)建新的文件夾
COPY ./blackberry /usr/local/tomcat/webapps/blackberry //將宿主機(jī)的war解壓出來的文件拷貝到容器中
3链烈、編輯docker-compose.yml
version: '3.7'
services:
fl_mysql:
restart: always
image: mysql:5.7.22
ports:
- 33306:3306 //自己使用的開放外部端口測試用,正式上線環(huán)境建議開個白名單挚躯,就不要暴露端口了
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 創(chuàng)建外部配置文件,下面有介紹
target: /usr/local/tomcat/webapps/blackberry/WEB-INF/classes/config/application.yml //替換掉配置文件
depends_on:
- fl_mysql //代表先運(yùn)行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 掛載到外部目錄,自己的目錄結(jié)構(gòu)强衡,你想怎樣掛載你有你的想法
- /etc/localtime:/etc/localtime:ro
configs:
black-config:
external: true
volumes:
black-web:
external: true
-
docker config create創(chuàng)建配置文件
image.png
主要在docker swarm 容器管理中使用
docker swarm init
docker config create black-config /home/docker/black-config/application.yml
-
docker volume create black-web
命令創(chuàng)建目錄,默認(rèn)路徑在/var/lib/docker/volumes/black-web/_data",可以自行查看
-
nginx配置我只修改了nginx/conf.d的default.conf
server {
listen 8773; //監(jiān)聽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啟動后你要導(dǎo)入自己的mysql文件码荔,在重啟一下服務(wù)漩勤,數(shù)據(jù)庫導(dǎo)入沒有寫
-
具體的掛載目錄
image.png
4、單機(jī)版使用docker stack
-
在swarm manager節(jié)點(diǎn)操作
docker swarm init
image.png
-
在manager節(jié)點(diǎn)部署服務(wù):
docker stack deploy black --compose-file=docker-compose.yml //docker-compose.yml所處的路徑缩搅,我運(yùn)行這命令在它的當(dāng)前目錄
image.png
測試了一下啟動沒問題<_>
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是鏡像的版本