Docker 命令全景指南:从镜像构建到生产运维

本文系统梳理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 命令的核心在于理解镜像不可变、容器易逝、数据在外、网络显式的设计哲学。命令是工具,对架构原则的把握才是区分熟练使用与生产掌控的关键。

相关推荐
Είναι η κοπέλα1 小时前
WSL2 部署 AI 开发环境:内核级 Linux + GPU 直通
linux·运维·人工智能
其实防守也摸鱼1 小时前
网安自测题:掌握核心知识点的实用练习
linux·运维·服务器·前端·数据库·sql·xss
2401_868534781 小时前
简要说明PON下行和上传数据方式
运维·服务器·网络
weixin_403810131 小时前
iOS 自动化脚本怎么输入文字:代理、输入法与快捷指令三级方案
运维·ios·自动化
ai小陈10 小时前
GPU服务器租用存储验收:检查点写入与磁盘吞吐实战
运维·服务器·人工智能·ai·ssh·gpu算力
灯澜忆梦11 小时前
【minio】#1 | 简介与安装
docker·对象存储·minio
有毒的教程12 小时前
VMware仅主机模式:物理机 ↔ 虚拟机 文件共享
运维
山岚的运维笔记15 小时前
ComfyUI NVIDIA安装教程:官方便携版下载+run_nvidia_gpu.bat启动,8G显存Windows实操
运维·服务器·windows·笔记·prompt·aigc·comfyui
海宇大数据15 小时前
零信任架构实战:基于海宇活体识别V步骤1构建自动化远程公证会话初始化网关
运维·人工智能·架构·自动化