七、Docker常用指令介绍-1-docker-commands-deep-dive
·
Docker 命令大全:从入门到内核级原理的深度实践指南
技术栈:Docker, Linux Kernel, Container Runtime, OCI
难度等级:★★★★★(专家级)
预计阅读时间:60 分钟
目录
- [引言:Docker 命令背后的技术体系](#1-引言 docker-命令背后的技术体系)
- Docker 架构与命令分类
- 镜像管理命令深度解析
- 容器生命周期管理命令
- 容器运行时管理命令
- 网络与存储命令详解
- 系统监控与诊断命令
- 安全相关命令
- 高级命令与最佳实践
- 命令性能优化与内核原理
- 故障排查实战
- 总结与速查表
1. 引言:Docker 命令背后的技术体系
1.1 Docker 命令的技术深度
Docker 命令不仅仅是简单的 CLI 工具,它是容器运行时、镜像管理、网络栈、存储驱动的综合体现。每个命令背后都涉及:
- OCI 标准:Open Container Initiative 规范
- containerd:CNCF 毕业项目,容器生命周期管理
- runc:低级容器运行时
- Linux 内核特性:Namespaces、Cgroups、UnionFS
1.2 为什么需要深入理解 Docker 命令
生产环境的挑战:
- 容器启动失败,如何快速定位?
- 性能下降,如何诊断瓶颈?
- 安全漏洞,如何加固容器?
- 资源泄漏,如何追踪根源?
本文承诺:
- 不仅讲解命令用法,更深入内核实现原理
- 提供性能基准测试数据
- 分享生产环境最佳实践
- 包含故障排查完整案例
2. Docker 架构与命令分类
2.1 Docker 客户端 - 服务端架构
组件职责:
- Docker CLI:用户接口,发送 REST 请求
- Docker Daemon:守护进程,管理容器生命周期
- containerd:工业级容器运行时(独立于 Docker Daemon)
- containerd-shim:桥梁,支持 Daemon 重启不影响容器
- runc:OCI 参考实现,调用内核 API
2.2 命令分类体系
| 分类 | 命令示例 | 使用频率 | 技术深度 |
|---|---|---|---|
| 镜像管理 | pull, push, build, tag | ⭐⭐⭐⭐ | ⭐⭐⭐ |
| 容器生命周期 | run, start, stop, rm | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| 运行时管理 | exec, attach, top | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 网络存储 | network, volume | ⭐⭐⭐ | ⭐⭐⭐⭐ |
| 监控诊断 | stats, inspect, logs | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| 系统管理 | info, system, prune | ⭐⭐ | ⭐⭐⭐ |
3. 镜像管理命令深度解析
3.1 docker pull:镜像拉取的底层原理
3.1.1 基础用法
# 拉取最新镜像
docker pull nginx
# 拉取指定版本
docker pull nginx:1.25.3-alpine
# 拉取所有标签
docker pull --all-tags nginx
3.1.2 底层实现:镜像分层下载
技术细节:
Nginx 镜像层次结构(总大小:182MB)
┌─────────────────────────────────────┐
│ Layer 4: nginx config (10MB) │ ← 最后下载
├─────────────────────────────────────┤
│ Layer 3: nginx binary (5MB) │
├─────────────────────────────────────┤
│ Layer 2: dependencies (20MB) │
├─────────────────────────────────────┤
│ Layer 1: alpine base (5MB) │ ← 最先下载
└─────────────────────────────────────┘
下载过程:
1. 解析 Manifest(镜像元数据)
2. 检查本地缓存
3. 并行下载缺失层(最多 3 层并发)
4. 验证层完整性(SHA256)
5. 解压并存储到 UnionFS
3.1.3 性能优化:镜像加速
# 配置国内镜像加速(/etc/docker/daemon.json)
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com"
],
"max-concurrent-downloads": 10,
"max-concurrent-uploads": 5
}
# 重启 Docker
systemctl daemon-reload
systemctl restart docker
# 测试加速效果
time docker pull nginx:alpine
# 优化前:120s
# 优化后:15s(8 倍提升)
3.1.4 内核原理:UnionFS 挂载
# 查看镜像层的挂载点
docker image inspect nginx:alpine --format='{{.RootFS.Layers}}'
# 输出示例:
# [sha256:abc123... sha256:def456... sha256:ghi789...]
# 查看 Overlay2 文件系统
cat /proc/mounts | grep overlay
# 输出:
# overlay /var/lib/docker/overlay2/.../merged overlay rw,relatime,...
挂载参数解析:
lowerdir:只读的镜像层(多个,冒号分隔)upperdir:可写的容器层workdir:原子操作的工作目录merged:统一视图(挂载点)
3.2 docker build:镜像构建优化
3.2.1 多阶段构建
# Dockerfile
FROM golang:1.22-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o /app/server
FROM alpine:3.19
COPY --from=builder /app/server /usr/local/bin/server
CMD ["server"]
构建命令:
# 启用 BuildKit(构建加速)
export DOCKER_BUILDKIT=1
# 构建镜像
docker build \
--no-cache \
--pull \
--progress=plain \
-t myapp:latest \
.
# 性能对比:
# 传统构建:120s
# BuildKit: 45s(2.7 倍提升)
3.2.2 构建缓存优化
缓存失效模式:
# ❌ 错误示例:每行都使缓存失效
COPY . .
RUN go mod download
RUN go build
# ✅ 正确示例:利用缓存
COPY go.mod go.sum ./
RUN go mod download # 缓存命中(如果依赖未变)
COPY . .
RUN go build # 缓存失效(源码变化)
缓存命中率测试:
# 第一次构建(无缓存)
docker build -t myapp:v1 .
# 输出:Step 1/10 ... (100% 执行)
# 第二次构建(仅修改源码)
docker build -t myapp:v2 .
# 输出:Step 1/10 ... (50% 使用缓存)
3.3 docker images:镜像分析
# 列出所有镜像
docker images
# 查看镜像详细信息
docker image inspect nginx:alpine
# 查看镜像历史(层信息)
docker history nginx:alpine --no-trunc
# 输出示例:
# IMAGE CREATED CREATED BY SIZE
# abc123 2 weeks ago CMD ["nginx" "-g" "daemon off;"] 0B
# def456 2 weeks ago STOPSIGNAL SIGTERM 0B
# ghi789 2 weeks ago COPY /etc/nginx/nginx.conf ... 10MB
# ...
# 查看镜像树状结构
docker image tree nginx:alpine
3.4 docker push:镜像推送策略
# 标记镜像
docker tag myapp:latest myregistry.com/myapp:v1.0
# 登录仓库
docker login myregistry.com
# 推送镜像
docker push myregistry.com/myapp:v1.0
# 推送所有标签
docker push --all-tags myregistry.com/myapp
推送优化:
- 使用内容寻址存储(Content-addressable storage)
- 只推送变化的层
- 启用压缩(gzip)
4. 容器生命周期管理命令
4.1 docker run:容器启动深度解析
4.1.1 完整参数示例
docker run -d \
--name nginx \
--hostname web-server \
--restart unless-stopped \
--cpus=2 \
--memory=1g \
--memory-swap=2g \
--oom-kill-disable \
--ulimit nofile=65535:65535 \
--ulimit nproc=65535:65535 \
--sysctl net.core.somaxconn=65535 \
--security-opt seccomp=unconfined \
--security-opt apparmor=unconfined \
--cap-drop ALL \
--cap-add NET_BIND_SERVICE \
--read-only \
--tmpfs /tmp:size=100m \
--tmpfs /var/cache/nginx:size=500m \
--device /dev/null:/dev/null \
-v nginx-config:/etc/nginx/conf.d:ro \
-v nginx-logs:/var/log/nginx \
-p 80:80 \
-p 443:443 \
--network bridge \
--dns 8.8.8.8 \
--dns-search example.com \
--add-host api.example.com:172.17.0.10 \
--env-file .env \
-e TZ=Asia/Shanghai \
--log-driver json-file \
--log-opt max-size=100m \
--log-opt max-file=3 \
--health-cmd "curl -f http://localhost/ || exit 1" \
--health-interval 30s \
--health-timeout 5s \
--health-retries 3 \
--health-start-period 10s \
--stop-signal SIGTERM \
--stop-timeout 30 \
nginx:alpine
4.1.2 启动流程深度剖析
12 步启动流程:
时间分解(典型值):
- 镜像检查:50ms
- Shim 启动:100ms
- Namespace 创建:10ms
- Cgroup 配置:20ms
- RootFS 挂载:200ms
- 进程启动:50ms
总计:~430ms
4.1.3 Namespaces 隔离详解
# 查看容器的 Namespaces
CONTAINER_PID=$(docker inspect -f '{{.State.Pid}}' nginx)
ls -l /proc/$CONTAINER_PID/ns/
# 输出:
# lrwxrwxrwx 1 root root 0 Mar 11 10:00 ipc -> 'ipc:[4026532456]'
# lrwxrwxrwx 1 root root 0 Mar 11 10:00 mnt -> 'mnt:[4026532458]'
# lrwxrwxrwx 1 root root 0 Mar 11 10:00 net -> 'net:[4026532460]'
# lrwxrwxrwx 1 root root 0 Mar 11 10:00 pid -> 'pid:[4026532462]'
# lrwxrwxrwx 1 root root 0 Mar 11 10:00 user -> 'user:[4026532464]'
# lrwxrwxrwx 1 root root 0 Mar 11 10:00 uts -> 'uts:[4026532466]'
# 进入容器的 Namespace
nsenter -t $CONTAINER_PID -n ip addr
# 查看容器网络接口
6 种 Namespace 对比:
| Namespace | 隔离对象 | 系统调用 | 影响范围 |
|---|---|---|---|
| PID | 进程 ID | clone(CLONE_NEWPID) | 容器内 PID=1 |
| NET | 网络设备 | clone(CLONE_NEWNET) | 独立网络栈 |
| MNT | 挂载点 | clone(CLONE_NEWNS) | 文件系统视图 |
| UTS | 主机名 | clone(CLONE_NEWUTS) | hostname, domainname |
| IPC | 信号量 | clone(CLONE_NEWIPC) | 进程间通信 |
| USER | 用户 ID | clone(CLONE_NEWUSER) | UID 映射 |
4.1.4 Cgroups 资源限制
CPU 限制:
# 限制 2 个 CPU 核心
docker run --cpus=2 nginx
# 底层实现:
cat /sys/fs/cgroup/cpu/docker/<id>/cpu.cfs_quota_us
# 输出:200000 (2 核心 = 2 * 100000 微秒)
cat /sys/fs/cgroup/cpu/docker/<id>/cpu.cfs_period_us
# 输出:100000 (100ms 周期)
内存限制:
# 限制 1GB 内存
docker run --memory=1g nginx
# 查看限制
cat /sys/fs/cgroup/memory/docker/<id>/memory.limit_in_bytes
# 输出:1073741824
# OOM 事件
dmesg | grep -i "out of memory"
I/O 限制:
# 限制磁盘读取速度
docker run --device-read-bps=/dev/sda:10mb nginx
# 限制 IOPS
docker run --device-read-iops=/dev/sda:1000 nginx
4.2 docker ps:容器状态查看
# 查看运行中的容器
docker ps
# 查看所有容器(包括已停止)
docker ps -a
# 查看最新创建的容器
docker ps -n 1
# 自定义输出格式
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}"
# 输出示例:
# CONTAINER ID NAMES STATUS PORTS
# abc123456789 nginx Up 2 hours 0.0.0.0:80->80/tcp
# 查看容器大小
docker ps -s
# 输出:
# SIZE 15.2kB (virtual 182MB)
# virtual = 镜像大小 + 可写层大小
状态流转:
Created → Running → (Paused) → Stopped → Removed
↘
→ Dead (异常)
4.3 docker stop / docker start:启停容器
4.3.1 停止容器
# 优雅停止(默认 10s 超时)
docker stop nginx
# 指定超时时间
docker stop --time=30 nginx
# 强制停止(发送 SIGKILL)
docker kill nginx
# 发送指定信号
docker kill --signal=SIGTERM nginx
停止流程:
- Docker Daemon 发送 SIGTERM 到 PID 1
- 应用捕获信号,开始清理
- 等待超时(默认 10s)
- 如果未退出,发送 SIGKILL
- 卸载文件系统
- 清理网络资源
优雅关闭最佳实践:
# Dockerfile
STOPSIGNAL SIGTERM
# 捕获信号并优雅关闭
CMD ["sh", "-c", "trap 'echo Shutting down; exit 0' TERM; exec nginx -g 'daemon off;'"]
4.3.2 启动容器
# 启动已停止的容器
docker start nginx
# 启动并附加到终端
docker start -a nginx
# 交互式启动
docker start -ai nginx
4.4 docker rm:删除容器
# 删除已停止的容器
docker rm nginx
# 强制删除运行中的容器
docker rm -f nginx
# 删除所有已停止的容器
docker container prune
# 批量删除
docker rm $(docker ps -aq -f status=exited)
删除流程:
- 停止容器(如果运行中)
- 卸载 Overlay2 文件系统
- 删除容器元数据
- 清理网络端点
- 释放 Cgroup 资源
5. 容器运行时管理命令
5.1 docker exec:在运行容器中执行命令
5.1.1 基础用法
# 进入容器交互式 shell
docker exec -it nginx /bin/sh
# 执行单条命令
docker exec nginx nginx -v
# 指定工作目录
docker exec -w /app nginx ls -la
# 设置环境变量
docker exec -e DEBUG=1 nginx env
# 以指定用户执行
docker exec -u root nginx whoami
5.1.2 底层实现:Namespace 进入
技术原理:
# exec 的本质:nsenter + execve
# 方式 1:使用 nsenter(需要 root)
CONTAINER_PID=$(docker inspect -f '{{.State.Pid}}' nginx)
nsenter -t $CONTAINER_PID -n -m -p -i -u -w /bin/sh
# 方式 2:使用 docker exec(推荐)
docker exec -it nginx /bin/sh
Namespace 进入流程:
- 读取容器 PID
- 打开
/proc/<pid>/ns/*文件描述符 - 调用
setns()系统调用切换到目标 Namespace - 调用
execve()执行新命令
5.1.3 性能影响
并发 exec 测试:
# 同时执行 100 个命令
time for i in {1..100}; do
docker exec nginx echo test > /dev/null &
done
wait
# 结果:
# 平均延迟:50ms
# CPU 占用:5%
5.2 docker attach:附加到容器进程
# 附加到容器的主进程
docker attach nginx
# 分离而不终止(Ctrl+P, Ctrl+Q)
attach vs exec:
| 特性 | attach | exec |
|---|---|---|
| 目标 | 主进程(PID 1) | 新进程 |
| 输入 | 共享 stdin | 独立 stdin |
| 输出 | 共享 stdout/stderr | 独立输出 |
| 分离 | 可能终止容器 | 不影响容器 |
| 使用场景 | 调试主进程 | 日常管理 |
风险警告:
# ❌ 危险:attach 后按 Ctrl+C 会终止容器
docker attach nginx
# 按 Ctrl+C → 容器停止
# ✅ 安全:使用 exec
docker exec -it nginx /bin/sh
# 按 Ctrl+C → 只退出 shell
5.3 docker top:查看容器进程
# 查看容器进程
docker top nginx
# 输出示例:
# UID PID PPID C STIME TTY TIME CMD
# root 1234 5678 0 10:00 ? 00:00:01 nginx: master process
# nginx 1235 1234 0 10:00 ? 00:00:02 nginx: worker process
# nginx 1236 1234 0 10:00 ? 00:00:02 nginx: worker process
# 自定义输出(ps 参数)
docker top nginx -eo pid,cmd,%cpu,%mem
# 输出:
# PID CMD %CPU %MEM
# 1234 nginx: master 0.1 0.5
# 1235 nginx: worker 0.2 0.6
进程关系图:
宿主机 PID 空间:
┌─────────────────────────────────────┐
│ PID 5678: dockerd │
│ PID 1234: nginx (容器 PID 1) │
│ PID 1235: nginx worker (容器 PID 2) │
└─────────────────────────────────────┘
容器内 PID 空间:
┌─────────────────────────────────────┐
│ PID 1: nginx master │
│ PID 2: nginx worker │
└─────────────────────────────────────┘
6. 网络与存储命令详解
6.1 网络命令
6.1.1 docker network 管理
# 创建自定义网络
docker network create \
--driver bridge \
--subnet 172.20.0.0/16 \
--gateway 172.20.0.1 \
--opt "com.docker.network.bridge.name"=nginx-br0 \
--opt "com.docker.network.driver.mtu"=1500 \
nginx-network
# 查看网络
docker network ls
# 查看网络详情
docker network inspect nginx-network
# 连接容器到网络
docker network connect nginx-network nginx
# 断开网络
docker network disconnect nginx-network nginx
网络驱动对比:
| 驱动 | 隔离级别 | 性能 | 适用场景 |
|---|---|---|---|
| bridge | 中等 | ⭐⭐⭐⭐ | 单机多容器 |
| host | 无 | ⭐⭐⭐⭐⭐ | 高性能需求 |
| overlay | 强 | ⭐⭐⭐ | 跨主机通信 |
| macvlan | 强 | ⭐⭐⭐⭐ | 物理网络集成 |
| none | 完全 | ⭐⭐⭐⭐⭐ | 完全隔离 |
6.1.2 端口映射原理
# 端口映射
docker run -p 8080:80 nginx
# 查看 iptables 规则
iptables -t nat -L DOCKER | grep 8080
# 输出:
# DNAT tcp -- anywhere anywhere tcp dpt:8080 to:172.17.0.2:80
# 数据包路径:
# 外部请求 → eth0 → PREROUTING → DOCKER 链 → DNAT → 容器
6.2 存储命令
6.2.1 Volume 管理
# 创建命名卷
docker volume create nginx-data
# 查看卷详情
docker volume inspect nginx-data
# 挂载卷到容器
docker run -v nginx-data:/usr/share/nginx/html nginx
# 只读挂载
docker run -v nginx-data:/data:ro nginx
# 临时文件系统
docker run --tmpfs /app:size=100m nginx
Volume 驱动:
# 本地卷
docker volume create --driver local myvol
# NFS 卷
docker volume create \
--driver local \
--opt type=nfs \
--opt o=addr=192.168.1.100,rw \
--opt device=:/path/to/share \
nfs-vol
7. 系统监控与诊断命令
7.1 docker stats:实时资源监控
# 实时监控所有容器
docker stats
# 监控指定容器
docker stats nginx redis
# 一次性输出(非流式)
docker stats --no-stream
# 输出示例:
# CONTAINER ID NAME CPU % MEM USAGE / LIMIT NET I/O BLOCK I/O
# abc123 nginx 0.15% 10.5MiB / 1GiB 1.2GB / 500MB 100MB / 50MB
监控原理:
- CPU:读取
/sys/fs/cgroup/cpu/cpuacct.usage - 内存:读取
/sys/fs/cgroup/memory/memory.usage_in_bytes - 网络:读取
/sys/class/net/<iface>/statistics/ - I/O:读取
/sys/fs/cgroup/blkio/blkio.io_service_bytes
7.2 docker inspect:深度检查容器
# 检查容器配置
docker inspect nginx
# 获取特定字段
docker inspect -f '{{.State.Pid}}' nginx
docker inspect -f '{{.NetworkSettings.IPAddress}}' nginx
docker inspect -f '{{.HostConfig.Memory}}' nginx
# 检查镜像
docker inspect nginx:alpine
# 检查网络
docker network inspect bridge
# 检查卷
docker volume inspect nginx-data
JSON 输出示例:
{
"Id": "abc123...",
"Created": "2024-03-11T10:00:00.000Z",
"Path": "nginx",
"Args": ["-g", "daemon off;"],
"State": {
"Status": "running",
"Running": true,
"Pid": 1234,
"ExitCode": 0
},
"HostConfig": {
"Memory": 1073741824,
"CpuShares": 1024
},
"NetworkSettings": {
"IPAddress": "172.17.0.2",
"Ports": {
"80/tcp": [{"HostIp": "0.0.0.0", "HostPort": "80"}]
}
}
}
7.3 docker logs:日志查看
# 查看日志
docker logs nginx
# 跟踪日志输出
docker logs -f nginx
# 查看最近 100 行
docker logs --tail 100 nginx
# 显示时间戳
docker logs -t nginx
# 查看指定时间范围
docker logs --since 2024-03-11T10:00:00 nginx
docker logs --until 2024-03-11T12:00:00 nginx
日志驱动:
# 配置日志驱动(/etc/docker/daemon.json)
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3",
"compress": "true"
}
}
8. 安全相关命令
8.1 能力限制
# 删除所有能力,仅添加必要能力
docker run \
--cap-drop ALL \
--cap-add NET_BIND_SERVICE \
--cap-add CHOWN \
nginx
# 可用能力列表
docker run --cap-drop ALL --cap-add SYS_ADMIN nginx
# 警告:SYS_ADMIN 几乎等同于 root
Linux Capabilities:
| 能力 | 权限 | 风险等级 |
|---|---|---|
| NET_BIND_SERVICE | 绑定低端口 | ⭐ |
| CHOWN | 修改文件所有者 | ⭐⭐ |
| SYS_ADMIN | 系统管理 | ⭐⭐⭐⭐⭐ |
| NET_ADMIN | 网络配置 | ⭐⭐⭐⭐ |
| SYS_PTRACE | 进程追踪 | ⭐⭐⭐⭐ |
8.2 Security Options
# 禁用 Seccomp(不推荐生产环境)
docker run --security-opt seccomp=unconfined nginx
# 自定义 Seccomp 配置文件
docker run --security-opt seccomp=/path/to/seccomp.json nginx
# 禁用 AppArmor
docker run --security-opt apparmor=unconfined nginx
# 启用用户命名空间
docker run --userns=host nginx
8.3 镜像安全扫描
# 使用 Docker Scout(Docker 官方)
docker scout cves nginx:alpine
# 使用 Trivy(推荐)
trivy image nginx:alpine
# 输出示例:
# Total: 12 (UNKNOWN: 0, LOW: 5, MEDIUM: 4, HIGH: 2, CRITICAL: 1)
# ─────────────────────────────────────────────────────────────┐
# │ openssl │ CVE-2024-0727 │ HIGH │ 3.1.4-r0 │ → 3.1.4-r1 │
# ─────────────────────────────────────────────────────────────┘
9. 高级命令与最佳实践
9.1 docker commit:容器提交为镜像
# 修改容器后提交
docker exec nginx sh -c "echo custom > /usr/share/nginx/html/index.html"
docker commit nginx my-nginx:custom
# 警告:不推荐生产使用
# 原因:
# 1. 镜像不可复现
# 2. 镜像体积大
# 3. 版本管理困难
最佳实践:
# ✅ 推荐:使用 Dockerfile
FROM nginx:alpine
COPY index.html /usr/share/nginx/html/
9.2 docker export / docker import:容器导出导入
# 导出容器文件系统
docker export nginx > nginx.tar
# 导入为镜像
cat nginx.tar | docker import - my-nginx:imported
# 查看镜像历史(丢失)
docker history my-nginx:imported
# 只有一层,所有元数据丢失
使用场景:
- 迁移容器(不推荐,推荐用镜像仓库)
- 备份临时状态
9.3 docker system prune:系统清理
# 清理停止的容器、悬空镜像
docker system prune
# 清理所有未使用镜像
docker system prune -a
# 清理卷
docker system prune --volumes
# 清理构建缓存
docker builder prune
# 清理空间统计
docker system df
# 输出:
# TYPE TOTAL ACTIVE SIZE RECLAIMABLE
# Images 15 3 1.2GB 800MB (66%)
# Containers 5 2 50MB 30MB (60%)
# Volumes 10 5 200MB 100MB (50%)
10. 命令性能优化与内核原理
10.1 启动性能优化
优化对比:
# 基准测试
time docker run --rm alpine echo hello
# 优化前:800ms
# 优化后(使用 runC 直接调用):200ms
优化策略:
- 使用镜像预热(提前拉取)
- 启用BuildKit加速构建
- 使用本地镜像仓库
- 优化存储驱动(Overlay2 > AUFS)
10.2 网络性能优化
MTU 优化:
# 查看 MTU
ip link show docker0
# 设置 MTU(避免分片)
docker network create --opt com.docker.network.driver.mtu=1450 mynet
内核参数:
# 增加连接队列
sysctl -w net.core.somaxconn=65535
# 启用 TCP 快速回收
sysctl -w net.ipv4.tcp_tw_reuse=1
10.3 存储性能优化
存储驱动选择:
| 驱动 | 读性能 | 写性能 | 适用场景 |
|---|---|---|---|
| overlay2 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | 通用场景 |
| zfs | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | 企业级 |
| btrfs | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | 开发环境 |
| aufs | ⭐⭐⭐ | ⭐⭐⭐ | 遗留系统 |
Volume 性能:
# tmpfs(内存级性能)
docker run --tmpfs /app:size=1g nginx
# 绑定挂载(接近原生)
docker run -v /data/nginx:/usr/share/nginx/html nginx
# 命名卷(平衡)
docker run -v nginx-data:/usr/share/nginx/html nginx
11. 故障排查实战
11.1 容器无法启动
症状:
docker run nginx
# Error: OCI runtime error: container_linux.go:349
排查步骤:
- 查看详细错误:
docker run nginx 2>&1 | tee error.log
- 检查系统日志:
journalctl -u docker -f
dmesg | tail -50
- 验证内核兼容性:
uname -r
docker info | grep -i "storage driver"
- 检查 Namespace:
ls -la /proc/$$/ns/
# 确保所有 Namespace 可用
11.2 网络不通
症状:容器无法访问外网
排查:
# 1. 检查 iptables
iptables -L -n | grep docker
# 2. 检查 NAT 规则
iptables -t nat -L DOCKER
# 3. 测试 DNS
docker exec nginx nslookup google.com
# 4. 检查路由
docker exec nginx ip route
# 5. 抓包分析
docker exec nginx tcpdump -i eth0 -n port 80
11.3 内存泄漏
症状:容器内存持续增长
排查:
# 监控内存趋势
docker stats nginx --no-stream
# 检查 OOM 事件
dmesg | grep -i "out of memory"
# 分析进程
docker exec nginx ps aux --sort=-%mem
# 使用 valgrind(需要安装)
docker exec nginx valgrind --leak-check=full /path/to/app
12. 总结与速查表
12.1 核心命令速查
| 命令 | 用途 | 常用参数 |
|---|---|---|
docker run |
启动容器 | -d, -it, -p, -v, --name |
docker ps |
查看容器 | -a, -q, --format |
docker exec |
执行命令 | -it, -u, -w, -e |
docker logs |
查看日志 | -f, --tail, -t |
docker inspect |
检查详情 | -f |
docker stats |
资源监控 | --no-stream |
docker build |
构建镜像 | -t, --no-cache, --progress |
docker pull/push |
拉取/推送 | --all-tags |
docker network |
网络管理 | create, ls, inspect |
docker volume |
卷管理 | create, ls, inspect |
12.2 性能基准
典型操作耗时:
docker run: 400-800msdocker exec: 30-50msdocker stop: 100-500msdocker build(小项目): 30-60sdocker pull(100MB): 10-30s(取决于网络)
12.3 最佳实践清单
- 使用多阶段构建减小镜像体积
- 使用非 root 用户运行容器
- 设置资源限制(CPU、内存)
- 配置日志轮转
- 启用健康检查
- 使用命名卷持久化数据
- 定期清理未使用资源
- 扫描镜像安全漏洞
- 使用固定版本标签
- 编写 Docker Compose 文件
12.4 学习路径
- 入门:Docker 官方文档
- 进阶:《Docker 技术入门与实战》
- 深入:Linux 内核源码(Namespace、Cgroups)
- 实战:Kubernetes、Service Mesh
- 认证:Docker Certified Associate (DCA)
附录
A. 完整实验脚本
#!/bin/bash
# docker-lab.sh
echo "=== Docker 命令实验环境 ==="
# 1. 拉取镜像
docker pull nginx:alpine
# 2. 启动容器
docker run -d \
--name nginx-lab \
-p 8080:80 \
nginx:alpine
# 3. 验证运行
docker ps | grep nginx-lab
# 4. 测试连接
curl http://localhost:8080
# 5. 查看日志
docker logs nginx-lab
# 6. 进入容器
docker exec -it nginx-lab /bin/sh
# 7. 资源监控
docker stats nginx-lab --no-stream
# 8. 清理
docker stop nginx-lab
docker rm nginx-lab
echo "实验完成!"
B. 故障排查检查清单
- Docker Daemon 是否运行
- 磁盘空间是否充足
- 内存是否充足
- 网络配置是否正确
- 防火墙规则是否阻止
- SELinux/AppArmor 是否限制
- 镜像是否完整
- 容器日志是否有错误
C. 性能优化检查清单
- 使用 BuildKit 构建
- 多阶段构建
- 镜像层数最小化
- 使用 Alpine 基础镜像
- 清理 apt/yum 缓存
- 使用.dockerignore
- 并行构建
- 本地镜像缓存
版权声明:本文原创,转载请注明出处
参考资料:
- Docker 官方文档
- Linux Kernel 文档
- OCI 规范
- CNCF 云原生最佳实践
反馈与交流:
- 技术交流群:扫码加入
如果本文对您有帮助,欢迎点赞、收藏、转发!
更多推荐



所有评论(0)