docker構建打包java項目
簡介
本項目用于 研究和實踐 docker的工作流部署發布
查看github源碼
技術棧
- spring-web (RESTAPI 請求交互)
- redis (用于實驗 多容器通信)
- maven
docker常用命令
docker --help
可查看幫助指令
查看 鏡像列表
docker image ls
查看 容器列表
docker container ls
查看 日志
docker logs [容器containerId]
docker部署
1. docker創建網絡空間,以便多容器在同網絡里可通信
docker network create web-demo-net
2. 獲取redis鏡像
docker pull redis:latest
-
:latest
拉取最新版鏡像
3. redis鏡像運行成容器
docker run -d -p 6379:6379 \
--name web-demo-redis \
--network web-demo-net \
--network-alias redis-net \
-v redis-data:/data \
redis:latest
-
-d
后臺啟動 -
-p 6379:6379
容器的端口(:后面的6379) 映射 成 宿主機的端口(:前面的6379) -
--name
給容器命名 -
--network
指定使用的網絡空間,同網絡空間的容器才可通信 -
--network-alias
指定本容器所使用網絡地址的別名:redis-net
, web項目配置文件中的redis連接host即為redis-net
,(很重要!相當于分配獨有有ip地址) -
-v
指定數據卷映射,其中redis-data
是創建的數據卷名稱,實際物理數據在宿主機,邏輯數據在容器中。其中/data
為容器應用生成的數據路徑 -
redis:latest
指定生成容器所使用的鏡像名和版本標簽
4. docker打包web項目為鏡像
Dockfile
build文件編寫
# 獲取運行環境
FROM openjdk:17
# 把本地文件目錄 解析到 容器目錄(容器若沒有會自動創建文件夾)
ADD ./target/web-demo.jar /usr/local/workspace/web-demo/web-demo.jar
# 設置工作目錄空間,方便后續操作指令
WORKDIR /usr/local/workspace/web-demo
# 執行指令
CMD java -jar web-demo.jar
打包命令
docker buildx b -t web-demo:v1 .
-
-t
命名鏡像名稱,:v1
指定版本標簽tag -
.
構建目錄為當前目錄
5. web-demo鏡像運行成容器
docker run -d -p 8080:8080 --name web-demo --network web-demo-net web-demo:v1
6. 宿主機訪問web應用測試
- localhost:8080
- localhost:8080/hello
docker備份容器數據
利用中轉容器 目錄掛載 獲取 數據卷
docker run --rm \
--volumes-from web-demo-redis \
-v ~/backup:/backup \
debian \
tar cvf /backup/redis-data.tar /data
-
--rm
作為臨時容器啟動,運行后即刪除容器 -
--volumes-from
數據卷掛載來源web-demo-redis
-
-v
數據卷映射目錄,冒號:前的~/backup
是宿主機的絕對路徑,不再是上文中redis-data
模式新建的數據卷名稱,它用來真正接收壓縮的備份文件。冒號:后的/backup
是中轉linux系統的目錄,用來中轉臨時保存容器的壓縮數據。 -
debian
是指定的臨時系統鏡像名,可使用其他系統鏡像,如ubuntu
等。 -
tar
linux系統常用解壓縮工具,這里是把 復制的數據卷目錄/data
壓縮為/backup/redis-data.tar
已經備份結束,可在宿主機的
~/backup
目錄查看到壓縮的備份文件redis-data.tar
docker恢復容器數據
測試時,可docker volume rm redis-data
刪除數據卷,來模擬丟失數據
利用中轉容器 目錄掛載 獲取 備份文件
docker run --rm \
--volumes-from web-demo-redis \
-v ~/backup:/backup \
debian \
bash -c "cd /data/ && tar xvf /backup/redis-data.tar --strip 1"
-
--strip 1
表示tar工具解壓時去掉前面1層目錄,這里去掉了tar壓縮包里的/data/目錄,根據壓縮時確定層級路徑是否需要此參數
備份已完成, dump.rdb 已經是舊數據文件
docker compose 一件啟動應用
上文手動啟動redis容器,再啟動web-demo容器,docker compose 可以 實現自動化一鍵啟動所以服務容器
修改網絡空間配置
上文中是手動配置web容器和redis容器的網絡空間 web-demo-net, docker compose 無需配置,自動會在同個網絡內,所以去掉web項目中的配置
修改 application-prod.yml
的 host: redis-net
為 compose.yaml
里設置的服務名redis
spring:
data:
redis:
# host: redis-net
host: redis
port: 6379
編寫 compose.yml
services:
web-demo:
# 當前目錄下的Dockerfile構建
build: .
ports:
- '8080:8080'
# 也給web項目一個數據卷
volumes:
- web-demo-data:/usr/local/workspace/web-demo
environment:
- TZ=Asia/Shanghai
redis:
image: 'redis:latest'
volumes:
- redis-data:/data
environment:
- TZ=Asia/Shanghai
volumes:
web-demo-data:
redis-data:
啟動 compose
在 compose.yaml目錄
docker compose up