受欢迎的博客标签

Docker 镜像的构成及原理

Published

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 .