Docker 常用命令完全手册
本文整理了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+P再Ctrl+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)