Docker常用命令速查表:收藏这一篇就够了
我日常维护好几台服务器,Docker用了很多年,踩了不少坑。这篇把最常用的命令整理出来,按场景分类,方便自己查阅,也分享给需要的朋友。
前言
去年有一次服务器磁盘满了,查了半天最后发现是Docker镜像和容器占了几十G,一个docker system prune -a直接释放了20G+。从那以后我就养成了定期清理的习惯。
我现在服务器上的服务基本全部容器化了——Jenkins、MySQL、Nginx,还有一些公司的自动化测试平台服务。配合Portainer做可视化管理,日常维护确实省心不少。
下面是我工作中高频使用的命令,没有废话,直接复制能用。
一、镜像操作
# 搜索镜像
docker search nginx
# 拉取镜像(建议指定版本)
docker pull nginx:1.25
docker pull mysql:8.0
# 查看本地镜像
docker images
docker images -a # 包括中间层
# 删除镜像
docker rmi nginx:1.25
docker rmi $(docker images -q) # 删除所有(慎用!)
# 镜像导出/导入(内网环境经常用)
docker save -o nginx.tar nginx:1.25
docker load -i nginx.tar
踩坑提醒:千万别用latest标签。上次公司有个服务因为latest自动更新挂了,排查了两个小时才发现是新版本不兼容。从那以后所有镜像我都锁死版本号。
二、容器生命周期
# 创建并启动
docker run -d --name my-nginx -p 80:80 nginx
# 生产环境常用参数组合(我给公司搭服务基本都用这个模板)
docker run -d \
--name mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=your_password \
-v /data/mysql:/var/lib/mysql \
--restart=always \
mysql:8.0
--restart=always 这个一定要加,我之前有次服务器重启忘了手动起容器,导致CI流水线全挂,运维群炸了。
# 查看容器
docker ps
docker ps -a # 包括已停止的
# 启停
docker start my-nginx
docker stop my-nginx
docker restart my-nginx
# 删除
docker rm my-nginx
docker rm -f my-nginx # 强删运行中的(别在生产环境随便用)
三、进入容器
# 推荐:exec(退出不影响容器)
docker exec -it my-nginx /bin/bash
docker exec -it my-nginx /bin/sh # alpine镜像没有bash,用sh
# 执行单条命令
docker exec my-nginx cat /etc/nginx/nginx.conf
# 文件复制(调试配置文件时经常用)
docker cp my-nginx:/etc/nginx/nginx.conf ./nginx.conf
docker cp ./nginx.conf my-nginx:/etc/nginx/nginx.conf
我经常改完Nginx配置先copy出来,改好了再copy回去,
docker restart一下就生效。比每次都进去vi方便多了。
四、日志与调试
这部分是我用得最多的。线上出问题第一件事就是看日志。
# 查看日志
docker logs my-nginx
docker logs -f my-nginx # 实时跟踪(排查问题必用)
docker logs --tail 100 my-nginx # 最后100行
docker logs --since 30m my-nginx # 最近30分钟
# 查看容器详情
docker inspect my-nginx
# 资源占用
docker stats
docker stats --no-stream # 打印一次就退出,适合写脚本监控
有时候容器日志太大,我会配合Goaccess生成可视化的HTML报告:
# 把容器日志导出来分析
docker logs my-nginx > access.log
goaccess access.log -o report.html --log-format=COMBINED --real-time-html
Goaccess这块我之前单独写过笔记,配合Nginx日志分析效果很好,能直观看到哪些接口慢、哪些IP访问异常。
五、网络管理
# 创建自定义网络
docker network create my-network
# 容器加入网络(可以用容器名互访)
docker run -d --name app --network my-network my-app
docker run -d --name db --network my-network mysql:8.0
# 查看网络详情
docker network inspect my-network
经验教训:别用容器IP互访,容器重启IP会变,服务就挂了。用自定义网络+容器名是最稳的方案。之前公司有个服务因为hardcode了容器IP,rebuild之后怎么都连不上数据库,查了半天才发现这个问题。
六、数据卷
docker volume create mysql-data
docker volume ls
docker volume inspect mysql-data
docker volume prune # 清理未使用的卷(释放空间)
七、Docker Compose
单个容器还好,服务多了之后compose是刚需:
docker compose up -d # 启动所有服务
docker compose down # 停止并删除
docker compose logs -f # 查看所有服务日志
docker compose restart mysql # 重启单个服务
docker compose ps # 服务状态
我现在搭测试环境基本都是先写docker-compose.yml,一条命令把MySQL、Redis、Nginx全拉起来。比手动一个个run方便太多了。
八、清理磁盘
# 按需清理
docker container prune # 停止的容器
docker image prune -a # 未使用的镜像
# 一键大扫除(释放空间神器)
docker system prune -a
# 查看磁盘占用
docker system df
我建议在crontab里加一个每月自动清理:
# 每月1号凌晨3点自动清理
0 3 1 * * docker system prune -af >> /var/log/docker-prune.log 2>&1
最后
这些命令基本覆盖了我日常80%的Docker操作场景。建议大家收藏备用,用的时候Ctrl+F搜关键词就行。
有问题欢迎评论区交流,互相学习 👋