1. Docker 基础信息与系统管理
1.1 版本与环境检查
作为容器化技术的核心工具,Docker版本信息检查是日常运维的第一步。执行docker --version不仅能查看当前安装的Docker版本,还能确认CLI是否正常可用。这里有个细节:社区版(CE)和企业版(EE)的命令输出会有差异,CE版通常显示"Docker version 20.10.17, build 100c701",而EE版会包含"enterprise"标识。
更全面的系统信息可以通过docker info获取,这个命令会返回包括:
- 容器和镜像数量
- 存储驱动类型(推荐overlay2)
- Cgroup驱动(建议与Kubernetes一致使用systemd)
- 镜像仓库地址(国内用户常需要配置镜像加速)
注意:当发现镜像拉取缓慢时,应该检查
docker info输出中的Registry Mirrors是否配置了国内镜像源,如阿里云或腾讯云的加速地址。
1.2 资源监控与优化
随着容器数量增加,资源管理变得至关重要。docker system df命令以表格形式展示磁盘使用情况,包括:
- 镜像占用空间(包括共享层)
- 容器写入层大小
- 本地卷使用量
- 可回收空间统计
对于实时监控,docker stats命令会动态显示所有运行中容器的:
- CPU使用率(注意多核情况下的百分比计算)
- 内存占用(包括硬限制和实际使用)
- 网络IO(进出流量)
- 块设备IO
实操技巧:添加
--no-stream参数可以获取单次快照,适合写入监控系统。生产环境中建议配合cAdvisor或Prometheus实现长期监控。
2. 镜像(Image)深度管理
2.1 镜像生命周期操作
基础镜像操作看似简单,但有许多隐藏细节:
docker images默认只显示顶层镜像,添加-a参数会显示所有中间层- 使用
--filter可以按条件过滤,如docker images --filter "dangling=true"找出悬空镜像 docker pull时指定完整地址格式为[仓库URL]/[命名空间]/镜像名:标签,省略部分会使用默认值
镜像删除命令docker rmi有几个关键点:
- 被容器引用的镜像无法直接删除(除非加
-f强制删除) - 批量删除可以使用
docker rmi $(docker images -q)但需谨慎 - 真正释放空间需要执行
docker image prune清理悬空镜像
2.2 镜像构建与优化
docker build命令的.参数指定构建上下文路径,常见进阶用法包括:
-f指定非默认的Dockerfile路径--build-arg传递构建参数--target多阶段构建时指定目标阶段
构建优化建议:
- 合理使用
.dockerignore文件减少上下文大小 - 多阶段构建分离编译环境和运行环境
- 合并RUN指令减少镜像层数
- 固定基础镜像版本避免不可控更新
避坑指南:构建时遇到
no space left on device错误,可能是Docker的存储空间不足,需要清理或调整存储驱动配置。
3. 容器(Container)实战技巧
3.1 容器基础操作
docker run是最复杂的命令之一,常用参数组合示例:
bash复制docker run -d \
--name myapp \
-p 8080:80 \
-v /data:/app/data \
--restart unless-stopped \
-e ENV_MODE=production \
--memory 512m \
--cpus 1.5 \
nginx:1.21-alpine
各参数含义:
-d:后台运行(detach模式)-p:端口映射(主机端口:容器端口)-v:卷挂载(支持ro只读挂载)--restart:定义容器退出时的重启策略-e:设置环境变量- 资源限制参数避免单个容器耗尽主机资源
3.2 容器调试与维护
进入容器的docker exec命令有多个变体:
- 普通shell交互:
docker exec -it [容器] /bin/bash - 快速执行命令:
docker exec [容器] ls /app - 低权限用户:
docker exec -u www-data [容器] whoami
日志查看的进阶技巧:
--tail参数限制显示行数--since和--until按时间过滤- 结合
grep过滤关键信息:docker logs [容器] | grep ERROR
经验分享:对于Java应用,使用
docker exec [容器] jstack [PID]可以获取线程堆栈,无需进入容器。
4. 网络与存储高级配置
4.1 网络管理实践
Docker网络类型对比:
| 网络类型 | 特点 | 适用场景 |
|---|---|---|
| bridge | 默认网络,NAT转发 | 单机容器通信 |
| host | 共享主机网络栈 | 高性能需求 |
| overlay | 跨主机虚拟网络 | Swarm/K8s集群 |
| macvlan | 直接分配MAC地址 | 需要直连物理网络 |
创建自定义网络的优势:
- 自动DNS解析容器名称
- 更好的隔离性
- 支持网络范围的配置(如MTU大小)
4.2 数据持久化方案
数据卷(Volume)与绑定挂载(bind mount)的区别:
- 卷由Docker管理,绑定挂载直接操作主机文件系统
- 卷支持更多驱动(如NFS、CSI插件)
- 绑定挂载性能更好但移植性差
关键命令示例:
bash复制# 创建带标签的卷
docker volume create --label env=prod db-data
# 挂载时设置权限
docker run -v db-data:/var/lib/mysql:ro ...
# 备份卷数据
docker run --rm -v db-data:/source -v $(pwd):/backup alpine \
tar czf /backup/db.tar.gz -C /source .
5. 系统维护与性能调优
5.1 资源清理策略
不同级别的清理命令:
docker container prune:仅清理停止的容器docker system prune:清理容器、网络、悬空镜像和构建缓存docker system prune -a:额外清理未使用的镜像
安全清理建议:
- 先使用
--dry-run参数预览将被删除的对象 - 重要数据卷添加
--filter "label!=preserve"保护 - 生产环境建议在低峰期执行清理
5.2 性能优化要点
存储驱动选择建议:
- Linux首选
overlay2 - Windows用
windowsfilter - 避免使用已弃用的
aufs和devicemapper
关键配置调整:
json复制// /etc/docker/daemon.json
{
"storage-driver": "overlay2",
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 65535,
"Soft": 65535
}
}
}
6. 生产环境最佳实践
6.1 安全加固措施
基础安全建议:
- 定期更新Docker版本修复CVE
- 避免容器以root用户运行(使用
--user参数) - 限制容器能力(
--cap-drop ALL --cap-add NET_BIND_SERVICE) - 只读文件系统(
--read-only)配合tmpfs挂载临时目录
镜像扫描工具:
docker scan集成Snyk引擎- Trivy开源扫描工具
- 各云平台提供的安全扫描服务
6.2 编排系统准备
虽然单机Docker足够强大,但了解基本编排概念有助于平滑过渡:
- Docker Compose用于定义多容器应用
- Swarm模式提供原生集群能力
- Kubernetes成为行业标准编排平台
常用Compose片段示例:
yaml复制services:
web:
image: nginx:alpine
deploy:
resources:
limits:
cpus: '0.5'
memory: 256M
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 3
掌握这些命令只是开始,真正的Docker专家需要理解每个参数背后的原理,并根据实际场景灵活组合。我在使用Docker的五年中最大的体会是:简单场景下保守配置,复杂需求时充分测试。容器化不是银弹,但合理使用确实能极大提升开发和运维效率。