镜像是 Docker 的核心概念之一,可以理解为容器的”模板”或”只读蓝图”。
1. 镜像的通俗理解
类比说明
镜 像 ➜ 类 (Class)
容 器 ➜ 对象实例 (Object Instance)
镜 像 ➜ 操作系统安装光盘
容 器 ➜ 安装好的运行系统
2. 镜像的分层结构
联合文件系统 (Union File System)
# Dockerfile
FROM ubuntu:20.04 # ← 基础层 (Base Image)
RUN apt update && apt install -y python3 # ← 第二层
COPY . /app # ← 第三层
CMD ["python3", "app.py"] # ← 第四层
分层示意图:
容器可写层 (Container Writable Layer)
↑
镜像层4: CMD指令
↑
镜像层3: COPY文件
↑
镜像层2: RUN安装软件
↑
镜像层1: FROM基础镜像
3. 镜像的特点
只读性
- 镜像是只读的:一旦创建就不能修改
- 容器基于镜像创建:在镜像之上添加可写层
分层共享
# 多个容器共享同一基础镜像,节省磁盘空间
容器A [ubuntu + nginx] ──┐
├── ubuntu基础镜像 (共享)
容器B [ubuntu + mysql] ──┘
4. Dockerfile与镜像构建
构建过程示例
# Dockerfile - Python应用示例
# Layer1: ubuntu基础环境 (~70MB)
FROM ubuntu:20.04
# Layer2: apt软件包 (~300MB)
RUN apt update && apt install -y python3 python3-pip
# Layer3: pip依赖 (~50MB)
RUN pip3 install flask redis
# Layer4: 应用代码 (~5MB)
COPY app.py /app/app.py
# Layer5:启动命令(元数据,几乎不占空间)
CMD ["python3", "/app/app.py"]
#构建命令
docker build -t my-python-app:v1 .
5. C++项目Dockerfile示例
FROM ubuntu:20.04 AS builder
#编译环境层
RUN apt update && apt install -y g++ cmake make git
WORKDIR /src
COPY . .
#编译结果层
RUN mkdir build && cd build && \
cmake .. && make -j4
#运行时镜像(更小)
FROM ubuntu:20.04
RUN apt update && apt install -y libstdc++6
COPY --from=builder /src/build/myapp /usr/local/bin/
CMD ["myapp"]
6. Docker Hub和Registry
公共仓库
docker pull ubuntu:20.04 #从Docker Hub拉取官方镜像
docker push mycompany/myapp:v1 #推送自定义镜像到仓库
私有仓库
#自建私有Registry
docker run -d -p5000:5000 --name registry registry:2
#标记并推送到私有仓库
docker tag myapp:v1 localhost:5000/myapp:v1
docker push localhost:5000/myapp:v1
7. C++后端常用基础镜像
| 场景 | 推荐基础镜像 | 特点 |
|---|---|---|
| 开发调试 | ubuntu:20.04 |
完整工具链 |
| 生产部署 | debian:slim |
体积小,安全 |
| 最小化部署 | alpine |
<10MB,musl libc |
| 特定版本需求 | gcc:9.4 |
指定编译器版本 |
8. C++项目多阶段构建优势
FROM gcc:9.4 AS build-stage #编译阶段(包含完整工具链)
WORKDIR /build
COPY . .
RUN make
FROM debian:slim AS runtime-stage #运行阶段(仅包含运行时)
COPY --from=build-stage /build/myapp /usr/local/bin/
CMD ["myapp"] #最终镜像很小!
优势:
- ✅最终生产环境体积减小80%+
- ✅安全性更高(无编译工具)
- ✅层次清晰,易于维护
9.Docker常用操作命令汇总
docker images #查看本地所有可用映像列表
docker rmi <image_id> #删除指定的一个或多个映像文件
docker pull <image_name> #从registry下载新的映像到本地主机上
docker push <image_name> #将本地的映像上传到registry中供他人使用
docker save > myimage.tar.gz #导出整个映象为tar归档格式
docker load < myimage.tar.gz #从tar归档文件中加载映象
对于C++后端开发者来说,理解镜像是掌握Docker技术栈的基础!
内容由零声教学AI助手提供,问题来源于学员提问




