使用Docker Compose為ASP.NET Core程式新增MySQL資料庫
本文翻譯自:
Adding MySQL to ASP.NET Core App With Docker Compose
之前的例子中我們將程式進行容器化,本文我們會把MySQL資料庫作為另一個Container,用於程式的訪問。因為現在有很多的容器需要管理,所以介紹一種 Docker Compose工具,該工具可以用於定義並執行多個Container。
本文將會著重介紹以下幾點:
- 什麼是Docker Compose
- 在程式中新增Docker Compose
- 使用Compose建立映象
- 使用Docker Compose新增MySQL資料庫
- Docker-Compose Up/Down示例
什麼是 Docker Compose
Docker Compose是一個用於定義並執行多個Container的工具。
Docker Compose使用Yaml檔案定義服務,然後使用一條指令執行這個服務。當定義好服務後,可以使用 docker-compose up命令執行服務,使用docker-compose down停止服務。
引入Docker Compose的意義在於解決手動管理多個映象的問題,並且有以下優點:
- 在一個宿主機上建立多個隔離的環境
- 在環境內部建立網路
- 保留Containers使用的Volume資料
- 通過快取配置資訊,更新修改的Container
- 可以在Yaml檔案中使用變數,進而對不同的環境自定義不同的配置。
- 使用CI工具(比方說TeamCity)
新增Docker Compose檔案
Compose操作依賴於Yaml檔案,該檔案一般名為docker-compose.yml,並且放在工程檔案的根目錄。
1 version: '3.4' 2 3 services: 4 dockerdeploy: 5 image: imstrive/dockerdeploy 6 ports: 7 - "8080:80"
這是最簡單的Compose檔案,命令的執行操作類似於之前用到的 docker run操作。
之前使用的命令為 docker run --rm -it -p=8080:80 imstrive/dockerdeploy,現在使用 docker -compose up命令。
如上所示,docker-compose.yml檔案包含了很多的指令,這些指令都是針對我們當前的應用,之後我們會新增更多的服務。
如果想讓服務在後臺執行,可以使用 -d 指令:docker-compose up -d,後臺服務的停止使用命令 docker-compose down。
這裡有一點需要注意,如果我們使用 Ctrl + C指令,Compose操作建立的Container和network並不會停止,如果想釋放資源則需要執行 docker-compose down。
使用Compose建立映象
上面的Compose指令使用了已經存在的映象,但是當我們修改了程式或者DockerFile的時候,Compose依然執行的是變化發生前建立的映象。
此時我們需要使用命令 docker build -t imstrive/dockerdeploy . 命令,然後執行docker-compose up才能使這些變更生效。
可以通過修改docker-compose.yml檔案實現以上步驟自動化的需求:
1 version: '3.4' 2 3 services: 4 dockerdeploy: 5 image: imstrive/dockerdeploy 6 build: 7 context: . 8 dockerfile: DockerDeploy/Dockerfile 9 ports: 10 - "8080:80"
新增的命令會根據當前目錄設定上下文資訊,並通過上下文資訊使用Dockerfile建立映象。通過在docker-compose命令中新增 --build 標誌可以強制重新構建映象:
docker-compose up --build
新增MySQL資料庫
1 version: '3.4' 2 3 services: 4 db: 5 image: mysql:5.6 6 environment: 7 MYSQL_RANDOM_ROOT_PASSWORD: longtao 8 MYSQL_DATABASE: LocalTestDB 9 MYSQL_USER: test 10 MYSQL_PASSWORD: longtao 11 volumes: 12 - dbdata:/var/lib/mysql 13 - ./_MySQL_Init_Script:/docker-entrypoint-initdb.d 14 restart: always 15 16 dockerdeploy: 17 depends_on: 18 - db 19 image: imstrive/dockerdeploy 20 build: 21 context: . 22 ports: 23 - "8080:80" 24 25 volumes: 26 dbdata:
如上所示,在docker-compose.yml檔案中添加了資料庫服務。服務的名字也是容器的名字,可以在資料庫連線中使用。
("connectionString": "server=db;port=3306;userid=root;password=longtao;database=LocalTestDB;Charset='gbk';SslMode=None")
在映象執行時對MySQL容器進行配置,並且配置環境變數。
- MYSQL_RANDOM_ROOT_PASSWORD: longtao 設定root使用者的隨機密碼,密碼會在控制檯顯示
- MYSQL_DATABASE: LocalTestDB 建立LocalTestDB資料庫
- MYSQL_USER: test 建立使用者:test
- MYSQL_PASSWORD: longtao test使用者的密碼為:longtao
之後建立了兩個資料卷:一個用於資料庫資料,另一個使用 init.sql初始化資料庫。MySQL的容器使用第一個卷,將資料庫資料儲存在 /var/lib/mysql下。
需要注意的是,資料庫環境變數的配置只在容器第一次初始化的時候發生。配置後如果改變容器需要通過MySQL CLI(進入容器使用命令 docker exec -it <mysql-container-name> bash)。
restart: always可以在Container關掉時立即重啟。
depends_on: -db,使得資料庫的服務最早載入。
Docker-Compose Up/Down
注意
編寫Docker-Compose需要注意每一樣的縮排以及 ":" 後需要有一個空格