docker compose部署springboot+mysql

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地址。

以上。

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