Docker 学习篇(五)| Docker 常用命令
镜像管理
bash
docker images # 查看所有镜像
docker images -q # 只显示镜像 ID
docker pull 镜像名:版本 # 拉取镜像(不写版本默认 latest)
docker pull mysql:8.0 # 示例
docker rmi 镜像名:版本 # 删除镜像
docker rmi -f $(docker images -q) # 清空所有本地镜像(谨慎!)
docker tag 镜像ID 新名称:新标签 # 重命名/打标签
docker load -i 文件.tar # 从 tar 文件导入镜像
docker save -o 文件.tar 镜像名 # 导出镜像为 tar 文件
docker build -t 镜像名:标签 . # 从 Dockerfile 构建镜像
docker build --no-cache -t 镜像名:标签 . # 强制全量重建(不用缓存)
容器管理
bash
# 启动
docker run -d --name 容器名 -p 宿主机端口:容器端口 镜像名:版本
docker run -d --name blog-mysql -p 3307:3306 \
-e MYSQL_ROOT_PASSWORD=root \
-v D:/data/mysql:/var/lib/mysql \
--restart unless-stopped \
mysql:8.0 # 完整示例
# 查看
docker ps # 运行中的容器
docker ps -a # 所有容器(含已停止)
docker ps -q # 只显示运行中容器的 ID
# 生命周期
docker start 容器名 # 启动已存在的容器
docker stop 容器名 # 停止
docker restart 容器名 # 重启
docker rm 容器名 # 删除(必须先 stop)
docker rm -f 容器名 # 强制删除(不用先 stop)
docker rm -f $(docker ps -aq) # 删除所有容器(谨慎!)
# 资源监控
docker stats # 实时查看所有容器 CPU/内存/网络(Ctrl+C 退出)
docker stats 容器名 # 只看指定容器
# 自启策略
docker run --restart always ... # 启动时设自启
docker update --restart always 容器名 # 改已有容器的自启策略
docker update --restart no $(docker ps -q) # 取消所有容器自启
日志与排查
bash
docker logs 容器名 # 查看日志
docker logs -f 容器名 # 实时跟踪(Ctrl+C 退出)
docker logs --tail 50 容器名 # 只看最近 50 行
docker logs -tf 容器名 # 带时间戳实时跟踪
docker logs -f --tail 100 容器名 # 最后 100 行开始实时跟踪
docker exec -it 容器名 bash # 进入容器(alpine 镜像用 sh)
docker exec -it 容器名 sh # alpine 系镜像用这个
docker top 容器名 # 查看容器内进程
docker inspect 容器名 # 查看容器完整配置(JSON)
docker inspect -f '{{.State.Pid}}' 容器名 # 只看 PID
文件操作
bash
# 宿主机 → 容器
docker cp 宿主机路径 容器名:容器路径
docker cp app.jar blog-server:/app/app.jar
# 容器 → 宿主机
docker cp 容器名:容器路径 宿主机路径
docker cp blog-server:/app/logs ./logs
# 容器内目录参考
# 后端应用:取决于 Dockerfile 的 WORKDIR,常见 /app 或 /
# 前端静态文件:/usr/share/nginx/html(Nginx 默认)
# 不确定的话先 docker exec -it 进去看一下
网络
bash
docker network ls # 查看所有网络
docker network create 网络名 # 创建自定义网络
docker network inspect 网络名 # 查看网络详情(含容器列表和 IP)
docker network rm 网络名 # 删除网络
docker run --network 网络名 ... # 指定容器加入某网络
# compose 自动建网络:默认 <项目名>_default;自定义网络(如 blog-net)→ <项目名>_blog-net
# 同一网络内,service 名 = DNS 域名,容器间直接用服务名互访
Docker Compose
bash
docker compose up -d # 启动所有服务
docker compose down # 停止并删除容器+网络(加 -v 同时删数据卷)
docker compose stop # 只停止,不删除
docker compose restart # 重启所有服务
docker compose restart 服务名 # 重启单个服务
docker compose ps # 看当前项目容器状态
docker compose logs -f # 所有容器日志
docker compose logs -f 服务名 # 只看某个服务日志
docker compose exec 服务名 bash # 进入 compose 管理的容器(alpine 用 sh)
docker compose build # 构建/重新构建所有服务的镜像
docker compose build 服务名 # 只构建指定服务
docker compose up -d --build # 重建镜像再启动
docker compose up -d --force-recreate --build # 强制重建所有容器
docker compose -f 指定文件.yml up -d # 用指定 yml 文件启动
docker compose pull # 拉取 compose 中所有镜像(不启动)
docker compose config # 校验 yml 文件语法是否正确
改 yml 配置后重跑
up -d,没变的服务不动,变了的自动重建。改源码则需要加--build重新构建镜像。
清理
bash
docker system df # 查看 Docker 占用磁盘空间
docker system prune # 清理停止的容器、未用网络、悬空镜像
docker system prune -a # 加上所有未用镜像一起清
docker volume prune # 清理未挂载的数据卷
docker builder prune # 清理构建缓存
先
docker system df看一下占用,再决定清什么。每月跑一次prune,磁盘告急跑-a。
容器卡死抢救
docker stop / docker kill 都不响应时:
bash
# 1. 获取容器主进程 PID(两行在同一 shell 会话执行)
PID=$(docker inspect -f '{{.State.Pid}}' 容器名或ID)
kill $PID
# 如果 kill 不响应,升级为强杀:kill -9 $PID
# 2. 确认已停止
docker ps -a
# 3. 清理并重建
docker rm -f 容器名
docker compose up -d
镜像文件导入导出(tar.gz 处理)
bash
# 导出
docker save -o 镜像.tar 镜像名:标签
# 导入
docker load -i 镜像.tar
# 如果是 .tar.gz 格式
gunzip -c 镜像.tar.gz | docker load # 管道方式(最可靠)
docker load -i 镜像.tar.gz # 部分新版 Docker 支持直接导入 gz
# 判断文件真实类型
file 镜像.tar.gz
# 输出 "POSIX tar archive" → 实际是 .tar(被人改了后缀)
# 输出 "gzip compressed data" → 真正的 .tar.gz