一、背景
docker-java-app
https://github.com/ChaseDreamBoy/docker-java-app 是由 springboot + mysql + redis 組成的項目。對於 springboot 的 jar 包、mysql、redis,每一個軟件都運行在一個容器中,使用 docker compose 來管理這三個容器。
二、文件結構
把 docker compose 組成內容定義到一個文件目錄中,方便統一管理(僅供參考):
其中各個文件夾與文件的作用是:
- app : 存放 jar 包與, 定義鏡像的 Dockerfile 文件
- application.properties : springboot 裝配文件, 方便更改一些參數
- Dockerfile : 把這個 java 程序打包成鏡像的 Dockerfile 文件
- docker-java-app-1.0.0.jar : jar 包
- bin : 自己編寫的啓動腳本方便快速的啓動 docker compose
- compose : docker compose 操作腳本
- compose : docker compose 的定義目錄, 包含配置文件 docker-compose.yml
- docker-compose.yml : docker compose 配置文件
- mysql : mysql 相關的文件
- data : 用於存放 mysql 數據
- init : 存放 mysql 初始化 sql
- init.sql : mysql c初始化建數據庫,建表sql
- my.cnf : mysql 的配置文件
- redis : redis 相關的文件
- data : 存儲 redis 持久的 rdb 文件
- redis.conf : redis 配置文件
三、構建 java 程序鏡像
- 把 jar 包上傳到 app 目錄
- 把配置文件上傳到 app 中,方便修改配置
- 編寫 Dockerfile
Dockerfile 的內容如下 :
# 基礎鏡像
FROM java:8
# 指定作者
MAINTAINER xiaohe
# 把文件複製到鏡像中, 路徑是相對於 Dockerfile
ADD docker-java-app-1.0.0.jar /app/docker-java-app-1.0.0.jar
ADD application.properties /app/application.properties
# 容器內部程序啓動命令
ENTRYPOINT ["java","-jar","-Dspring.config.location=/app/application.properties","/app/docker-java-app-1.0.0.jar"]
四、redis 相關
如果需要把 redis 持久化數據複製出來,就把 redis 的持久化目錄掛載到宿主機就好,我這裏是掛載在 redis 目錄下的 data 目錄裏面的,掛載是在 docker-compose.yml 文件中定義的。
如果需要自定義配置文件的話,可以從 https://github.com/antirez/redis/blob/5.0.7/redis.conf 複製一份到 redis 目錄並掛載,修改需要的選項,在啓動的時候指定配置文件就好了。
五、mysql 相關
mysql 的持久與 redis 一樣,mysql 的配置文件,需要自己自定義一個 my.cnf
文件,並掛在容器中 mysql 啓動時掃描的目錄中。
對於在 mysql 中初始化 sql, 可以參考 : https://github.com/docker-library/docs/tree/master/mysql#initializing-a-fresh-instance
步驟 :
- 在 mysql 目錄下建一個
.sql
均可以, 然後把要執行的 sql 複製到.sql
文件中 - 對該文件執行
sudo chmod +x xxx.sql
命令使其有可執行權限 - 把這個文件掛到容器的
/docker-entrypoint-initdb.d/
目錄 - 如果 mysql 的數據文件夾是掛載的宿主機, 需要保證宿主機裏面的數據文件夾是空的, 不然不會執行初始化sql
六、編寫 docker-compose.yml
其內容大概如下:
version: "3"
services:
redis:
# 鏡像
image: redis:5.0.7
# 指定容器名
container_name: redis
volumes:
# 掛載 redis 配置文件,與 rdb 文件目錄
- ../redis/redis.conf:/etc/redis/redis.conf:ro
- ../redis/data:/data
# 啓動命令
command: ["redis-server", "/etc/redis/redis.conf"]
# 映射端口
ports:
- "6379:6379"
mysql:
image: mysql:5.7.28
container_name: mysql
volumes:
- ../mysql/my.cnf:/etc/mysql/my.cnf:ro
- ../mysql/data:/data/mysql
# 定義 mysql 初始化 sql, 參照 : https://github.com/docker-library/docs/tree/master/mysql#initializing-a-fresh-instance
# 注意 : 本地目錄的 .sh, .sql, .sql.gz 文件需要先添加執行權限
# 由於這裏的數據文件夾是掛載的宿主機, 需要保證宿主機裏面的數據文件夾是空的, 不然不會執行初始化sql
- ../mysql/init/:/docker-entrypoint-initdb.d/
environment:
# 定義 mysql root 用戶的密碼, 參照 : https://github.com/docker-library/docs/tree/master/mysql#environment-variables
MYSQL_ROOT_PASSWORD: 123456
ports:
- "3306:3306"
docker_java_app:
build:
context: ../app
# 這裏的路徑是相對於 content 的
dockerfile: ./Dockerfile
container_name: my-app
volumes:
- ../app/:/app
ports:
- "8082:8082"
# 定義容器 redis 與 mysql 啓動後在啓動這個容器
depends_on:
- redis
- mysql
七、輔助腳本
這時候需要運行的話,可以在文件 docker-compose.yml
同目錄運行命令 :
$ sudo docker-compose -p my-app up -d
但是可以編寫腳本,方便操作,在 bin 目錄新建文件 compose
,其內容如下 :
#!/bin/bash
root=$(cd `dirname $0`; dirname `pwd`)
# -p 後面的參數是容器名前綴
docker-compose -p my-app -f ${root}/compose/docker-compose.yml "$@"
使用命令 sudo chmod +x compose
給腳本 compose
添加可執行權限。
然後一些操作命令如下:
# 啓動組件
sudo ./bin/compose up -d
# 停止組件
sudo ./bin/compose down
# 查看組件的日誌
sudo ./bin/compose logs 容器名
使用 sudo ./bin/compose up -d
命令啓動後,就可以使用 sudo docker images
和 docker ps
,就可以看到新添加的鏡像和容器了。
如果構建鏡像錯誤,在命令 sudo ./bin/compose up -d
的控制檯中就可以看到,但是如果 docker ps
中沒有想要的容器,就需要使用 sudo ./bin/compose logs 容器名
或者 sudo docker logs 容器名
查看日誌中的錯誤信息並做處理。
如果一切都沒有問題,那麼就可以訪問 springboot 應用了。
八、資料
docker compose 示例 : https://github.com/ChaseDreamBoy/docker-java-app/tree/master/doc/docker-compose
java 測試應用 : https://github.com/ChaseDreamBoy/docker-java-app
docker compose : https://blog.csdn.net/qq_37502106/article/details/103547346