1、宿主機爲安裝了ubuntu22.04系統的虛擬機。docker和docker-compose的安裝過程略過。
2、先看下項目結構:
項目爲普通的springboot項目,只有一個測試接口,功能是從數據庫表裏查詢數據。
Dockerfile和docker-compose.yml文件在項目根目錄下。
3、打jar包
mvn clean install
生成的jar包在target目錄下,名爲demo-0.0.1-SNAPSHOT.jar。
4、編寫Dockerfile文件,直接貼出文件內容:
FROM openjdk:11
ADD target/demo-0.0.1-SNAPSHOT.jar /myapp.jar
ADD src/main/resources/application.yml /application.yml
ENTRYPOINT ["java","-jar","/myapp.jar"]
From就是從哪個鏡像開始構建,這裏使用openjdk:11, openjdk是鏡像名稱,11是版本號。
ADD target/demo-0.0.1-SNAPSHOT.jar /myapp.jar, 是把target目錄下的jar包,複製到容器的根目錄下,並重命名爲myapp.jar。
ADD src/main/resources/application.yml /application.yml,是把項目的配置文件,複製到容器根目錄下。
ENTRYPOINT ["java","-jar","/myapp.jar"], ENTRYPOINT是容器啓動後執行的命令,這裏是執行jar包,啓動項目。
5、編寫docker-compose.yml
version: '3' services: mysql: image: mysql:8.0.26 # mysql鏡像,版本爲8.0.26 container_name: mysql # 容器名稱,不是必須配置 restart: always # restart配置爲always volumes: - dbdata:/var/lib/mysql # 掛載目錄,防止容器被停止並刪除後,數據丟失 environment: MYSQL_DATABASE: demo # 創建一個空的數據庫 MYSQL_ROOT_USER: root # root角色用戶 MYSQL_ROOT_PASSWORD: 123456 # root用戶密碼 MYSQL_ROOT_HOST: '%' # 允許遠程連接 TZ: Asia/Shanghai # 設置時區 app: build: . container_name: app restart: always ports: - 8082:8082 depends_on: - mysql volumes: dbdata:
versrion是docker-compose的版本;
services表示服務列表,這裏有兩個服務,一個mysql, 一個app;
mysql服務添加了掛載目錄,格式爲 - 宿主機目錄:容器目錄,宿主機目錄可以寫絕對路徑,相對路徑以及本例中的這種寫法,直接寫dbdata,則這個目錄位置在docker默認的工作目錄下。
通過sudo docker ps,可以看到mysql容器的id。然後通過sudo docker inspect mysql容器id,可以看到mysql容器的詳情,注意其中的Mounts項:
mysql服務沒有配置端口映射,使用的是默認的3306。
6、application.yml中修改數據庫連接信息。
用戶名和密碼以及數據庫名稱,用第5步中mysql服務的配置信息。需要注意的是這裏的主機,用的是mysql,也就是docker-compose.yml文件中,mysql服務的服務名。
初次啓動時,數據庫是空的,需要登錄進去,建表。
sudo docker exec -it mysql容器id /bin/bash
進入容器後,執行:
mysql -uroot -p
輸入密碼,進入msyql命令行,然後
use 數據庫名稱;
切換到指定數據庫,執行建表命令。最後執行quit命令退出mysql, 執行exit退出容器。
看到網上有許多無法連接數據庫的問題,基本都是卡在這裏。
然後有許多文章給出解決方案,基本丟失配置自定義的network,或者設置network_mode,我本人都試過了,沒有解決問題。按照上述配置,就可以了。
docker-compose啓動,會自動創建一個網絡,一個docker-compose內的多個服務,共享這個網絡,多個服務間通過域名或者說服務名,就可以訪問。
如果這裏啓動的mysql服務,還需要被別的服務器訪問,那就需要配置具體的ip地址。
以上。