Docker mysql

於Docker部屬mysql,並建立且部屬連結mysql的.net core專案。

王煜翔 2019/12/20 18:28:04
24432

Docker是一種目前相當火紅的虛擬化技術,有著輕量化且易於移轉的特性,相對於常見的虛擬機的技術,Docker更為方便且迅速。

此篇文章將在Docker上建立一個MySQL server,並將.net core專案建置為Docker Image,再透過Docker Compose 快速地架起DBAPIContainer,建立出兩個互相連通的服務。

 

1.  下載Docker

如果你的作業系統為Windows 10 64-bit: Pro, Enterprise, Education (Build 15063 或更新的版本),可直接下載Docker Desktop for Windows

下載路徑: https://docs.docker.com/docker-for-windows/install/

點擊 Download from Docker Hub

點擊Download Docker Desktop for Windows,下載完成後安裝。

 

 

 

如果作業系統並非上述的版本,則需下載Docker Toolbox On Windows

 

下載路徑: https://docs.docker.com/toolbox/toolbox_install_windows/#step-2-install-docker-toolbox

點擊 Toolbox Releases後,下載所需版本的.exe檔,下載完成後安裝。

 

2.  下載 MySQL Image

Docker安裝完畢後,開啟Windows PowerShell,並於指令中輸入

$ docker pull MySQL:latest

此指令將會下載taglatest,也就是最新版本的MySQL Image,下載完畢後於指令輸入

$ docker image ls



此指令會列出目前所有已下載或建立的image檔,可看到MySQL Image,其taglatest。至此,MySQL Image已經下載完畢。再來就是使用這個image建立一個屬於MySQLContainer

 

3.  使用指令建立Cotainer

要建立並運行一個MySQL Container,輸入以下指令

$ docker run --name some-MySQL -e MYSQL_ROOT_PASSWORD=my-secret-pw -d MySQL:tag

上述的指令可以將Image建立成一個運行中的container

some-MySQL 是給即將建立的container的命名,

my-secret-pw MySQL root使用者的密碼設定,
tag
是指定使用什麼版本的MySQL Image,在這次的範例中,taglatest。

 

建立完畢後,輸入指令

$ docker ps

此指令可以列出目前運行中的Container,可看到剛剛建立的Container已經開始運行。

 

4.  使用Compose檔建立Container

除了透過指令建立一個可運行的Container以外,也可透過Compose檔建立。

一個Docker Compose檔就類似一個設定好的巨集,可以透過一個Compose檔開啟多個Container,本次文章最後將一次開啟兩個container,現在就先從MySQL開始吧。

建立一個docker-compose.yml的檔案,並於檔案中輸入以下內容

version: "3"
services:
  db:
    image: MySQL
    environment:
      MYSQL_ROOT_PASSWORD: "123456"
      MYSQL_ALLOW_EMPTY_PASSWORD: 1
    ports:
      - "3306:3306"

存檔後,將Windows PowerShell的路徑移至yml檔所在之路徑,並輸入以下指令

$ docker-compose up

輸入上述指令會讓docker根據compose檔的設定去開啟container,執行完畢後我們便已經建立了一個可運行的MySQL Container,現在即可用MySQL Workbench連結至我們所建立的Container,也可以在上面做各種的資料庫操作了。

Ps:部分Windows環境無法直接使用localhost連接Docker所建立出來的Container,如遭遇此問題,需透過以下指令

$ docker-machine env

確認Docker機器所分配到的IP,並將localhost改為該IP即可,以本次測試的主機而言,IP192.168.99.100

 

 

5. .net core專案部屬為自訂的image

DockerImage不只可以從遠端下載,也可以透過DockerFile來部屬自己專屬的Image檔,接下來會說明如何將一個.net core專案部屬為自訂的Image

 

建立一個將上述MySQL Container作為資料庫的.net core專案,本次教學將著重於Docker的操作,.net core專案的建立過程便不贅述。建立完畢後,於專案的 .sln檔所在的路徑下建立一個DockerFile

 

並於檔案中輸入

FROM microsoft/dotnet:2.2-sdk AS build
WORKDIR /app

# copy csproj and restore as distinct layers
COPY *.sln .
COPY YourProjectName/*.csproj ./ YourProjectName /
RUN dotnet restore

# copy everything else and build app
COPY YourProjectName /. ./ YourProjectName /
WORKDIR /app/ YourProjectName
RUN dotnet publish -c Release -o out


FROM microsoft/dotnet:2.2-aspnetcore-runtime AS runtime
WORKDIR /app
COPY --from=build /app/ YourProjectName /out ./
ENTRYPOINT ["dotnet", " YourProjectName.dll"]

YourProjectName修改為該專案的名稱,於本次範例中為DockerDemo2

 

並將PowerShell路徑移動至此路徑,並輸入指令

$ docker build -t yourimagename .

yourimagename為此Image所要命名的的名稱,在這次的範例中我們將他叫為dockerdemo

輸入指令後,系統將會依照DockerFile的設定建立一個名為dockerdemo的全新Image

可輸入指令 docker image ls,即可於列表中找到我們新建立好的Image

 

6. 使用Docker Compose一次建立兩個Container

回到第4步中所建立的docker-compose.yml,並將其內容修改為

version: "3"
services:
  web:
    # replace username/repo:tag with your name and image details
    image: dockerdemo
    deploy:
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
    ports:
      - "4000:80"
  db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: "123456"
      MYSQL_ALLOW_EMPTY_PASSWORD: 1
    ports:
      - "3306:3306"

 

service底下將我們剛剛建立好的dockerdemo image加入compose檔中,然後再一次執行指令

$ docker-compose up

可以在執行的內容中看到此次的compose也啟動了web的服務,我們再用Postman打打看api

api可以成功的回傳資料庫中的資料,代表大功告成啦。

 

相關連結:

如何將 ASP.NET Core 2.1 網站部署到 Docker 容器中

 

mysql Docker Official Images Documents

ASP.NET Core使用EF Core操作MySql資料庫(建立.net core專案)

 

王煜翔