将ASP.NET CORE应用通过Docker部署
一、前言
记录下ASP.NET CORE如何通过Docker部署。大概有两种方式:
- 先本地发布(publish),再基于运行时镜像,生成(build)新镜像。
- 有源代码,基于SDK镜像,生成时还原(restore)并发布(publish),生成(build)新镜像。
会的可查看 https://github.com/dotnet/dotnet-docker/tree/master/samples/aspnetapp ,有很多Dockerfile的示例。
二、本地发布,再生成镜像
-
导航到有*.sln或*.csproj的项目文件夹。
-
运行发布(publish)命令。
dotnet publish -c Release -o publishedRelease配置发布,生成到published目录
-
可先本地运行,看下有无问题
dotnet published\aspnetapp.dllaspnetapp.dll是aspnetapp项目发布生成的dll。
-
浏览 http://localhost:5000,正常运行。
-
编写对应Dockerfile,基于runtime镜像(特点是小)。
FROM mcr.microsoft.com/dotnet/aspnet:3.1 WORKDIR /app # 复制发布生成的所有文件到/app COPY ./ ./ ENTRYPOINT ["dotnet", "aspnetapp.dll"] -
docker build命令,生成镜像。
docker build -t aspnetapp .-t选项,可指定新镜像名称与tag。
-
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。 -
docker ps命令,查看正在运行的容器。
三、有源代码,生成时发布并创建镜像
-
导航到有.sln或.csproj的项目文件夹。
-
编写对应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
- 执行上面的第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
- 这里的镜像是自己测试用,push到腾讯云容器服务上的。
- ASPNETCORE应用可通过环境变量来配置mongodb数据库的地址、服务器监听的端口等。关于配置的详情,查看https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/configuration/?view=aspnetcore-5.0
- docker-compose的服务会自动连在同一个网络,可通过服务名访问对应的容器。

浙公网安备 33010602011771号