1. Docker命令基础入门
作为现代应用开发和部署的核心工具,Docker的命令行接口是每个开发者必须掌握的技能。我第一次接触Docker时,面对众多命令选项也曾感到困惑,但通过实际项目的磨练,发现只要掌握核心命令组合,就能应对90%的日常场景。
Docker命令遵循标准的UNIX命令行风格,主要分为以下几类:
- 镜像管理(image)
- 容器操作(container)
- 网络配置(network)
- 数据卷管理(volume)
- 系统信息与日志(system/logs)
基础命令结构通常为:
bash复制docker [选项] 命令 [子命令] [参数]
重要提示:所有Docker命令都需要sudo权限或当前用户属于docker用户组。为避免每次输入sudo,建议执行
sudo usermod -aG docker $USER后重新登录。
2. 镜像操作全指南
2.1 镜像的获取与查询
获取镜像最常用的命令是docker pull,但实际使用中有许多实用技巧:
bash复制# 拉取指定版本的镜像(不指定tag默认为latest)
docker pull nginx:1.21-alpine
# 查看本地镜像列表(按大小排序显示)
docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}\t{{.Size}}" | sort -k 4 -h
# 搜索Docker Hub上的镜像(支持过滤条件)
docker search mysql --filter "is-official=true"
我曾遇到过一个典型问题:当需要部署特定版本的应用时,如果没有明确指定tag,可能会意外使用到最新的不稳定版本。因此强烈建议在生产环境中始终使用完整镜像名称(包含仓库和tag)。
2.2 镜像构建与推送
构建镜像是Docker的核心功能,docker build命令有一些关键参数:
bash复制# 使用当前目录的Dockerfile构建镜像
docker build -t myapp:v1 .
# 多阶段构建时指定目标阶段
docker build --target builder -t myapp:builder .
# 构建时传递环境变量
docker build --build-arg NODE_ENV=production -t myapp:prod .
镜像推送前需要先打标签并登录仓库:
bash复制docker tag myapp:v1 registry.example.com/myapp:v1
docker login registry.example.com
docker push registry.example.com/myapp:v1
3. 容器生命周期管理
3.1 容器启停与状态管理
启动容器时,参数组合直接影响应用行为:
bash复制# 启动一个交互式容器(退出后自动删除)
docker run -it --rm ubuntu bash
# 后台运行并映射端口
docker run -d -p 8080:80 --name webserver nginx
# 设置资源限制
docker run -d --memory="512m" --cpus="1.5" myapp
容器状态管理常用命令:
bash复制# 查看运行中的容器(-a显示所有状态)
docker ps -a --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"
# 优雅停止容器(发送SIGTERM信号)
docker stop webserver
# 强制终止容器(发送SIGKILL信号)
docker kill webserver
3.2 容器调试与交互
进入运行中容器的几种方式:
bash复制# 直接附加到主进程(适合单进程容器)
docker attach container_id
# 创建新的bash会话(推荐方式)
docker exec -it container_id bash
# 调试容器网络
docker exec -it container_id ping other_container
查看容器日志的技巧:
bash复制# 实时查看日志(--tail显示最后N行)
docker logs -f --tail=100 webserver
# 按时间过滤日志
docker logs --since 2023-01-01T00:00:00 webserver
# 以JSON格式输出日志
docker logs --format '{{.ID}} {{.Message}}' webserver
4. 数据持久化与网络配置
4.1 数据卷管理
数据卷是容器持久化存储的首选方案:
bash复制# 创建命名卷
docker volume create db_data
# 使用数据卷启动容器
docker run -d -v db_data:/var/lib/mysql mysql:8.0
# 查看卷详情
docker volume inspect db_data
# 备份数据卷(通过临时容器)
docker run --rm -v db_data:/source -v $(pwd):/backup busybox \
tar czf /backup/db_backup.tar.gz -C /source .
4.2 网络配置实践
Docker网络模式选择直接影响容器间通信:
bash复制# 创建自定义网络(默认创建bridge类型)
docker network create my_network
# 查看网络详情
docker network inspect my_network
# 将容器连接到网络
docker network connect my_network container1
# 测试容器间连通性
docker exec container1 ping container2
对于生产环境,我通常会创建自定义的bridge网络,而不是使用默认的bridge,因为自定义网络提供:
- 自动DNS解析(容器名互访)
- 更好的隔离性
- 可定制的子网和网关
5. 系统维护与问题排查
5.1 资源监控与清理
Docker系统资源管理命令:
bash复制# 查看系统资源使用情况
docker system df
# 显示详细的资源占用
docker stats --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}"
# 清理无用资源(谨慎使用!)
docker system prune -a --volumes
5.2 常见问题排查
当容器异常时,我常用的排查流程:
- 检查容器状态:
docker inspect --format='{{.State}}' container_id - 查看日志:
docker logs -t container_id - 检查网络连接:
docker exec -it container_id curl -v http://service:port - 分析进程:
docker top container_id - 对比镜像差异:
docker diff container_id
对于启动失败的容器,一个有用的技巧是覆盖entrypoint:
bash复制docker run -it --entrypoint sh failed_image
6. 高级命令与组合技巧
6.1 命令组合实践
通过命令组合可以完成复杂操作:
bash复制# 批量停止所有运行中的容器
docker stop $(docker ps -q)
# 删除所有退出的容器
docker rm $(docker ps -aq -f status=exited)
# 更新所有镜像
docker images | awk 'NR>1 {print $1":"$2}' | xargs -L1 docker pull
6.2 Docker Compose集成
虽然不属于基础命令,但实际工作中常与docker-compose配合使用:
bash复制# 启动服务栈
docker-compose up -d
# 查看服务日志
docker-compose logs -f service_name
# 执行服务中的命令
docker-compose exec service_name bash
7. 安全最佳实践
7.1 权限控制
安全使用Docker的关键点:
bash复制# 以非root用户运行容器
docker run -u 1000:1000 myapp
# 设置只读文件系统
docker run --read-only -v /tmp:/tmp:rw alpine
# 禁用特权模式
docker run --security-opt=no-new-privileges myapp
7.2 镜像扫描
定期扫描镜像漏洞:
bash复制# 使用内置扫描功能(需启用实验特性)
docker scan myapp:latest
# 输出漏洞报告
docker scan --json myapp:latest > scan_report.json
经过多个生产环境的实践验证,合理组合这些Docker命令可以构建高效可靠的工作流程。刚开始可能会觉得命令选项繁多,但掌握核心模式后,会发现Docker CLI设计其实非常符合UNIX哲学——每个命令做好一件事,通过组合解决复杂问题。
