1. Docker命令核心操作指南
作为容器化技术的实际应用者,我整理了一份经过生产环境验证的Docker命令手册。这份指南不仅包含基础命令,更着重分享我在实际运维中积累的实战技巧和避坑经验。
1.1 容器生命周期管理
启动容器的标准命令是docker run,但有几个关键参数常被忽略:
docker run -dit --name my_container \ --cpu-quota=50000 \ --memory=1g \ --restart=unless-stopped \ -v /host/path:/container/path:ro \ -p 8080:80 \ my_image:tag重要提示:生产环境务必设置资源限制(--memory/--cpu-quota),避免单个容器耗尽主机资源。我曾遇到过因未设内存限制导致整个宿主机OOM崩溃的案例。
容器状态监控推荐组合命令:
docker stats --no-stream | grep -v "0B \/ 0B" watch -n 2 docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}"1.2 镜像管理进阶技巧
构建镜像时有个容易被忽视的优化点——层合并。这是我在CI/CD流水线中总结的Dockerfile优化方案:
FROM alpine:3.14 AS builder RUN apk add --no-cache build-deps && \ make install && \ apk del build-deps # 同一RUN指令中清理临时文件 FROM alpine:3.14 COPY --from=builder /usr/local/bin/app /app镜像清理的智能方案(保留最近3个版本):
docker images | grep my_image | awk '{print $3}' | tail -n +4 | xargs docker rmi1.3 网络与存储配置实战
创建自定义网络时,建议指定子网防止IP冲突:
docker network create \ --driver=bridge \ --subnet=172.28.0.0/16 \ --gateway=172.28.0.1 \ my_network数据卷管理的高效命令组合:
# 查找占用空间最大的卷 docker system df -v | grep -v "0B" | sort -k3 -h # 安全删除未使用卷(先dry-run验证) docker volume prune --filter "label!=keep" --dry-run2. 生产环境问题排查手册
2.1 日志分析三板斧
- 实时日志追踪(带时间戳和高亮):
docker logs -f --tail=100 my_container | awk '{print "[",strftime("%Y-%m-%d %H:%M:%S"),"]",$0}' | grep --color -E "error|fail|warn|$"- 日志统计(按错误类型分类):
docker logs --since 24h my_container 2>&1 | awk '/ERROR/{a[$5]++}END{for(i in a)print i,a[i]}' | sort -nrk2- 多容器日志关联查询:
for c in $(docker ps -q); do echo "=== $c ==="; docker logs --since 1h $c | grep "transaction_id"; done2.2 性能问题诊断
内存泄漏检测方法:
watch -n 5 "docker stats --no-stream | awk '{print \$1,\$3,\$4}' | column -t"结合top命令深入分析:
docker top my_container -o pid,cmd,%cpu,%mem --sort -%cpu | head -102.3 网络连通性测试
容器内网络诊断技巧:
docker exec -it my_container sh -c "curl -v http://service:port 2>&1 | grep -i 'Connected to'"跨容器网络测试方案:
docker run --rm --network container:target_container nicolaka/netshoot \ curl -I http://service:port3. 高效运维技巧合集
3.1 批量操作模板
安全停止并删除所有容器:
docker ps -aq | xargs -I{} docker stop {} && docker ps -aq | xargs docker rm批量更新镜像的智能脚本:
docker images --format "{{.Repository}}:{{.Tag}}" | grep -v "<none>" | while read img; do docker pull $img | grep -q "Downloaded newer image" && echo "Updated $img" done3.2 安全加固要点
容器用户权限控制:
docker run -u 1001:1001 --read-only my_image # 使用非root用户+只读模式敏感文件挂载保护:
docker run -v /etc/passwd:/tmp/passwd:ro -v /etc/group:/tmp/group:ro alpine cat /tmp/passwd3.3 可视化监控方案
使用cAdvisor+Prometheus的快速搭建:
docker run -d \ --name=cadvisor \ --volume=/:/rootfs:ro \ --volume=/var/run:/var/run:ro \ --volume=/sys:/sys:ro \ --volume=/var/lib/docker/:/var/lib/docker:ro \ --publish=8080:8080 \ google/cadvisor:latest4. 常见问题速查表
| 问题现象 | 排查命令 | 典型解决方案 |
|---|---|---|
| 容器启动失败 | docker inspect --format='{{.State.Error}}' 容器ID | 检查挂载路径权限或端口冲突 |
| 磁盘空间不足 | docker system df | 执行docker system prune -a --volumes |
| 网络不通 | docker network inspect 网络名 | 检查子网是否冲突 |
| 性能下降 | docker stats 容器ID | 调整CPU/Memory限制 |
| 镜像拉取失败 | `docker info | grep -i proxy` |
5. 高级应用场景
5.1 多阶段构建优化
Java应用构建示例:
FROM maven:3.8.4-openjdk-11 AS build COPY . /app RUN mvn -f /app/pom.xml clean package FROM openjdk:11-jre-slim COPY --from=build /app/target/*.jar /app.jar ENTRYPOINT ["java","-jar","/app.jar"]5.2 容器调试技巧
使用nsenter直接进入容器命名空间:
docker inspect --format '{{.State.Pid}}' 容器ID | xargs -I{} nsenter -t {} -n ip a5.3 镜像安全扫描
集成Trivy进行漏洞检测:
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \ aquasec/trivy image --severity CRITICAL my_image:tag6. 性能调优参数
内存限制的精细控制:
docker run -it --memory="1g" --memory-swap="2g" --memory-swappiness=0 alpineCPU分配策略优化:
docker run -it --cpus="1.5" --cpu-shares=512 --cpuset-cpus="0-3" nginxIO带宽限制方案:
docker run -it --device-read-bps=/dev/sda:1mb --device-write-bps=/dev/sda:1mb alpine7. 跨平台部署方案
Windows容器特殊配置:
docker run --isolation=process -v C:\data:D:\data mcr.microsoft.com/windows/servercore:ltsc2019ARM平台构建技巧:
docker buildx build --platform linux/arm64 -t my_image:arm64 .8. 企业级实践
私有仓库的TLS配置:
docker run -d \ -v /certs:/certs \ -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \ -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \ -p 5000:5000 \ --name registry \ registry:2容器日志的ELK集成:
docker run -d --log-driver=gelf --log-opt gelf-address=udp://logserver:12201 nginx9. 开发环境技巧
快速搭建测试环境:
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d实时代码热加载配置:
docker run -v $(pwd):/app -e CHOKIDAR_USEPOLLING=true node:14 npm run dev10. 命令自动补全
安装bash补全脚本:
curl https://raw.githubusercontent.com/docker/cli/master/contrib/completion/bash/docker -o /etc/bash_completion.d/docker source ~/.bashrcPowerShell补全配置:
Register-ArgumentCompleter -CommandName docker -ScriptBlock { param($wordToComplete, $commandAst, $cursorPosition) docker --help | Where-Object { $_ -like "$wordToComplete*" } | ForEach-Object { [Management.Automation.CompletionResult]::new($_) } }