面向初学者与进阶使用者的系统速览。

1. Docker 是什么?

Docker 是一个基于 容器(Container) 技术的应用打包、分发与运行平台。它通过 镜像(Image) 将应用及其依赖打包,运行时以独立进程形式隔离(依赖 Linux 内核的 Namespace / CGroup),相比虚拟机开销更小、启动更快、移植性更强。

2. 与虚拟机(VM)的对比

容器与虚拟机都用于隔离运行环境,但技术栈与适用场景存在明显差异:

维度容器(Docker)虚拟机(VM)
架构层次应用 -> 容器引擎 -> 主机内核应用 -> Guest OS -> Hypervisor -> 硬件
是否独立内核共享宿主机内核每个 VM 拥有独立内核
启动速度秒级(创建进程 + namespace 设置)分钟级(引导完整 OS)
资源开销轻量:无额外内核/驱动较重:每个 VM 占用内存、磁盘、内核态结构
隔离强度进程级(内核共享)更强(硬件/指令级虚拟化)
适合场景微服务、CI/CD、快速弹性、批处理强隔离、多 OS、遗留单体、内核实验
镜像/模板大小10MB~数百 MB数 GB 以上常见
分发与迁移层复用 + Registry 推拉OVF / 镜像文件复制(慢)
运行密度高(单机可运行上百容器)较低(受内存/CPU 约束)
内核特性测试不适合(共享内核)适合(可自定义内核)
安全攻击面需关注逃逸风险、能力削减相对独立,逃逸成本更高
网络模型用户态/bridge/NAT 更灵活逼真接近物理机网络

一句话判断:如果你需要“快速、一致、批量运行应用”,优先容器;如果你需要“完整 OS 或强隔离/自定义内核”,用虚拟机。

简单结构示意:

容器:                虚拟机:
应用 应用 应用         应用 应用
 |   |   |            |     |
 容器层(隔离)          Guest OS
 -----------           -----------
   主机 OS 内核       Hypervisor
        硬件          硬件

3. 核心概念

名称说明
Image只读模板,包含文件系统与元数据。分层(Layer)构建,可复用缓存。
Container镜像的运行实例:镜像 + 可写层。
Registry镜像仓库(Docker Hub / 私有 Harbor / GitLab Registry)。
Dockerfile定义如何构建镜像的声明式脚本。
Layer每个构建指令生成一层,联合挂载(UnionFS)。
Volume持久化与共享数据目录。
Networkbridge / host / none / 自定义。
Compose多容器编排工具(声明式 YAML)。

4. 安装(以 Debian/Ubuntu 为例)

# 1. 卸载旧版本
sudo apt remove docker docker-engine docker.io containerd runc

# 2. 安装依赖
sudo apt update
sudo apt install -y ca-certificates curl gnupg

# 3. 添加官方源
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
 https://download.docker.com/linux/ubuntu $(. /etc/os-release; echo $VERSION_CODENAME) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list >/dev/null

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 4. 非 root 使用
sudo usermod -aG docker $USER

5. 常用命令速览

docker version                  # 版本
docker info                     # 系统信息
docker pull nginx:1.27          # 拉取镜像
docker images                   # 列出镜像
docker rmi <image>              # 删除镜像
docker run -d -p 8080:80 nginx  # 后台运行
docker ps (-a)                  # 运行(全部)容器
docker logs -f <container>      # 查看日志
docker exec -it <c> /bin/bash   # 进入容器
docker stop/start/restart <c>   # 控制生命周期
docker rm <c>                   # 删除容器
docker build -t myapp:1 .       # 构建镜像
docker save / load              # 镜像归档
docker cp <c>:/path ./local     # 拷贝文件
docker volume ls / rm           # 卷管理
docker network ls / inspect     # 网络管理

6. 一个最小可优化的 Dockerfile 示例

# 基础镜像(选择官方瘦身版)
FROM python:3.12-slim AS build

# 设置时区/编码
ENV TZ=UTC LANG=C.UTF-8 PYTHONDONTWRITEBYTECODE=1 PYTHONUNBUFFERED=1

