文章簡介
-
asp.net core webapi容器與Mysql容器互聯(network方式)
-
docker compose方式編排啓動多個容器
asp.net core webapi容器與Mysql容器互聯(network方式)
-- Docker的基礎知識(鏡像,容器,倉庫等概念,還有基本命令)就不再提了,可以從github查看相關中文文檔(https://github.com/yeasy/docker_practice/blob/master/SUMMARY.md)。
- 首先,我們創建一個asp.net core的webapi項目,項目中引入Mysql驅動包(Pomelo.EntityFrameworkCore.MySql)修改startup的ConfigureServices方法配置項;修改appsettings配置文件,添加數據庫連接字符串(server爲mysql容器的名稱)。如下圖所示
- 添加數據庫鏈接上下文(ApplicationDbContext),添加一個AppUser的用戶類,使用EFcore執行數據庫遷移
- 從dockerhub下載mysql5.7.26的鏡像文件(docker pull mysql/mysql-server:5.7.26); 運行一個docker容器實例( docker run -d --name db -p 3306:3306 -e MYSQL_ROOT_PASSWORD=pwd123456 -v /f/docker_volumn/mysql57/data:/var/lib/mysql -v /f/docker_volumn/mysql57/conf:/etc/mysql/conf.d mysql/mysql-server:5.7.26); 進入剛創建的容器(docker exec -it db bash),通過root用戶登錄mysql,添加一個lmc ,訪問權限爲%的用戶(這裏和我們api項目的連接字符串用戶匹配,因爲mysql默認root用戶訪問權限是localhost的)
- 現在我們在api項目中訪問mysql,從user表裏面查詢一個用戶然後返回。修改我們的Values控制器,查詢一個用戶。然後在我們的startup類中,程序啓動時候,初始化一個用戶,如下圖所示:
- 接下來編寫我們asp.net core 的docker file,如下圖所示(註釋寫的很清楚了)
1 FROM mcr.microsoft.com/dotnet/core/sdk:2.2 as build-env 2 # code目錄 3 WORKDIR /code 4 5 #項目拷貝至code 6 COPY *.csproj ./ 7 RUN dotnet restore 8 9 # #代碼拷貝至code 10 COPY . ./ 11 # #發佈文件在code/out文件夾 12 RUN dotnet publish -c Release -o out 13 # #找到runtime 14 FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 15 # #新建一個目錄app 16 WORKDIR /app 17 # #code目錄發佈的代碼文件放到app 18 COPY --from=build-env /code/out ./ 19 # 輸出到80端口 20 EXPOSE 80 21 ENTRYPOINT [ "dotnet","UserApi.dll" ]
- 將api項目打包成docker鏡像(docker build -t lmc/aspnetcore:prod .);將lmc/aspnetcore 鏡像運行一個容器實例(docker run -d -p 5004:80 -name myuserapi lmc/userapi:prod)。
- 此時我們的api容器是無法連接到我們的Mysql容器的。這裏我們使用network做爲互聯方式(https://github.com/yeasy/docker_practice/blob/master/network/linking.md)。我們創建一個名爲mybridge的network (docker network create -d bridge mybridge)。可以用inspect看到network的網關爲172.18.0.1
- 我們把我們的api容器與mysql容器都連接到mybridge容器(docker network connect mybridge myuserapi;docker network connect mybridge db) ,此時查看我們的mysql容器和userapi容器詳細信息都多了一項mybridge
- 此時訪問我們api容器,就可以返回初始化寫入的數據了。這裏有幾個點要注意下:
- api項目的數據庫連接字符串要爲mysql容器的名稱
- 我們可以進入api容器(docker exec -it myuserapi bash) ping mysql容器來驗證是否網絡互連(需要apt-get update && apt-get install iputils-ping )
- 假如需要修改鏈接字符串可以在api容器中安裝vim
- 我的本機測試因爲裝有mysql,所以啓動db(mysql容器)時候端口映射到3308
docker compose 編排啓動多個容器
- docker compose項目是docker官方開源項目,負責對Docker容器幾羣的快速編排。Compose中有兩個概念 :
- 服務 (
service
):一個應用的容器,實際上可以包括若干運行相同鏡像的容器實例(例如我們的demo中userapi 和 db)。 - 項目 (
project
):由一組關聯的應用容器組成的一個完整業務單元,在docker-compose.yml
文件中定義 (userapi和db加起來爲一個項目)。
- 服務 (
- 我們在network的基礎上修改,首先,編寫dockercompose:(註釋很清楚),這裏有一點注意下,我們在mysql容器運行時候,執行一個sql腳本
-
1 version: '3' 2 services: 3 db: 4 image: mysql/mysql-server:5.7.26 #鏡像 5 container_name: db #容器名稱 6 command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci #運行命令,把mysql容器字符集修改爲utf8 7 restart: always 8 ports: 9 - '3308:3306' #端口映射 10 environment: 11 MYSQL_ROOT_PASSWORD: pwd123456 12 MYSQL_USER: lmc 13 MYSQL_PASSWORD: pwd123456 14 volumes: 15 - /d/docker/beta/mysqlcompose-init:/docker-entrypoint-initdb.d #資料卷掛載,mysql容器執行時候會執行絕對路徑/d/docker/beta/mysqlcompose-init下的sql文件 16 web: 17 build: . 18 container_name: 'aspnetcore' 19 ports: 20 - '8003:80' 21 depends_on: #啓動web之前,檢查依賴項,先啓動db 22 - db
- compose構建項目(docker-compose build),我們的compose項目中有兩個service,一個userapi,一個db,userapi依賴於db
- compose創建/啓動服務,關聯容器 (docker-compose up);(這裏需要把第一步中的db容器刪除掉,否則會重名);我們可以看到,兩個容器已經運行
-
我們來看一下生成的network
- 最後,訪問下api的返回用戶數據的端口
- 注意點,和network的解決方案差不多,假如mysql連不上的話,去api容器中ping一下,telnet一下;注意compose.yml文件的是否編寫格式正確