使用 Docker 容器化部署 .NET Web 应用
本文包含AI辅助创作内容
本文介绍如何通过 Dockerfile 多阶段构建,将 .NET Web 应用打包为镜像,并使用 docker-compose 完成容器化部署。
编写 Dockerfile
拉取用到的镜像
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 镜像,更利于分发和部署。
编写 docker-compose.yml
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,便于与其他容器互通 |
Volume 挂载配置
容器内的配置文件(如 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
注意事项
- ●文件必须存在:宿主机上的源文件必须提前创建,否则 Docker 会将其当作目录创建,导致挂载失败
- ●文件格式:挂载的是文件而非目录,路径必须精确到文件名
- ●权限问题:容器内进程对挂载文件的读写权限取决于宿主机文件权限,若出现权限拒绝可执行:
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 即可查看应用。

请先 登录后发表评论 ~