zoukankan      html  css  js  c++  java
  • 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文件的是否编写格式正确
  • 相关阅读:
    不足百行代码 实体数组转DataTable通用类
    【翻译】WEB安全设计规范(4.1)
    也为读者说几句(兼为什么要骂烂书译者)
    重用之前应仔细分析问题用错轮子有感
    最长代码有多长:不符[单一职责原则(SRP)]的常见设计
    "千里之堤毁于蚁穴"重点项目不能交付之谜(一)泥淖中的验收测试
    企业快速开发框架基于配置文件
    从面试题看高级软件工程师需要哪些技艺
    面试英语【转】
    测试
  • 原文地址:https://www.cnblogs.com/liumengchen-boke/p/11194099.html
Copyright © 2011-2022 走看看