1. 程式人生 > >使用Docker Compose為ASP.NET Core程式新增MySQL資料庫

使用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需要注意每一樣的縮排以及 ":" 後需要有一個空格