1. Docker基础命令解析与实战应用
作为容器化技术的核心工具,Docker命令行是每个开发者必须掌握的技能。我在实际项目运维中发现,80%的日常操作都集中在20%的核心命令上,但这些命令的隐藏用法往往能解决关键问题。本文将拆解最常用的12个Docker命令及其高阶用法,包含近三年Docker版本更新带来的新特性。
1.1 容器生命周期管理
docker run 是最基础的命令,但多数人只用了它30%的功能。除了常见的-d后台运行和-p端口映射,这几个参数在复杂场景特别有用:
bash复制# 限制容器内存为1G并自动重启
docker run -m 1g --restart=on-failure:5 nginx
# 绑定宿主机的systemd日志驱动
docker run --log-driver=journald alpine
# 设置容器退出时自动清理资源
docker run --rm -it ubuntu bash
经验:生产环境务必使用
--restart策略,避免服务意外终止。但要注意always和unless-stopped的区别,后者在手动停止后不会自动重启。
容器状态管理三连命令也有玄机:
bash复制# 显示完整容器ID(用于脚本处理)
docker ps --no-trunc
# 强制删除运行中的容器(慎用)
docker rm -f $(docker ps -aq)
# 优雅停止容器(发送SIGTERM信号)
docker stop -t 30 my_container
1.2 镜像操作深度技巧
镜像分层机制直接影响构建效率,这几个命令能优化CI/CD流程:
bash复制# 显示镜像各层大小(排查体积膨胀)
docker history --human nginx:latest
# 跨机器镜像迁移(不依赖仓库)
docker save nginx | gzip > nginx.tar.gz
docker load < nginx.tar.gz
# 清理悬空镜像(节省磁盘空间)
docker image prune -f
我曾用--squash参数将生产镜像从1.2GB压缩到800MB,但要注意这会破坏分层缓存机制。
1.3 网络与存储配置实战
Docker网络问题占运维问题的40%,这些命令能快速定位问题:
bash复制# 查看容器网络详情(替代ifconfig)
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' web
# 创建带子网的自定义网络
docker network create --subnet=172.20.0.0/16 my_net
# 诊断端口冲突
docker network inspect bridge | grep -A 10 "Ports"
卷管理是持久化存储的关键:
bash复制# 创建带标签的卷(方便管理)
docker volume create --label env=prod db_data
# 备份命名卷数据(无需进入容器)
docker run --rm -v db_data:/source -v $(pwd):/backup alpine \
tar czf /backup/db.tar.gz -C /source .
1.4 容器调试与监控
当容器行为异常时,这些命令比docker logs更有效:
bash复制# 实时查看容器资源占用
docker stats --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}"
# 不进入容器执行命令(调试神器)
docker exec -e DEBUG=true app cat /etc/hosts
# 导出容器文件系统(取证分析)
docker export angry_elion > container_fs.tar
对于Java应用,附加jmap工具的方法很实用:
bash复制docker run --cap-add=SYS_PTRAC
