Docker 常用命令
西瓜猿 8/1/2019 Docker
# Docker 常用命令
本篇作为速查手册,按 系统信息 / 镜像 / 容器 / 数据卷 / 网络 / 仓库 / 清理 分组整理。 使用规范:
[]为可选参数,<>为必填参数,|表示"或"。
# 系统信息
# 查看 Docker 版本
# 查看 Docker 客户端 + 服务端版本
docker version
# 只查看版本号
docker --version
1
2
3
4
5
2
3
4
5
# 查看 Docker 系统信息
# 查看容器数量、镜像数量、存储驱动、Cgroup、内核版本等
docker info
1
2
2
# 查看磁盘占用
# 查看镜像、容器、数据卷、构建缓存所占空间
docker system df
# 更详细的占用列表
docker system df -v
1
2
3
4
5
2
3
4
5
# 帮助命令
# 查看所有命令
docker --help
# 查看某个子命令的用法
docker <command> --help
# 例:
docker run --help
docker image --help
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 镜像相关
# 从 Docker 文件构建 Docker 镜像
# -t 指定镜像名和 tag,最后的 . 表示上下文目录(Dockerfile 所在目录)
docker build -t <image-name>:<tag> <dockerfile-directory>
# 例:
docker build -t myapp:v1 .
# -f 指定非默认名字的 Dockerfile
docker build -f Dockerfile.prod -t myapp:prod .
# --no-cache 不使用构建缓存,强制重新构建
docker build --no-cache -t myapp:v1 .
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 查看本地镜像
# 列出所有顶层镜像
docker images
# 等价于
docker image ls
# -a 显示所有镜像(含中间层镜像)
docker images -a
# -q 只显示镜像 ID(常与其他命令组合使用)
docker images -q
# 按仓库名过滤
docker images nginx
# 按条件过滤(虚悬镜像)
docker images -f dangling=true
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 搜索镜像
# 从 Docker Hub 搜索镜像
docker search <keyword>
# 例:只显示 star 数 >= 100 的
docker search --filter=stars=100 nginx
1
2
3
4
5
2
3
4
5
# 拉取镜像
# 默认从 Docker Hub 拉取 latest
docker pull <image-name>
# 拉取指定 tag
docker pull nginx:1.25
# 从指定仓库拉取
docker pull registry.cn-hangzhou.aliyuncs.com/library/nginx:latest
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 推送镜像
# 推送到镜像仓库前需要先登录
docker login [registry-url]
# 打 tag(格式:用户名/镜像名:tag)
docker tag <image-id | image-name> <username>/<repo>:<tag>
# 推送
docker push <username>/<repo>:<tag>
# 退出登录
docker logout [registry-url]
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 给镜像打标签
# 为已有镜像新增一个标签(不会复制镜像,只是加一个引用)
docker tag <source-image>[:tag] <target-image>[:tag]
# 例:
docker tag nginx:latest my-nginx:v1
1
2
3
4
5
2
3
4
5
# 查看镜像详情
# 查看镜像的详细信息(JSON 格式)
docker inspect <image-id | image-name>
# 使用 --format 提取指定字段
docker inspect --format='{{.Os}}/{{.Architecture}}' nginx
1
2
3
4
5
2
3
4
5
# 查看镜像构建历史
# 查看镜像的每一层构建历史
docker history <image-name>
# --no-trunc 显示完整信息(不截断)
docker history --no-trunc <image-name>
1
2
3
4
5
2
3
4
5
# 导入 / 导出镜像
# 将镜像保存为 tar 包(可带多个镜像)
docker save -o <file.tar> <image-name>[:tag]
# 例:
docker save -o nginx.tar nginx:latest
# 从 tar 包加载镜像
docker load -i <file.tar>
# 或
docker load < nginx.tar
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
save/load与export/import的区别:
save/load操作的是 镜像,会保留完整的层、历史、元数据。export/import操作的是 容器,导出的是文件系统的快照,会丢失所有层信息,导入后是一个新的单层镜像。
# 删除镜像
# 删除一个镜像
docker rmi <image-name | image-id>
# 等价于
docker image rm <image-name | image-id>
# 强制删除(即使有容器在使用该镜像)
docker rmi -f <image-name | image-id>
# 删除所有镜像
docker rmi $(docker images -q)
# 强制删除所有镜像(正确用法,注意是 -f 不是 -r)
docker rmi -f $(docker images -q)
# 删除所有虚悬镜像(<none>:<none>)
docker rmi $(docker images -q -f dangling=true)
# 或使用更推荐的方式
docker image prune
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 容器相关
# 运行容器
# 前台运行(阻塞当前终端)
docker run <image-name>
# -d 后台运行
docker run -d <image-name>
# -it 交互式运行 + 分配伪终端(常用于进入 shell)
docker run -it <image-name> /bin/bash
# --name 指定容器名称
docker run -d --name my-nginx nginx
# -p 宿主机端口:容器端口(端口映射)
docker run -d -p 8080:80 nginx
# -P 随机映射所有 EXPOSE 端口到宿主机
docker run -d -P nginx
# -v 挂载数据卷(宿主机路径:容器路径)
docker run -d -v /host/data:/container/data nginx
# -e 设置环境变量
docker run -d -e MYSQL_ROOT_PASSWORD=123456 mysql:8
# --restart 设置重启策略(no / always / on-failure / unless-stopped)
docker run -d --restart=always nginx
# --network 指定网络
docker run -d --network=my-net nginx
# --rm 容器退出后自动删除(适合临时调试)
docker run --rm -it ubuntu bash
# 综合示例:后台运行 nginx,命名为 web,端口映射、挂载配置、自动重启
docker run -d \
--name web \
-p 80:80 \
-v /etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
--restart=always \
nginx:latest
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 查看容器
# 查看正在运行的容器
docker ps
# 查看所有容器(包括已停止的)
docker ps -a
# 显示最近创建的一个容器(不管是否在运行)
docker ps -l
# -q 只显示容器 ID
docker ps -aq
# 显示容器大小
docker ps -s
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 启动 / 停止 / 重启容器
# 启动已停止的容器
docker start <container-id | container-name>
# 停止运行中的容器(发送 SIGTERM,超时后再 SIGKILL)
docker stop <container-id | container-name>
# 重启容器
docker restart <container-id | container-name>
# 强制杀死容器(直接发送 SIGKILL)
docker kill <container-id | container-name>
# 暂停 / 恢复容器(冻结所有进程)
docker pause <container-id>
docker unpause <container-id>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 进入容器
# 进入正在运行的容器(推荐方式,退出不会终止容器)
docker exec -it <container-id | container-name> /bin/bash
# 有些精简镜像(alpine)没有 bash,用 sh
docker exec -it <container-id | container-name> /bin/sh
# 在容器中执行单条命令
docker exec <container-id> ls /app
# attach 到容器主进程(退出会终止容器,慎用)
docker attach <container-id>
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 查看容器日志
# 查看容器日志
docker logs <container-id | container-name>
# -f 持续输出(类似 tail -f)
docker logs -f <container-id>
# --tail 只看最后 N 行
docker logs --tail 100 <container-id>
# -t 显示时间戳
docker logs -ft <container-id>
# --since 查看指定时间之后的日志
docker logs --since 30m <container-id>
docker logs --since 2024-01-01 <container-id>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 查看容器详情
# 查看容器的详细信息(JSON 格式)
docker inspect <container-id | container-name>
# 提取容器 IP
docker inspect --format='{{.NetworkSettings.IPAddress}}' <container-id>
# 提取容器挂载信息
docker inspect --format='{{json .Mounts}}' <container-id>
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 查看容器资源占用
# 实时查看所有容器的 CPU、内存、网络、IO 使用情况
docker stats
# 查看指定容器
docker stats <container-id>
# 不持续刷新,只打印一次
docker stats --no-stream
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 查看容器内进程
docker top <container-id>
1
# 查看容器端口映射
docker port <container-id>
1
# 重命名容器
docker rename <old-name> <new-name>
1
# 从容器创建镜像
# 将当前容器的状态提交为一个新镜像
docker commit -m "提交信息" -a "作者" <container-id> <new-image-name>:<tag>
1
2
2
# 从主机复制文件到容器
docker cp <host-path> <container-id>:<container-path>
1
# 从容器复制文件到主机
docker cp <container-id>:<container-path> <host-path>
1
# 删除容器
# 删除已停止的容器
docker rm <container-id | container-name>
# 强制删除(即使容器在运行)
docker rm -f <container-id | container-name>
# 删除所有已停止的容器
docker rm $(docker ps -aq -f status=exited)
# 删除所有容器(含运行中)
docker rm -f $(docker ps -aq)
# 清理所有已停止的容器(推荐)
docker container prune
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 数据卷(Volume)
# 查看所有数据卷
docker volume ls
1
# 创建数据卷
docker volume create <volume-name>
1
# 查看数据卷详情
docker volume inspect <volume-name>
1
# 删除数据卷
# 删除指定数据卷
docker volume rm <volume-name>
# 删除所有未被使用的数据卷
docker volume prune
# 删除所有未关联(悬空)的数据卷
docker volume rm $(docker volume ls -qf dangling=true)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 网络(Network)
# 查看所有网络
docker network ls
1
# 创建网络
# 默认创建 bridge 网络
docker network create <network-name>
# 指定驱动
docker network create --driver bridge <network-name>
# 指定子网
docker network create --subnet=172.20.0.0/16 <network-name>
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 查看网络详情
docker network inspect <network-name>
1
# 连接 / 断开容器与网络
# 将容器连接到网络
docker network connect <network-name> <container-id>
# 断开容器与网络的连接
docker network disconnect <network-name> <container-id>
1
2
3
4
5
2
3
4
5
# 删除网络
# 删除指定网络
docker network rm <network-name>
# 删除所有未使用的网络
docker network prune
1
2
3
4
5
2
3
4
5
# 系统清理
# 一键清理
# 清理所有未使用的资源(已停止的容器、无用的网络、悬空镜像、构建缓存)
docker system prune
# 加 -a 会同时清理所有未被使用的镜像(不仅是悬空的)
docker system prune -a
# 加 --volumes 会一起清理数据卷(危险,慎用!)
docker system prune -a --volumes
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 单独清理
docker container prune # 清理已停止的容器
docker image prune # 清理悬空镜像
docker image prune -a # 清理所有未使用的镜像
docker volume prune # 清理未使用的数据卷
docker network prune # 清理未使用的网络
docker builder prune # 清理构建缓存
1
2
3
4
5
6
2
3
4
5
6
# 常用组合命令备忘
# 停止并删除所有容器
docker stop $(docker ps -aq) && docker rm $(docker ps -aq)
1
# 删除所有镜像
docker rmi -f $(docker images -q)
1
# 查看容器 IP(简洁写法)
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container-id>
1
# 进入容器(一行命令)
docker exec -it $(docker ps -qf name=<container-name>) sh
1
# 实时跟踪某个容器最后 100 行日志
docker logs -f --tail 100 <container-id>
1
# 导出所有镜像(备份)
docker save $(docker images --format "{{.Repository}}:{{.Tag}}" | grep -v "<none>") -o all-images.tar
1
# 常用参数速查
| 参数 | 含义 |
|---|---|
-d | 后台运行(detach) |
-i | 保持 STDIN 打开(interactive) |
-t | 分配伪终端(tty) |
-it | 交互式 + 伪终端,常一起用 |
-p | 端口映射(宿主端口:容器端口) |
-P | 随机映射所有 EXPOSE 端口 |
-v | 挂载数据卷(宿主路径:容器路径[:ro]) |
-e | 设置环境变量 |
--name | 指定容器名称 |
--network | 指定容器加入的网络 |
--restart | 重启策略(no / always / on-failure / unless-stopped) |
--rm | 容器退出后自动删除 |
-f | 强制(force);在 logs 中为 follow;在 ps 中为 filter |
-q | 只输出 ID(quiet) |
-a | 显示全部(all) |
# 重启策略说明
| 策略 | 说明 |
|---|---|
no | 默认策略,容器退出不重启 |
on-failure[:max-retries] | 非 0 退出码时重启,可指定最大重试次数 |
always | 始终重启,包括 Docker 守护进程启动时 |
unless-stopped | 始终重启,但如果容器被手动 stop 过,Docker 重启后不会自动拉起 |
生产环境常用 always 或 unless-stopped。