Docker 入门与实践指南
·
面向初学者与进阶使用者的系统速览。
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 | 持久化与共享数据目录。 |
| Network | bridge / 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. 最佳实践(精选)
- 镜像体积控制:多阶段构建 + alpine/slim + 清理包缓存。
- 固定版本:镜像与依赖避免使用 latest。
- 配置外置:使用环境变量 / 文件挂载,不写死在 镜像。
- 数据持久化:数据库等必须使用 volume。
- 安全:
- rootless / USER
- 只开放必要端口
- 定期扫描(trivy / grype)
- 监控:cAdvisor + Prometheus 或
docker stats。 - 日志:STDOUT/STDERR(让编排平台收集),不要写本地文件。
- 资源限制:
--memory、--cpus防止资源争抢。 - 构建缓存: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 = 多容器编排基本单元)
更多推荐



所有评论(0)