於Docker部屬mysql,並建立且部屬連結mysql的.net core專案。
Docker是一種目前相當火紅的虛擬化技術,有著輕量化且易於移轉的特性,相對於常見的虛擬機的技術,Docker更為方便且迅速。
此篇文章將在Docker上建立一個MySQL server,並將.net core專案建置為Docker Image,再透過Docker Compose 快速地架起DB與API的Container,建立出兩個互相連通的服務。
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
此指令將會下載tag為latest,也就是最新版本的MySQL Image,下載完畢後於指令輸入
$ docker image ls
此指令會列出目前所有已下載或建立的image檔,可看到MySQL Image,其tag為 latest。至此,MySQL Image已經下載完畢。再來就是使用這個image建立一個屬於MySQL的Container。
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,在這次的範例中,tag為latest。
建立完畢後,輸入指令
$ 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即可,以本次測試的主機而言,IP為192.168.99.100。
5. .net core專案部屬為自訂的image
Docker的Image不只可以從遠端下載,也可以透過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專案)