使用 docker compose 管理 java web 項目

一、背景

docker-java-app https://github.com/ChaseDreamBoy/docker-java-app 是由 springboot + mysql + redis 組成的項目。對於 springboot 的 jar 包、mysql、redis,每一個軟件都運行在一個容器中,使用 docker compose 來管理這三個容器。

二、文件結構

把 docker compose 組成內容定義到一個文件目錄中,方便統一管理(僅供參考):

docker-compose-structure

其中各個文件夾與文件的作用是:

  • 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 程序鏡像

  1. 把 jar 包上傳到 app 目錄
  2. 把配置文件上傳到 app 中,方便修改配置
  3. 編寫 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

步驟 :

  1. 在 mysql 目錄下建一個 .sql 均可以, 然後把要執行的 sql 複製到 .sql 文件中
  2. 對該文件執行 sudo chmod +x xxx.sql 命令使其有可執行權限
  3. 把這個文件掛到容器的 /docker-entrypoint-initdb.d/ 目錄
  4. 如果 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 imagesdocker 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章