asp.net core容器&mysql容器network互聯 & docker compose方式編排啓動多個容器

文章簡介

  • 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" ]
    asp.net core docker file
  • 將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 
    docker-compose.yml

  • compose構建項目(docker-compose build),我們的compose項目中有兩個service,一個userapi,一個db,userapi依賴於db
  • compose創建/啓動服務,關聯容器 (docker-compose up);(這裏需要把第一步中的db容器刪除掉,否則會重名);我們可以看到,兩個容器已經運行

  • 我們來看一下生成的network

  • 最後,訪問下api的返回用戶數據的端口
  • 注意點,和network的解決方案差不多,假如mysql連不上的話,去api容器中ping一下,telnet一下;注意compose.yml文件的是否編寫格式正確
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章