美文网首页
docker 部署.net webapi 依赖其他服务

docker 部署.net webapi 依赖其他服务

作者: wwmin_ | 来源:发表于2022-07-01 22:26 被阅读0次

    前言:

    当前的服务越来越多的构建在了Docker中,web、api、db、nginx等等都在Docker中构建运行。本文结合实际项目,使用docker-compose工具启动运行服务,配置文件使用docker-compose.yml以及Dockerfile构建镜像的方式,概述了整个使用过程。

    1. 在项目根目录创建Dockerfile

    #See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.
    
    FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
    WORKDIR /app
    EXPOSE 80
    
    FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
    WORKDIR /src
    COPY ["Bionic.Api/Bionic.Api.csproj", "Bionic.Api/"]
    COPY ["Bionic.Basic.Service/Bionic.Base.Service.csproj", "Bionic.Basic.Service/"]
    COPY ["Bionic.Core/Bionic.Core.csproj", "Bionic.Core/"]
    COPY ["Bionic.Device.Service/Bionic.Device.Service.csproj", "Bionic.Device.Service/"]
    COPY ["Bionic.DataAnalysis.Service/Bionic.DataAnalysis.Service.csproj", "Bionic.DataAnalysis.Service/"]
    RUN dotnet restore "Bionic.Api/Bionic.Api.csproj"
    COPY . .
    WORKDIR "/src/Bionic.Api"
    RUN dotnet build "Bionic.Api.csproj" -c Release -o /app/build
    
    FROM build AS publish
    RUN dotnet publish "Bionic.Api.csproj" -c Release -o /app/publish
    
    FROM base AS final
    WORKDIR /app
    COPY --from=publish /app/publish .
    ENTRYPOINT ["dotnet", "Bionic.Api.dll"]
    
    • 放一张项目结构图


      项目结构

    2. 忽略docker构建无关文件

    **/.classpath
    **/.dockerignore
    **/.env
    **/.git
    **/.gitignore
    **/.project
    **/.settings
    **/.toolstarget
    **/.vs
    **/.vscode
    **/*.*proj.user
    **/*.dbmdl
    **/*.jfm
    **/azds.yaml
    **/bin
    **/charts
    **/docker-compose*
    **/Dockerfile*
    **/node_modules
    **/npm-debug.log
    **/obj
    **/secrets.dev.yaml
    **/values.dev.yaml
    LICENSE
    README.md
    

    3. 编写yml配置文件

    这里我单独放到了Deploy目录下,里面配置了docker-compose.yml,也为了放置volumes映射文件,
    docker-compose.yml内容如下

    version: '3.1'
    
    services:
      web_api:
        build:
          context: ../
          dockerfile: Dockerfile
        image: bionic_api
        container_name: bionic_api
        restart: unless-stopped
        environment:                        # 设置环境变量,相当于docker run命令中的-e
          TZ: Asia/Shanghai
          LANG: en_US.UTF-8
        volumes:
          - "./docs:/app/docs"
          - "./logs:/app/logs"
        ports:
          - "5000:80"
        depends_on:
          - postgres_db
        networks:
          - bionic_net
    
      postgres_db:
        image: postgres:14.2
        container_name: postgresql
        volumes:
         - ./pgdata:/var/lib/postgresql/data
        restart: always
        environment:
          POSTGRES_USER: bionic #在此填写postgres的用户名
          POSTGRES_PASSWORD: abc_123! #在此填写posgres的数据库密码
          POSTGRES_DB: bionic_test #在此填写postgres的数据库名,默认是postgres
          TZ: Asia/Shanghai
          LANG: en_US.UTF-8
        ports:
          - "1001:5432"
        networks:
          - bionic_net
    
    networks:
      bionic_net:
        driver: "bridge"
    
    volumes:
      pgdata: {}
    

    注意事项:

      1. 编写web_api时注意 build 的上下文路径,这里要定位到上级跟目录,所有build: context: ../使用的是../相对的上级目录
      1. web_api 的volumes目录应注意确定docker内部的具体位置,可在Dockerfile中查看 workdir路径,我的就是上面Dockerfile中的 /app路径,也可使用docker attach container_name命令进入容器中查看实际的位置
      1. 使用depends_on依赖其他服务,只有依赖的服务启动成功后,该服务才会开始启动。如上web_api中使用depends_on中依赖了postgres_db,故web_api服务在db服务后面启动
      1. 将web_api的网络与db的网络联系起来,因每个服务都有一个独立的虚拟网卡,各自并不能访问。docker内部实现了使用服务名的方式访问不同的Service,前提是networks都映射到同一个网卡上。
        在yml文件根级放上
    ...
    networks:
      bionic_net:
        driver: "bridge"
    

    然后在每个Service中都配置相同的networks

    services:
      xxx:
        ....
        networks:
          - bionic_net
    

    这样配置之后web_api服务就可以使用{服务名}:{容器内部端口号}的形式访问其他服务了
    如我的appsettings.json的配置

    {
    "Postgresql": "Host=postgres_db;Port=5432;Database=bionic_test;Username=bionic;Password=abc_123!",
    }
    

    【重点】代码配置这里一定要注意Port是容器内部端口号,不是外部的映射端口号哦。如我的db端口号配置为ports: - 1001:5432,1001是外部的宿主机端口号,5432是容器内部端口号。

    4. 运行docker

    将命令行定位到docker-compose.yml文件目录位置

    docker-compose up -d
    

    初次运行up会自动构建build,但是如果有代码改动,需要重新build,命令如下

    docker-compose build
    

    然后在up起来即可

    docker-compose up -d
    

    5. 查看docker中的网络

    docker network ls
    
    NETWORK ID     NAME                         DRIVER    SCOPE
    095175a509bf   bridge                       bridge    local
    1c25f2553faf   deploy_bionic_net            bridge    local
    40fa153f0d09   host                         host      local
    1d5667a6d547   none                         null      local
    

    可知networks中多了deploy_bionic_net这个虚拟网卡
    docker-compose的网络名的规则是:<当前路径名_networks>

    docker-compose使用环境变量来取代路径名。
    在docker-compose.yml同级目录下新建.env文件,并写入环境变量
    设置环境变量:COMPOSE_PROJECT_NAME

    $ cat .env
    COMPOSE_PROJECT_NAME=aaa
    

    参考: https://docs.docker.com/compose/env-file/

    此时docker-compose的网络名的规则是:<COMPOSE_PROJECT_NAME>_<NETWORKS>
    总体规则就是:

    6. 更新web_api

    当所有服务都运行起来之后,更新部署时可以部分service build以及部分service up

    1. 重新构建web_api
    docker-compose build web_api
    
    1. 单独重新up启动web_api
    docker-compose up -d --no-deps web_api
    

    使用--no-deps参数后依赖项就不重新启停

    7. 开发阶段

    开发阶段只启动依赖服务,不需要用docker启动web_api, 因为web_api需要单独从IDE启动并调试. 此时可以单独再写一个yml文件,如下: 文件名为docker-compose-dev.yml

    version: '3.1'
    
    services:
      # # 开发阶段不使用docker启动web_api
      # web_api:
      #   build:
      #     context: ../
      #     dockerfile: Dockerfile
      #   image: bionic_api
      #   container_name: bionic_api
      #   restart: unless-stopped
      #   environment:                        # 设置环境变量,相当于docker run命令中的-e
      #     TZ: Asia/Shanghai
      #     LANG: en_US.UTF-8
      #   volumes:
      #     - "./docs:/app/docs"
      #     - "./logs:/app/logs"
      #   ports:
      #     - "5000:80"
      #   depends_on:
      #     - postgres_db
      #     - redis
      #     - rabbitmq
      #     - influxdb
      #   networks:
      #     - bionic_net
    
      postgres_db:
        image: postgres:14.2
        container_name: postgresql
        volumes:
         - ./pgdata:/var/lib/postgresql/data
        restart: always
        environment:
          POSTGRES_USER: bionic #在此填写postgres的用户名
          POSTGRES_PASSWORD: abc_123! #在此填写posgres的数据库密码
          POSTGRES_DB: bionic_test #在此填写postgres的数据库名,默认是postgres
          TZ: Asia/Shanghai
          LANG: en_US.UTF-8
        ports:
          - "1001:5432"
        networks:
          - bionic_net
    networks:
      bionic_net:
        driver: "bridge"
    
    volumes:
      pgdata: {}
    

    指定-f参数, 启动docker-compose-dev.yml文件

    docker-compose -f docker-compose-dev.yml up -d
    

    总结

    以上就是一个完整项目的docker-compose部署过程,当然dockerfile如何写,yml如何配置并没有具体说明,这个还要小伙伴自己去学习,本文主要将docker-compose工具构建发布的过程讲述了一遍,并说明了一些注意事项,让各位小伙伴对docker-compose能有个大体的轮廓。

    作者:wwmin
    本文链接:https://www.jianshu.com/p/117ea6b11c5d
    转载请注明出处!
    微信公众号: DotNet技术说
    如果您觉得文章对您有帮助,关注点赞,您的鼓励是博主的最大动力!

    相关文章

      网友评论

          本文标题:docker 部署.net webapi 依赖其他服务

          本文链接:https://www.haomeiwen.com/subject/ytfhbrtx.html