# 只复制依赖清单以利用缓存
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 复制应用源码
COPY . .

# 应用端口(声明型,不自动映射)
EXPOSE 8000

# 非 root 运行
RUN useradd -m appuser
USER appuser

# 健康检查(可选)
HEALTHCHECK --interval=30s --timeout=3s CMD curl -f http://localhost:8000/health || exit 1

# 启动命令
CMD ["python", "main.py"]

优化要点:

  • 分层缓存:先 COPY 依赖清单再装包。
  • 使用 slim / distroless 减少攻击面与体积。
  • 非 root 运行。
  • 明确 ENV 减少隐性差异。
  • HEALTHCHECK 便于编排系统判定状态。

7. docker-compose 示例

version: "3.9"
services:
  web:
    build: .
    ports:
      - "8000:8000"
    depends_on:
      - redis
    environment:
      REDIS_URL: redis://redis:6379/0
  redis:
    image: redis:7-alpine
    volumes:
      - redis_data:/data
volumes:
  redis_data:

命令:

docker compose up -d
docker compose logs -f web
docker compose down -v

8. 典型使用场景

  • 本地开发统一环境(依赖隔离)。
  • CI 构建与测试(可复现)。
  • 微服务拆分部署。
  • 边缘/多云迁移。
  • 快速回归旧版本验证。

9. 最佳实践(精选)

  1. 镜像体积控制:多阶段构建 + alpine/slim + 清理包缓存。
  2. 固定版本:镜像与依赖避免使用 latest。
  3. 配置外置:使用环境变量 / 文件挂载,不写死在 镜像。
  4. 数据持久化:数据库等必须使用 volume。
  5. 安全:
    • rootless / USER
    • 只开放必要端口
    • 定期扫描(trivy / grype)
  6. 监控:cAdvisor + Prometheus 或 docker stats
  7. 日志:STDOUT/STDERR(让编排平台收集),不要写本地文件。
  8. 资源限制:--memory--cpus 防止资源争抢。
  9. 构建缓存:CI 中使用 BuildKit 与 registry cache。

10. 性能注意点

问题说明建议
I/O 慢(尤其 overlay2 + 小文件)元数据开销合并小文件 / 预打包
冷启动延迟首次拉取镜像大分层拆分 / 精简镜像
网络转发开销bridge NAT高频低延迟可用 host 网络(风险评估)
过量日志IO/磁盘限制 --log-opt max-size
CPU 抢占无限制设置 --cpuset-cpus --cpus

11. 安全基线简表

  • 只信任官方/自建源镜像。
  • 镜像签名(cosign)与 SBOM。
  • 禁止容器内启动 systemd。
  • 关闭不必要 capabilities(或使用 --cap-drop=ALL 逐项添加)。
  • 不在镜像中存储密钥(改用 env / secret / vault)。

12. 常见排错思路

现象排查命令
启动秒退docker logs <c> + docker inspect --format '{{.State.ExitCode}}'
端口占用`ss -ltnp
DNS 失败docker run busybox nslookup baidu.com
卷权限问题查看宿主 ls -l 与容器内 UID/GID
镜像过大dive <image> / docker history
CPU 飙升docker top <c> + perf/top

13. 常用组合命令片段

# 清理无用资源(慎用)
docker system prune -af --volumes

# 仅删除悬挂层
docker image prune

# 查镜像层大小
docker history --no-trunc myapp:1

# 导出与导入容器
docker export <c> | gzip > rootfs.tar.gz
cat rootfs.tar.gz | docker import - myrootfs:latest

14. 进一步学习资源

  • 官方文档: https://docs.docker.com/
  • OCI 规范: https://opencontainers.org/
  • 镜像扫描工具: Trivy / Grype
  • 安全基线: CIS Docker Benchmark

15. 升级方向

  • CI/CD 集成(GitHub Actions / GitLab CI)
  • 镜像签名与 SBOM
  • 私有仓库搭建(Harbor)
  • 与 Kubernetes 结合(Pod = 多容器编排基本单元)

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