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)。mysql

  • 首先,咱們建立一個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 編排啓動多個容器git

  • 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容器刪除掉,不然會重名);咱們能夠看到,兩個容器已經運行

  • 咱們來看一下生成的networkgithub

  • 最後,訪問下api的返回用戶數據的端口
  • 注意點,和network的解決方案差很少,假如mysql連不上的話,去api容器中ping一下,telnet一下;注意compose.yml文件的是否編寫格式正確
相關文章
相關標籤/搜索