Docker 常用命令完全手册

AI 总结

本文整理了Docker常用命令,涵盖服务管理、镜像操作、容器运行与启停、进入容器、构建提交、数据卷及一键清空环境,并重点提示易错坑点:attach退出会停容器而exec不会,-it启动退出即停,数据卷挂载Permission denied可用--privileged=true但慎用,restart策略推荐unless-stopped,save/load用于镜像,export/import用于容器,清空命令需谨慎。

自己平时折腾服务器、搭环境,Docker 几乎是离不开的工具。但命令一多就容易记混,尤其 attach 和 exec 有啥区别、数据卷挂载报 Permission denied,都踩过好几次坑。于是把常用命令整理成一份速查手册,顺便把那些容易踩的坑标出来,分享给大家,需要时直接查看。

一、服务管理命令

Docker 本身是靠 systemd 托管的,下面这组是启停服务最常用的:

启动Docker服务:systemctl start docker
停止Docker服务:systemctl stop docker
重启Docker服务:systemctl restart docker
查看Docker服务状态:systemctl status docker
设置Docker开机自启:systemctl enable docker
关闭Docker开机自启:systemctl disable docker

二、镜像操作

拉取镜像:docker pull <image_name>
列出本地镜像:docker images [-a 全部 | -q 只显示ID]
删除镜像:docker rmi <image_id>
导入镜像:docker load -i /path/to/images.tar
导出镜像:docker save nginx:latest | gzip > nginx.tar.gz

提醒:docker images -q 常配合批量命令用,比如一键删镜像时当参数喂进去。导出用 save,导入用 load,别和下面容器的 export/import 搞混了。

三、容器的运行与启停

运行容器:docker run <image_name>          # 无镜像会先下载
创建但不启动:docker create <image_name>
列出运行中的容器:docker ps [-q 只显示ID]
列出所有容器:docker ps -a
启动容器:docker start <container_id>
停止容器:docker stop <container_id>
删除容器:docker rm <container_id>          # 运行中需加 -f

run 常用参数

--name myname      容器名字
-c                 指定使用cpu的份额
-d                 后台运行并返回ID(守护进程式)
-i                 交互方式运行,通常和 -t 一起
-t                 分配伪终端(启动交互式容器)
-p 宿主机端口:容器端口   映射端口
-P                 随机指定端口
-v 宿主机路径:容器路径   挂载存储卷

两种启动方式(这里很容易混)

# 第一种:交互方式,退出后容器直接关闭
docker run -it 镜像名称:标签 /bin/bash

# 第二种:守护进程方式,后台运行,不会自动退出
docker run -id 镜像名称:标签
# 之后想进去再执行:
docker exec -it 容器名称 /bin/bash

易错提醒:用 -it 起的容器,你一退出(exit)容器就停了。想让它常驻后台跑服务,一定要用 -d

启动策略(restart)

容器挂了要不要自动拉起来、开机要不要自动起,全靠这个参数:

no                 默认,不自动重启
on-failure[:max]   非正常退出(exit≠0)才重启,可限重试次数
always             无论退出状态都重启
unless-stopped     总是重启,除非你手动 stop(最推荐自启)

# 修改已存在容器的策略:
docker update --restart=unless-stopped my-nginx

选哪个:想开机自启又怕手动 stop 后被强制拉起,用 unless-stopped 最稳妥;always 则是你 stop 了它也会马上复活。

四、进入容器与排查问题

进入容器:docker exec -it <container_id> /bin/bash
看日志:docker logs <container_id>
看进程:docker top <container_id>
看详情:docker inspect <container_id>
改名:docker rename 旧名 新名
杀容器:docker kill <container_id>
拷文件:docker cp 容器id:容器内路径 目的主机路径
  • exec 还是 attach?这是个高频坑
  • attach 连接一断,容器就跟着退出了;exec 不会。
  • attach 进的是正在跑的终端、不新开进程;exec 会开个新终端随便折腾。
  • 想退出容器但不让它停,按 Ctrl+PCtrl+Q,别直接 exit。

五、镜像的构建与提交

复制并改名:docker tag 镜像名:版本 新镜像名:版本
容器做成镜像:docker commit -a "作者" -m "说明" 容器ID 名字:版本
构建镜像:docker build -t 名字:标签 /path/to/dir
(Dockerfile 名为 Dockerfile 时不用 -f;否则 -f 指定)

误删容器能救:平时用 docker export 把容器导成 tar 备份,万一手滑 rm 了,用 cat 备份 | docker import - 用户/名:版本 就能恢复。生产环境这招很实用。

六、数据卷(最容易踩坑的一节)

挂载数据卷,让容器里的数据落盘到宿主机,不随容器删而丢:

# 指定路径挂载
docker run -it -v 主机目录:容器目录 /bin/bash
# 匿名挂载(只给容器路径)
docker run -d -P --name=nginxt01 -v /etc/nginx nginx
# 具名挂载(给卷名)
docker run -d -P --name=nginxt02 -v volumname:/etc/nginx nginx
# 改读写权限
docker run -d --name nginx01 -v test01:/etc/nginx:ro nginx   # 只读
docker run -d --name nginx01 -v test01:/etc/nginx:rw nginx   # 可读写

挂载报 Permission denied:宿主机目录访问被拒时,可在挂载后加 --privileged=true 解燃眉之急。但这个参数等于给容器 root 级权限,慎用;正解是去改对应目录的权限。挂载类型分不清时记住:-v 容器内路径 是匿名,-v 卷名:容器内路径 是具名,-v 宿主机路径:容器内路径 是指定路径。用 docker inspect 容器ID 看 Mounts 字段就能确认挂在哪了。

七、一键清空环境(慎用)

docker rm -f $(docker ps -aq)        # 删掉所有容器
docker rmi -f $(docker images -aq)   # 删掉所有镜像

血泪教训:这两条是「格式化」级别的命令,-f 强制、不询问。跑之前一定确认当前机器是不是你要清的那台,别在正式环境手滑。

评论 (0)