ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-07-22 18:38:15  阅读:158  来源: 互联网

标签:webapi core compose Bionic Service api bionic docker


前言:

当前的服务越来越多的构建在了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: ../使用的是../相对的上级目录

  • 2. web_api 的volumes目录应注意确定docker内部的具体位置,可在Dockerfile中查看 workdir路径,我的就是上面Dockerfile中的 /app路径,也可使用docker attach container_name命令进入容器中查看实际的位置

  • 3. 使用depends_on依赖其他服务,只有依赖的服务启动成功后,该服务才会开始启动。如上web_api中使用depends_on中依赖了postgres_db,故web_api服务在db服务后面启动

  • 4. 将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使用环境变量来取代路径名。
设置环境变量:COMPOSE_PROJECT_NAME

$ cat .env
COMPOSE_PROJECT_NAME=aaa

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

  • 1、如果没有定义networks,那么就是default。

  • 2、如果没有环境变量COMPOSE_PROJECT_NAME,那么就是当前路径名(取前缀)。
    查看官网docker-networks https://docs.docker.com/compose/networking/

总结

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

鸣谢:

https://www.jianshu.com/p/117ea6b11c5d

标签:webapi,core,compose,Bionic,Service,api,bionic,docker
来源: https://www.cnblogs.com/yakniu/p/16506751.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有