发布时间:2026-08-14 10:25:35 分类:营销学堂
本文介绍如何通过 Dockerfile 多阶段构建,将 .NET Web 应用打包为镜像,并使用 docker-compose 完成容器化部署。
拉取用到的镜像
sudo docker pull mcr.microsoft.com/dotnet/sdk:10.0 sudo docker pull mcr.microsoft.com/dotnet/aspnet:10.0
使用 .NET SDK 镜像作为编译环境。由于 SDK 镜像默认未安装 Git,需先安装再拉取代码:
FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
RUN apt-get update && apt-get install -y git
RUN git clone http://git.localhost/demo/demo.git
源码就绪后,还原依赖并编译为 Release 版本:
RUN dotnet restore ./demo
# 编译为 Release 版本,输出到容器的 /app/build 目录
RUN dotnet publish ./demo -c Release -o /app/build
使用更轻量的 ASP.NET 运行时镜像作为最终环境,将编译产物从构建阶段复制过来:
# 运行时镜像
FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS final
# 指定工作目录
WORKDIR /app
# 从编译阶段复制产物
COPY --from=build /app/build .
# 指定启动命令
ENTRYPOINT ["dotnet", "./WebApp.dll"]
多阶段构建的优势:最终镜像仅包含运行时和编译产物,体积远小于 SDK 镜像,更利于分发和部署。
services:
netwebdemo:
image: netwebdemo:0.0.1
build:
context: .
dockerfile: Dockerfile
# volumes:
# - ./etc/appsettings.json:/app/appsettings.json
environment:
- TZ=Asia/Shanghai
restart: always
ports:
- 8002:8080
networks:
- network
networks:
network:
external: true
配置说明:
| 配置项 | 说明 |
|---|---|
image |
镜像名称及版本号 |
build |
指定 Dockerfile 路径与构建上下文 |
environment |
设置时区为 Asia/Shanghai |
restart: always |
容器异常退出时自动重启 |
ports |
宿主机 8002 端口映射到容器 8080 端口 |
networks |
使用外部网络 network,便于与其他容器互通 |
容器内的配置文件(如 appsettings.json)会随镜像打包,每次修改都需要重新构建镜像。通过 Volume 挂载,可以将宿主机文件映射到容器内,实现配置热更新而无需重建镜像。
在 docker-compose.yml 中取消 volumes 注释并按需调整:
volumes:
- ./etc/appsettings.json:/app/appsettings.json
该配置表示将宿主机当前目录下的 etc/appsettings.json 映射到容器内的 /app/appsettings.json。
挂载前需确保宿主机上存在对应文件,建议的目录结构如下:
project/
├── Dockerfile
├── docker-compose.yml
└── etc/
└── appsettings.json
chmod 644 ./etc/appsettings.json
volumes:
- ./etc/appsettings.json:/app/appsettings.json
- ./etc/logconfig.json:/app/logconfig.json
volumes:
- ./etc:/app/config
此时需同步修改应用代码中的配置读取路径执行以下命令,Docker 将自动构建镜像并启动容器:
sudo docker compose up -d
启动成功后,通过浏览器访问 http://localhost:8002 即可查看应用。