Docker 常用命令

8/1/2019 Docker

# Docker 常用命令

本篇作为速查手册,按 系统信息 / 镜像 / 容器 / 数据卷 / 网络 / 仓库 / 清理 分组整理。 使用规范:[] 为可选参数,<> 为必填参数,| 表示"或"。

# 系统信息

# 查看 Docker 版本

# 查看 Docker 客户端 + 服务端版本
docker version

# 只查看版本号
docker --version
1
2
3
4
5

# 查看 Docker 系统信息

# 查看容器数量、镜像数量、存储驱动、Cgroup、内核版本等
docker info
1
2

# 查看磁盘占用

# 查看镜像、容器、数据卷、构建缓存所占空间
docker system df

# 更详细的占用列表
docker system df -v
1
2
3
4
5

# 帮助命令

# 查看所有命令
docker --help

# 查看某个子命令的用法
docker <command> --help
# 例:
docker run --help
docker image --help
1
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

# 查看本地镜像

# 列出所有顶层镜像
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

# 搜索镜像

# 从 Docker Hub 搜索镜像
docker search <keyword>

# 例:只显示 star 数 >= 100 的
docker search --filter=stars=100 nginx
1
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

# 推送镜像

# 推送到镜像仓库前需要先登录
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

# 给镜像打标签

# 为已有镜像新增一个标签(不会复制镜像,只是加一个引用)
docker tag <source-image>[:tag] <target-image>[:tag]

# 例:
docker tag nginx:latest my-nginx:v1
1
2
3
4
5

# 查看镜像详情

# 查看镜像的详细信息(JSON 格式)
docker inspect <image-id | image-name>

# 使用 --format 提取指定字段
docker inspect --format='{{.Os}}/{{.Architecture}}' nginx
1
2
3
4
5

# 查看镜像构建历史

# 查看镜像的每一层构建历史
docker history <image-name>

# --no-trunc 显示完整信息(不截断)
docker history --no-trunc <image-name>
1
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

save/loadexport/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

# 容器相关

# 运行容器

# 前台运行(阻塞当前终端)
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

# 查看容器

# 查看正在运行的容器
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

# 启动 / 停止 / 重启容器

# 启动已停止的容器
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

# 进入容器

# 进入正在运行的容器(推荐方式,退出不会终止容器)
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

# 查看容器日志

# 查看容器日志
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

# 查看容器详情

# 查看容器的详细信息(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

# 查看容器资源占用

# 实时查看所有容器的 CPU、内存、网络、IO 使用情况
docker stats

# 查看指定容器
docker stats <container-id>

# 不持续刷新,只打印一次
docker stats --no-stream
1
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

# 从主机复制文件到容器

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

# 数据卷(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

# 网络(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

# 查看网络详情

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

# 删除网络

# 删除指定网络
docker network rm <network-name>

# 删除所有未使用的网络
docker network prune
1
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

# 单独清理

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

# 常用组合命令备忘

# 停止并删除所有容器

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 重启后不会自动拉起

生产环境常用 alwaysunless-stopped