本文系统梳理Docker架构与核心操作,涵盖镜像管理、容器生命周期、数据持久化、网络配置及资源限制等关键模块。强调生产环境应遵循版本标签规范、多阶段构建、非root运行、资源限制与安全加固等最佳实践。通过命令速查与架构哲学总结,突出"镜像不可变、容器易逝、数据在外、网络显式"的设计原则,助力实现高效、安全的容器化运维。
1. Docker 架构与核心概念
Docker 采用 C/S 架构,主要组件包括:
-
Docker Daemon:后台守护进程,管理镜像、容器、网络和存储卷
-
Docker CLI:命令行客户端,通过 REST API 与 Daemon 通信
-
Containerd:容器运行时,负责容器生命周期管理
-
Runc:底层 OCI 运行时,创建和运行容器
Docker 管理四类核心对象:
| 对象 | 说明 | 可变性 |
|---|---|---|
| Image | 只读模板,包含应用代码、运行时、库和依赖 | 不可变 |
| Container | 镜像的可写运行实例 | 可变 |
| Volume | 独立于容器生命周期的数据存储 | 可变 |
| Network | 容器间通信的虚拟网络 | 可变 |
命令设计遵循统一模式:docker <对象> <动作> <参数>。
2. 镜像管理
2.1 镜像获取
# 从仓库拉取镜像
docker pull nginx:1.27-alpine
# 搜索仓库中的镜像
docker search python --filter stars=100
最佳实践 :始终指定明确的版本标签,避免使用 latest标签。latest不具备版本可追溯性,在生产环境中可能导致不可预期的部署结果。
2.2 镜像构建
# 使用默认 Dockerfile 构建
docker build -t myapp:1.0 .
# 指定 Dockerfile 路径
docker build -f Dockerfile.prod -t myapp:prod .
# 禁用构建缓存
docker build --no-cache -t myapp:1.0 .
# 传递构建参数
docker build --build-arg HTTP_PROXY=http://proxy:8080 -t myapp:1.0 .
# 多架构构建
docker build --platform linux/amd64,linux/arm64 -t myapp:1.0 .
构建上下文(.)会递归发送目录内容至 Daemon。.dockerignore文件用于排除不必要的文件,减少上下文体积。
2.3 多阶段构建
# 构建阶段
FROM golang:1.22 AS builder
WORKDIR /src
COPY . .
RUN go build -o /bin/app
# 运行阶段
FROM alpine:3.20
COPY --from=builder /bin/app /bin/app
ENTRYPOINT ["/bin/app"]
多阶段构建将构建依赖与运行时环境分离,显著减小最终镜像体积。
2.4 镜像查看与清理
# 列出本地镜像
docker images
docker image ls
# 查看镜像详细信息
docker inspect nginx:1.27-alpine
# 查看镜像构建历史
docker history nginx:1.27-alpine
# 删除镜像
docker rmi nginx:1.27-alpine
# 强制删除
docker rmi -f nginx:1.27-alpine
# 清理悬空镜像(无标签的镜像)
docker image prune
# 清理所有未使用的镜像
docker image prune -a
2.5 镜像导出与导入
# 导出镜像为 tar 归档
docker save myapp:1.0 -o myapp.tar
# 导出多个镜像
docker save myapp:1.0 myapp:latest -o myapp_multi.tar
# 从 tar 归档导入镜像
docker load -i myapp.tar
docker save/load操作的是完整镜像(含历史层和元数据)。与之对应的是 docker export/import,后者操作的是容器文件系统快照,会丢失镜像历史、元数据和多层结构,仅用于特殊场景。
2.6 镜像推送
# 标记镜像
docker tag myapp:1.0 registry.example.com/myapp:1.0
# 推送至远程仓库
docker push registry.example.com/myapp:1.0
3. 容器生命周期管理
3.1 创建并启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
核心参数说明:
| 参数 | 功能 |
|---|---|
-d, --detach |
后台运行 |
-i, --interactive |
保持标准输入打开 |
-t, --tty |
分配伪终端 |
--name |
指定容器名称 |
-p, --publish |
端口映射(宿主机:容器) |
-P, --publish-all |
随机映射所有暴露端口 |
-v, --volume |
数据卷挂载 |
--rm |
退出后自动删除容器 |
--restart |
重启策略 |
--memory |
内存限制 |
--cpus |
CPU 配额 |
--env, -e |
环境变量 |
--network |
网络模式 |
示例:
docker run -d \
--name web \
-p 8080:80 \
-v /data/html:/usr/share/nginx/html:ro \
-e TZ=Asia/Shanghai \
--memory=512m \
--cpus=1.0 \
--restart=unless-stopped \
nginx:1.27-alpine
3.2 容器状态查看
# 查看运行中的容器
docker ps
# 查看所有容器(含已停止)
docker ps -a
# 查看容器状态摘要
docker stats
# 查看容器资源占用(实时)
docker stats web
# 查看容器内进程
docker top web
容器退出码含义:
| 退出码 | 含义 |
|---|---|
| 0 | 正常退出 |
| 1 | 应用错误 |
| 137 | SIGKILL(通常为 OOM) |
| 139 | SIGSEGV(段错误) |
| 143 | SIGTERM |
3.3 容器启停控制
# 启动已停止的容器
docker start web
# 停止运行中的容器(发送 SIGTERM)
docker stop web
# 强制停止(发送 SIGKILL)
docker kill web
# 重启容器
docker restart web
# 暂停/恢复容器
docker pause web
docker unpause web
docker stop默认等待 10 秒后发送 SIGKILL,可通过 -t参数调整超时时间。
3.4 容器删除
# 删除已停止的容器
docker rm web
# 强制删除运行中的容器
docker rm -f web
# 删除所有已停止的容器
docker container prune
# 删除所有容器
docker rm -f $(docker ps -aq)
3.5 容器内执行命令
# 在运行中的容器内执行命令
docker exec web ls /
# 交互式进入容器
docker exec -it web /bin/sh
# 以指定用户身份执行
docker exec -u root -it web /bin/sh
docker exec在已有容器中创建新进程。docker attach则连接到容器的主进程,退出时可能终止容器,生产环境慎用。
3.6 日志查看
# 查看容器日志
docker logs web
# 实时跟踪日志
docker logs -f web
# 查看最近 100 行
docker logs --tail 100 web
# 查看最近 10 分钟的日志
docker logs --since 10m web
容器日志驱动由 Daemon 配置决定,默认为 json-file。生产环境建议配置集中式日志收集(如 Fluentd、Loki)。
3.7 容器信息检查
# 查看容器详细信息(JSON 格式)
docker inspect web
# 提取特定字段
docker inspect -f '{{.State.Status}}' web
docker inspect -f '{{.NetworkSettings.IPAddress}}' web
# 查看容器文件系统变更
docker diff web
4. 数据持久化
4.1 数据卷(Volume)
# 创建数据卷
docker volume create pgdata
# 列出数据卷
docker volume ls
# 查看数据卷详情
docker volume inspect pgdata
# 删除数据卷
docker volume rm pgdata
# 清理未使用的数据卷
docker volume prune
使用数据卷启动容器:
docker run -d \
--name postgres \
-v pgdata:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=secret \
postgres:16
4.2 绑定挂载(Bind Mount)
docker run -d \
-v /host/data:/container/data:ro \
nginx:1.27-alpine
绑定挂载直接将宿主机目录映射到容器,适合开发环境和配置文件挂载。生产环境优先使用命名卷,避免宿主机路径依赖。
4.3 挂载类型对比
| 特性 | 数据卷 | 绑定挂载 | tmpfs |
|---|---|---|---|
| 存储位置 | Docker 管理区域 | 宿主机任意路径 | 内存 |
| 生命周期 | 独立于容器 | 依赖宿主机 | 容器停止即消失 |
| 备份迁移 | 支持 | 依赖宿主机 | 不支持 |
| 性能 | 高 | 依赖文件系统 | 最高 |
| 适用场景 | 数据库数据 | 配置文件、代码 | 敏感临时数据 |
5. 网络管理
5.1 网络驱动类型
| 驱动 | 说明 | 适用场景 |
|---|---|---|
| bridge | 默认驱动,容器通过虚拟网桥通信 | 单主机容器通信 |
| host | 直接使用宿主机网络栈 | 高性能场景,牺牲隔离性 |
| none | 无网络 | 离线计算 |
| overlay | 跨主机容器网络 | Swarm 集群 |
| macvlan | 为容器分配 MAC 地址 | 需要直接暴露到物理网络 |
5.2 网络操作
# 列出网络
docker network ls
# 创建桥接网络
docker network create app-net
# 创建指定子网的桥接网络
docker network create \
--driver bridge \
--subnet=172.28.0.0/16 \
--gateway=172.28.0.1 \
app-net
# 查看网络详情
docker network inspect app-net
# 将运行中的容器连接到网络
docker network connect app-net web
# 断开容器与网络的连接
docker network disconnect app-net web
# 删除网络
docker network rm app-net
# 清理未使用的网络
docker network prune
5.3 容器网络配置
docker run -d \
--name web \
--network app-net \
--network-alias web-app \
-p 8080:80 \
nginx:1.27-alpine
同一自定义网络内的容器可通过容器名或服务名互相访问,Docker 内置 DNS 负责解析。
6. 资源限制
6.1 内存限制
docker run -d \
--memory=512m \
--memory-swap=512m \
--memory-reservation=256m \
--oom-kill-disable=false \
nginx:1.27-alpine
| 参数 | 说明 |
|---|---|
--memory |
内存使用上限 |
--memory-swap |
内存 + swap 总上限 |
--memory-reservation |
软限制,系统内存紧张时优先回收 |
--oom-kill-disable |
禁用 OOM Kill(不推荐) |
6.2 CPU 限制
docker run -d \
--cpus=1.5 \
--cpu-shares=512 \
--cpuset-cpus="0,1" \
nginx:1.27-alpine
| 参数 | 说明 |
|---|---|
--cpus |
可用 CPU 核心数 |
--cpu-shares |
相对权重(默认 1024) |
--cpuset-cpus |
绑定到指定 CPU 核心 |
6.3 PID 限制
docker run -d \
--pids-limit=256 \
nginx:1.27-alpine
限制容器内可创建的进程数,防止 fork bomb 攻击。
7. Docker Compose
7.1 基本操作
# 启动服务(后台)
docker compose up -d
# 启动并构建镜像
docker compose up -d --build
# 查看服务状态
docker compose ps
# 查看日志
docker compose logs -f
# 停止并删除容器、网络
docker compose down
# 停止但不删除容器
docker compose stop
# 启动已停止的服务
docker compose start
# 构建镜像
docker compose build
7.2 单服务操作
# 对指定服务执行命令
docker compose exec web /bin/sh
# 扩展服务实例数
docker compose up -d --scale web=3
# 查看服务资源占用
docker compose top
8. 系统运维命令
8.1 系统信息
# 查看 Docker 系统信息
docker info
# 查看 Docker 版本
docker version
# 查看磁盘占用
docker system df
# 实时事件监控
docker system events
8.2 系统清理
# 清理所有未使用的对象
docker system prune
# 清理包括数据卷在内的所有未使用对象
docker system prune -a --volumes
# 清理构建缓存
docker builder prune
docker system prune --volumes会删除所有未被引用的数据卷,操作前需确认数据可删除。
8.3 调试与诊断
# 查看容器文件系统变更
docker diff web
# 从容器复制文件到宿主机
docker cp web:/etc/nginx/nginx.conf ./nginx.conf
# 从宿主机复制文件到容器
docker cp ./config.conf web:/etc/app/config.conf
9. 生产环境命令规范
9.1 镜像规范
-
使用明确的版本标签,禁止使用
latest -
采用多阶段构建减小镜像体积
-
以非 root 用户运行应用
-
定期扫描镜像漏洞(
docker scan或第三方工具)
9.2 容器规范
-
始终设置资源限制(内存、CPU、PID)
-
配置合理的重启策略(
--restart=unless-stopped) -
数据持久化使用命名卷,不依赖容器可写层
-
日志输出到 stdout/stderr,由日志驱动统一收集
9.3 安全规范
-
禁止使用
--privileged模式 -
限制容器能力集(
--cap-drop,--cap-add) -
只读根文件系统(
--read-only) -
使用安全加固的底层发行版(如 distroless、alpine)
10. 常用命令速查表
| 场景 | 命令 |
|---|---|
| 查看运行容器 | docker ps |
| 查看所有容器 | docker ps -a |
| 启动容器 | docker start <name> |
| 停止容器 | docker stop <name> |
| 进入容器 | docker exec -it <name> /bin/sh |
| 查看日志 | docker logs -f <name> |
| 查看资源 | docker stats |
| 清理容器 | docker container prune |
| 清理镜像 | docker image prune -a |
| 清理卷 | docker volume prune |
| 清理网络 | docker network prune |
| 全量清理 | docker system prune -a --volumes |
掌握 Docker 命令的核心在于理解镜像不可变、容器易逝、数据在外、网络显式的设计哲学。命令是工具,对架构原则的把握才是区分熟练使用与生产掌控的关键。