将ASP.NET CORE应用通过Docker部署

一、前言


记录下ASP.NET CORE如何通过Docker部署。大概有两种方式:

  1. 先本地发布(publish),再基于运行时镜像,生成(build)新镜像。
  2. 有源代码,基于SDK镜像,生成时还原(restore)并发布(publish),生成(build)新镜像。

入门可查看 https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/docker/building-net-docker-images?view=aspnetcore-3.1#build-and-deploy-manually

会的可查看 https://github.com/dotnet/dotnet-docker/tree/master/samples/aspnetapp ,有很多Dockerfile的示例。

二、本地发布,再生成镜像


  1. 导航到有*.sln或*.csproj的项目文件夹。

  2. 运行发布(publish)命令。

    dotnet publish -c Release -o published
    

    Release配置发布,生成到published目录

  3. 可先本地运行,看下有无问题

    dotnet published\aspnetapp.dll
    

    aspnetapp.dll是aspnetapp项目发布生成的dll。

  4. 浏览 http://localhost:5000,正常运行。

  5. 编写对应Dockerfile,基于runtime镜像(特点是小)。

    FROM mcr.microsoft.com/dotnet/aspnet:3.1
    WORKDIR /app
    # 复制发布生成的所有文件到/app
    COPY ./ ./
    ENTRYPOINT ["dotnet", "aspnetapp.dll"]
    
  6. docker build命令,生成镜像。

    docker build -t aspnetapp .
    

    -t选项,可指定新镜像名称与tag。

  7. docker run命令,运行新镜像的容器。

    docker run -it --rm -p 5000:80 --name aspnetcore_sample aspnetapp
    

    -it为交互与分配TTY;--rm为容器在退出时自动删除;
    -p为将docker host(主机)的5000端口映射到容器中的80端口;
    --name为容器命名为aspnetcore_sample;
    最后为镜像名,aspnetapp。

  8. docker ps命令,查看正在运行的容器。

三、有源代码,生成时发布并创建镜像


  1. 导航到有.sln或.csproj的项目文件夹。

  2. 编写对应Dockerfile,基于SDK镜像(特点是功能全,空间大)。

    # 使用多阶段构建
    FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
    WORKDIR /app
    
    # copy csproj and restore as distinct layers
    COPY ./ ./
    
    RUN dotnet restore
    
    # 还原后发布
    RUN dotnet publish -c Release -o out
    
    # 第二阶段
    FROM mcr.microsoft.com/dotnet/aspnet:3.1 AS runtime
    WORKDIR /app
    #将第一阶段发布的文件,拷贝到运行时阶段
    COPY --from=build /app/out ./
    
    ENTRYPOINT ["dotnet","aspnetapp.dll"]
    

这里使用了Docker多阶段构建,可查看https://www.jb51.net/article/138963.htm

  1. 执行上面的第6、7、8步。

小结

其实ASP.NET CORE应用部署到Docker还是比较简单的,不需要多少改动。如果依赖于多个其他服务,那就要用docker-compose了。以后了解了再补充。


额外补充:docker-compose部署多个容器组成的web应用

例子一共有三个容器,分别是:

  • nginx容器,伺服前端的静态文件。并做反向代理,将特定请求转发api容器,解决跨域问题。
  • api容器,ASPNETCORE应用,处理逻辑。
  • mongodb容器,文档数据库,存数据。

docker-compose.yml的文件示例

version: '3'
  
services:
  db:
    image: mongo
    restart: always
    environment:
      # 环境变量设置mongodb的用户名、密码
      MONGO_INITDB_ROOT_USERNAME: mongoadmin
      MONGO_INITDB_ROOT_PASSWORD: 85814655
    ports:
      - 8081:27017

  api:
    # 此镜像提前push到腾讯云的容器服务
    image: ccr.ccs.tencentyun.com/farmer_vincentfong/vue-online-shop-netcore-api1:1.2.0
    restart: always
    # depends_on来确保服务的执行顺序
    depends_on:
      - db
    environment:
      # 通过环境变量修改aspnetcore的配置
      MongoDbSettings__ConnectionString: mongodb://mongoadmin:85814655@db:27017/admin
      ASPNETCORE_URLS: http://*:3000
    ports:
      - 8084:3000

  nginx:
    # 此nginx镜像由于伺服前端静态文件、或转发请求到api容器
    image: registry.cn-hangzhou.aliyuncs.com/vincentfong_test5932/vue-online-shop-nginx:ab49de
    restart: always
    depends_on:
      - db
      - api
    ports:
      - 8082:80

posted @ 2020-11-20 01:32  SuperMutant  阅读(151)  评论(0)    收藏  举报