Table of Contents
Docker 镜像的构成及原理
镜像是 多层叠加
┌─────────────────────────┐
│ 应用层(你的程序) │ ← Layer 5
├─────────────────────────┤
│ 依赖库(pip / apt) │ ← Layer 4
├─────────────────────────┤
│ 运行时(Python / .NET)│ ← Layer 3
├─────────────────────────┤
│ OS 用户态(glibc 等) │ ← Layer 2
├─────────────────────────┤
│ Base Image(debian) │ ← Layer 1
└─────────────────────────┘
Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "main.py"]
构建过程(逐层)
FROM python:3.11-slim → Layer 1 # Docker 拉取一个 已有镜像,这个镜像本身就已经是 多层结构,Debian slim,Python 3.11,pip、libpython、glibc 等
WORKDIR /app → Layer 2(元数据) # 在当前镜像文件系统里创建目录 /app
COPY requirements.txt → Layer 3 # 把宿主机的 requirements.txt复制到 镜像内 /app/requirements.txt
RUN pip install → Layer 4 # 在这个容器里执行 pip install -r requirements.txt
COPY . . → Layer 5 # 把当前目录下所有文件复制到镜像的 /app
"Cmd": ["python", "main.py"] → 镜像配置
c# .net 10制作镜像过程举例
项目结构(宿主机)
HelloApi/
├── HelloApi.csproj
├── Program.cs
├── Controllers/
│ └── HelloController.cs
└── Dockerfile
Dockerfile
# ========== Stage 1: build ==========
FROM mcr.microsoft.com/dotnet/sdk:10.0-preview AS build
WORKDIR /src
# 1️⃣ 只复制 csproj(缓存 restore)
COPY HelloApi.csproj .
RUN dotnet restore
# 2️⃣ 复制全部源码
COPY . .
# 3️⃣ 发布
RUN dotnet publish -c Release -o /app/publish \
--no-restore
# ========== Stage 2: runtime ==========
FROM mcr.microsoft.com/dotnet/aspnet:10.0-preview
WORKDIR /app
# 4️⃣ 只拷贝发布产物
COPY --from=build /app/publish .
EXPOSE 8080
ENTRYPOINT ["dotnet", "HelloApi.dll"]
Docker 实际做了:
Layer 1 SDK base image
Layer 2 WORKDIR /src
Layer 3 COPY csproj
Layer 4 dotnet restore
Layer 5 COPY source
Layer 6 dotnet publish
----------------------------
Layer 7 runtime base image
Layer 8 COPY publish output
Layer 9 ENTRYPOINT (metadata)
最终镜像只包含 Layer 7 + 8
.NET 镜像 = SDK 镜像负责“造”,Runtime 镜像负责“跑”
docker buildx build --platform linux/arm64 -t hello-dotnet10 .
