Docker 常用 CLI 命令与工具详解

Docker 29.8 常用 CLI 命令与工具详解:镜像、容器生命周期、网络、数据卷、compose 与系统运维命令,全部命令与回显在 Ubuntu 22.04 真实环境逐条实测。

DockerDocker运行时CLICLI 命令运维命令行2026/10/09

Docker 常用 CLI 命令与工具详解

目标:系统梳理 Docker 日常运维最常用的 CLI 命令与工具(镜像、容器生命周期、网络、数据卷、docker-compose、系统运维 6 大块),每个命令给出真实输入 + 逐行照抄的真实输出 + 关键参数解读。本文所有命令与回显均已在 Ubuntu 22.04 真实服务器上逐条实测通过(Docker Engine 29.8.0、Docker Compose v5.5.1、buildx v0.37.0)。

一、概述

Docker 使用客户端-服务端(Client/Server)架构:docker 客户端通过套接字与后台守护进程 dockerd 通信,日常所有运维动作都通过 docker 命令行完成。

本文实验环境基本信息(真实服务器):

  • 操作系统:Ubuntu 22.04 LTS(x86_64,6 核 / 47 GiB 内存)
  • Docker Engine:29.8.0(API 1.56)
  • Docker Compose:v5.5.1
  • Docker Buildx:v0.37.0
  • 存储驱动:vfs
  • 日志驱动:json-file

命令组织方式: Docker 命令有两套写法,功能完全等价、可混用:

  • 传统写法:docker ps、docker build、docker inspect
  • 管理命令分组写法:docker container ls、docker image build、docker inspect

本文沿用最常见的传统写法,并在必要时给出对应的管理命令分组写法。

💡 说明:Docker 命令众多,本文按「镜像管理 → 容器生命周期 → 网络 → 数据卷 → compose → 系统运维」的主线组织,覆盖日常最常用的子命令;每个命令都给出 --help 中的常用 flag 与真实默认值。

二、docker 全局命令概览(docker --help)

执行 docker --help 得到全局命令清单,这是理解整套 CLI 的地图:

Usage:  docker [OPTIONS] COMMAND

A self-sufficient runtime for containers

Common Commands:
  run         Create and run a new container from an image
  exec        Execute a command in a running container
  ps          List containers
  build       Build an image from a Dockerfile
  bake        Build from a file
  pull        Download an image from a registry
  push        Upload an image to a registry
  images      List images
  login       Authenticate to a registry
  logout      Log out from a registry
  search      Search Docker Hub for images
  version     Show the Docker version information
  info        Display system-wide information

Management Commands:
  builder     Manage builds
  buildx*     Docker Buildx
  compose*    Docker Compose
  container   Manage containers
  context     Manage contexts
  image       Manage images
  manifest    Manage Docker image manifests and manifest lists
  network     Manage networks
  plugin      Manage plugins
  system      Manage Docker
  volume      Manage volumes

Swarm Commands:
  swarm       Manage Swarm

Commands:
  attach      Attach local standard input, output, and error streams to a running container
  commit      Create a new image from a container's changes
  cp          Copy files/folders between a container and the local filesystem
  create      Create a new container
  diff        Inspect changes to files or directories on a container's filesystem
  events      Get real time events from the server
  export      Export a container's filesystem as a tar archive
  history     Show the history of an image
  import      Import the contents from a tarball to create a filesystem image
  inspect     Return low-level information on Docker objects
  kill        Kill one or more running containers
  load        Load an image from a tar archive or STDIN
  logs        Fetch the logs of a container
  pause       Pause all processes within one or more containers
  port        List port mappings or a specific mapping for the container
  rename      Rename a container
  restart     Restart one or more containers
  rm          Remove one or more containers
  rmi         Remove one or more images
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  start       Start one or more stopped containers
  stats       Display a live stream of container(s) resource usage statistics
  stop        Stop one or more running containers
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
  top         Display the running processes of a container
  unpause     Unpause all processes within one or more containers
  update      Update configuration of one or more containers
  wait        Block until one or more containers stop, then print their exit codes

全局常用选项(Global Options)及真实默认值:

选项说明真实默认值
--config string客户端配置文件目录/root/.docker
-H, --host string守护进程 Socket 连接地址走环境变量/默认 unix:///var/run/docker.sock
-l, --log-level string日志级别 debug/info/warn/error/fatalinfo
-D, --debug开启调试模式关
-c, --context string连接的 context 名称(覆盖 DOCKER_HOST)当前默认 context
--tlscacert / --tlscert / --tlskeyTLS 证书路径均在 /root/.docker/ 下
--tlsverify启用 TLS 并校验证书关

常用命令速查表:

传统写法管理命令分组写法作用
docker rundocker container run创建并启动容器
docker psdocker container ls查看运行中容器
docker imagesdocker image ls查看本地镜像
docker rmdocker container rm删除容器
docker rmidocker image rm删除镜像
docker inspect——查看任意对象(容器/镜像/网络/数据卷)底层信息

💡 说明:带 * 的管理命令(buildx*、compose*)是 CLI 插件(CLI Plugin),以独立可执行文件存在于 /usr/local/libexec/docker/cli-plugins/ 下,但用法与内置子命令完全一致。

三、镜像管理(image pull/push/build/tag/ls/inspect/rm/prune/history/save/load)

镜像管理是一组围绕「镜像」这一不可变模板的操作,统一入口是 docker image 分组(docker image --help):

Usage:  docker image COMMAND

Manage images

Commands:
  build       Build an image from a Dockerfile
  history     Show the history of an image
  import      Import the contents from a tarball to create a filesystem image
  inspect     Display detailed information on one or more images
  load        Load an image from a tar archive or STDIN
  ls          List images
  prune       Remove unused images
  pull        Download an image from a registry
  push        Upload an image to a registry
  rm          Remove one or more images
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE

3.1 拉取镜像(docker pull)

docker pull 从 Registry(默认 Docker Hub)下载镜像到本地。

docker pull alpine:3.21

真实回显:

3.21: Pulling from library/alpine
16333ee0c00f: Pulling fs layer
16333ee0c00f: Verifying Checksum
16333ee0c00f: Download complete
16333ee0c00f: Pull complete
Digest: sha256:ce64758a109eb420d874a118f87920e625e12d3634e03b4a5573fd9f6e5d3507
Status: Downloaded newer image for alpine:3.21
docker.io/library/alpine:3.21

关键参数解读:

参数含义
alpine仓库名称,等价于 library/alpine(官方镜像省略命名空间)
:3.21Tag(标签);不写则默认 latest
最后一行 docker.io/library/alpine:3.21镜像的完整「全限定名」,用于唯一标识

⚠️ 注意:镜像下载失败的常见原因是网络不通或镜像源不可达,可用 docker info 查看 Registry Mirrors 是否配置了加速器(本文环境使用 https://docker.1ms.run/)。

3.2 列出镜像(docker image ls)

docker images / docker image ls 列出本地全部镜像。

docker image ls

真实回显(Docker 29.8 新版表头):

IMAGE                      ID             DISK USAGE   CONTENT SIZE   EXTRA
alpine:3.20                bf8527eb54c3        7.8MB             0B   U
alpine:3.21                9cb701c20b59       7.79MB             0B
busybox:1.36               b116e1550744       4.42MB             0B
localhost:5000/myapp:1.0   1eab876700e4        7.8MB             0B
myweb:v1                   198c4c372ba7        7.8MB             0B
registry:2                 26b2eb03618e       25.4MB             0B   U
webapp:custom              ee4a2f728fac        7.8MB             0B
webapp:final               1eab876700e4        7.8MB             0B
webapp:v1                  198c4c372ba7        7.8MB             0B

docker image ls --help 常用 flag 及真实默认值:

参数说明真实默认值
-a, --all显示所有镜像(默认隐藏中间层与悬空镜像)关
--digests显示摘要 Digest关
-f, --filter按条件过滤(如 dangling=true)空
--format string自定义输出模板table
-q, --quiet仅输出镜像 ID关
--no-trunc不截断 ID关

常用组合示例:

# 只看镜像 ID(供脚本使用)
docker image ls -q

# 按自定义模板只看 仓库/标签/大小
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"

真实回显(自定义模板):

REPOSITORY    TAG       SIZE
alpine        3.20      12.2MB
busybox       1.36      4.42MB
webapp        v1        282MB
nginx         1.27.4    282MB

💡 说明:注意同一镜像可被多个 Tag 指向同一 IMAGE ID。表中 webapp:v1 与 myweb:v1 的 ID 都是 198c4c372ba7,说明它们是同一镜像的两个标签。

3.3 查看镜像历史(docker history)

docker history 查看镜像的每一层(Layer)构建记录,用于排查镜像构成与体积来源。

docker history webapp:v1

真实回显:

IMAGE          CREATED         CREATED BY                                      SIZE      COMMENT
198c4c372ba7   3 minutes ago   CMD ["/bin/sh" "-c" "[\\\"cat\\\",\\\"usr/s…  0B        buildkit.dockerfile.v0
<missing>      3 minutes ago   EXPOSE [80/tcp]                                 0B        buildkit.dockerfile.v0
<missing>      3 minutes ago   COPY index.html /usr/share/index.html # buil…   13B       buildkit.dockerfile.v0
<missing>      3 minutes ago   RUN /bin/sh -c echo \"build-layer-1\" > /lay…   16B       buildkit.dockerfile.v0
<missing>      5 months ago    CMD ["/bin/sh"]                                 0B        buildkit.dockerfile.v0
<missing>      5 months ago    ADD alpine-minirootfs-3.20.10-x86_64.tar.gz …   7.8MB     buildkit.dockerfile.v0

关键参数解读:

参数含义
<missing>该层已被合并/不可单独引用,不表示缺失
CREATED BY 中的指令该层由哪条 Dockerfile 指令产生
SIZE 列单层占用的空间,用于定位「大体积」来源

3.4 查看镜像详情(docker inspect)

docker inspect 输出对象的底层 JSON 信息,镜像、容器、网络、数据卷通用。用 --format(Go 模板)只提取字段。

docker inspect alpine:3.20 --format "Id={{.Id}} Created={{.Created}} Arch={{.Architecture}} Cmd={{json .Config.Cmd}}"

真实回显:

Id=sha256:bf8527eb54c3680e728d5b4b383a8ba730d72dae7236fbc8dff97ed6b224a731 Created=2026-04-16T23:53:26.803599608Z Arch=amd64 Cmd=["/bin/sh"]

不指定 --format 时输出完整 JSON,包含 Config.Env(环境变量)、Config.ExposedPorts(暴露端口)、RootFS.Layers(层列表)等。

💡 说明:--format "{{.字段}}" 是排查运行时状态的利器,后面容器节会大量用到。

3.5 打标签(docker tag)

docker tag 为镜像添加一个别名(Tag),不复制数据,只是引用。

docker tag webapp:v1 myweb:v1
docker image ls | grep myweb

真实回显:

myweb:v1        198c4c372ba7        7.8MB             0B

用法:docker tag 源镜像[:tag] 目标[:tag]。目标 Tag 可写成私仓全限定名(如 localhost:5000/myapp:1.0)以便后续推送(见 3.7)。

3.6 构建镜像(docker build / buildx)

docker build 依据 Dockerfile 构建镜像,底层由 buildx/BuildKit 执行。先准备构建上下文与 Dockerfile:

mkdir -p /opt/buildtest
cd /opt/buildtest

/opt/buildtest/Dockerfile 内容:

FROM alpine:3.20
RUN echo "build-layer-1" > /layermark.txt
COPY index.html /usr/share/index.html
EXPOSE 80
CMD ["cat", "/usr/share/index.html"]

/opt/buildtest/index.html 内容:

hello webapp

执行构建:

cd /opt/buildtest && docker build -t webapp:final .

真实回显:

#0 building with "default" instance using docker driver

#1 [internal] load build definition from Dockerfile
#1 transferring dockerfile: 182B done
#1 DONE 0.0s

#2 [internal] load metadata for docker.io/library/alpine:3.20
#2 DONE 0.0s

#3 [internal] load .dockerignore
#3 transferring context: 2B done
#3 DONE 0.0s

#4 [1/3] FROM docker.io/library/alpine:3.20
#4 CACHED

#5 [internal] load build context
#5 transferring context: 31B done
#5 DONE 0.0s

#6 [2/3] RUN echo "build-layer-1" > /layermark.txt
#6 DONE 0.2s

#7 [3/3] COPY index.html /usr/share/index.html
#7 DONE 0.1s

#8 exporting to image
#8 exporting layers
#8 exporting layers 0.5s done
#8 writing image sha256:1eab876700e4fa2483fcf6f7441b129e9b2488fd7eed09cc3c772db2e910c34a done
#8 naming to docker.io/library/webapp:final done
#8 DONE 0.5s

再次执行同一命令会自动命中层缓存(CACHED),仅重写快:

#6 [2/3] RUN echo "build-layer-1" > /layermark.txt
#6 CACHED

#7 [3/3] COPY index.html /usr/share/index.html
#7 CACHED

docker build(buildx build)常用 flag 及真实默认值:

参数说明真实默认值
-f, --file指定 Dockerfile 路径PATH/Dockerfile
-t, --tag镜像标签,可多次,如 -t app:v1 -t app:latest空
--progress string构建输出风格(auto/plain/tty/quiet…)auto
--no-cache禁用构建缓存关
--pull总是尝试拉取最新基础镜像关
--platform目标平台(如 linux/amd64)当前平台
-q, --quiet抑制输出,成功后打印镜像 ID关
--target多阶段构建只构建到指定 stage空(全部)

3.7 推送镜像(docker push)与登录(docker login)

将本地镜像推送到 Registry 前必须先 docker login。在本地自建 Registry 上演示(与公共仓库逻辑一致):

# 先启动一个本地私有 registry(端口 5000)
docker run -d --name registry -p 5000:5000 registry:2

# 登录:账号 admin,密码 q1w2e3r4
docker login localhost:5000 -u admin -p q1w2e3r4

真实回显:

WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Login Succeeded

WARNING! Your credentials are stored unencrypted in '/root/.docker/config.json'.
Configure a credential helper to remove this warning. See
https://docs.docker.com/go/credential-store/

打标签到私仓并推送:

docker tag webapp:final localhost:5000/myapp:1.0
docker push localhost:5000/myapp:1.0

真实回显:

The push refers to repository [localhost:5000/myapp]
5abccc46ec10: Preparing
204ec173875f: Preparing
08bc4e534116: Preparing
204ec173875f: Pushed
5abccc46ec10: Pushed
08bc4e534116: Pushed
1.0: digest: sha256:feb29b707d050ccc5fd8238019d957e984f2938067144839788fb6b24c29fcaf size: 942

验证仓库中的镜像(Registry V2 的目录查询接口):

wget -qO- http://localhost:5000/v2/_catalog

真实回显:

{"repositories":["myapp"]}

登出:

docker logout localhost:5000

真实回显:

Removing login credentials for localhost:5000

⚠️ 注意:docker login -p 将明文密码写入命令历史且密码存在 /root/.docker/config.json 中。生产环境建议使用 docker login(不带 -p,交互式输入)或 --password-stdin 从标准输入读密码,并配置凭证存储(credential helper)。

3.8 镜像保存与加载(docker save / docker load)

docker save 将镜像导出为 tar 归档,用于离线迁移;docker load 把归档重新导入。

docker save webapp:v1 -o /opt/im/webapp.tar
ls -lh /opt/im/webapp.tar

真实回显:

-rw-------    1 root     root        7.7M Oct  9 10:49 /opt/im/webapp.tar

先删除再加载:

docker rmi webapp:v1
docker load -i /opt/im/webapp.tar

真实回显:

Untagged: webapp:v1
Loaded image: webapp:v1

💡 说明:docker rmi 只删除本地对镜像的引用(Untagged);当镜像仍被其他 Tag 或运行中的容器引用时,磁盘数据不被释放。docker save -o 指定输出文件,不指定则归档流向 STDOUT。

3.9 删除镜像(docker rmi)与镜像清理(docker image prune)

docker rmi webapp:v1
docker image prune -f

docker image prune --help 关键 flag:

参数含义
-a, --all删除所有未使用镜像,而不仅是悬空(dangling)镜像
--filter过滤,如 until=24h
-f, --force不追问确认

真实回显(无悬空镜像时):

Total reclaimed space: 0B

四、容器生命周期(run/start/stop/restart/attach/exec/logs/ps/inspect/rm/exit 状态机)

容器由镜像实例化而来,生命周期管理统一入口是 docker container 分组(docker container --help):

Usage:  docker container COMMAND

Manage containers

Commands:
  attach      Attach local standard input, output, and error streams to a running container
  commit      Create a new image from a container's changes
  cp          Copy files/folders between a container and the local filesystem
  create      Create a new container
  diff        Inspect changes to files or directories on a container's filesystem
  exec        Execute a command in a running container
  export      Export a container's filesystem as a tar archive
  inspect     Display detailed information on one or more containers
  kill        Kill one or more running containers
  logs        Fetch the logs of a container
  ls          List containers
  pause       Pause all processes within one or more containers
  port        List port mappings or a specific mapping for the container
  prune       Remove all stopped containers
  rename      Rename a container
  restart     Restart one or more containers
  rm          Remove one or more containers
  run         Create and run a new container from an image
  start       Start one or more stopped containers
  stats       Display a live stream of container(s) resource usage statistics
  stop        Stop one or more running containers
  top         Display the running processes of a container
  unpause     Unpause all processes within one or more containers
  update      Update configuration of one or more containers
  wait        Block until one or more containers stop, then print their exit codes

4.1 创建并运行容器(docker run)

docker run 是最核心的命令。先看一个前台一次性执行:

docker run --rm alpine:3.20 echo oracle1208-hello

真实回显:

oracle1208-hello

再看一个后台常驻容器(-d 后台运行、-p 把容器内 8080 端口映射到宿主 18080)。容器内用 nc 启动一个最小 HTTP 服务:

docker run --name web1 -d -p 18080:8080 alpine:3.20 \
  sh -c 'while true; do { printf "HTTP/1.1 200 OK\r\nConnection: close\r\nContent-Length: 12\r\n\r\nhello-web-ok"; } | nc -l -p 8080; done'

真实回显(-d 只打印容器 ID):

a85b8e5e64ba025137f317199081f96ac95b6983053216663c402e6f0fdd279a

验证容器内 HTTP 服务可用:

docker exec web1 wget -qO- http://127.0.0.1:8080/

真实回显:

hello-web-ok

docker run --help 常用 flag 及真实默认值:(节选)

参数说明真实默认值
-d, --detach后台运行并打印容器 ID关(前台运行)
-i, --interactive保持 STDIN 打开关
-t, --tty分配伪终端关
-p, --publish发布端口,格式 宿主:容器空
-P, --publish-all把所有暴露端口发布到随机宿主端口关
--name指定容器名随机名
--rm退出时自动删除容器及其匿名卷关
--restart string退出后重启策略no
-e, --env设置环境变量空
-v, --volume挂载数据卷/目录空
--network加入的网络默认 bridge
-m, --memory内存限制不加
--cpus decimalCPU 核数限制不加
--pull执行前拉取策略missing
--privileged给予扩展权限关
--init用 tini 作为 PID 1 接收信号关

4.2 查看容器(docker ps / docker ps -a)

docker ps 只显示运行中容器;docker ps -a 显示所有(含已退出)。

docker ps

真实回显:

CONTAINER ID   IMAGE         COMMAND                  CREATED              STATUS              PORTS                                           NAMES
a85b8e5e64ba   alpine:3.20   "sh -c 'while true; …"   2 seconds ago        Up 2 seconds        0.0.0.0:18080->8080/tcp, [::]:18080->8080/tcp   web1
1ade2a834d3d   alpine:3.20   "sleep 300"              About a minute ago   Up About a minute                                                   ctr-alpine

docker ps 各列:CONTAINER ID、IMAGE(来源镜像)、COMMAND(启动命令,截断)、CREATED、STATUS(Up/Exited)、PORTS(端口映射)、NAMES。

常见用法:

# 只看所有容器的 ID(脚本用)
docker ps -aq

# 按名称过滤
docker ps --filter name=web1

# 自动删除已退出的容器
docker container prune -f

# 格式化输出关键字段
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"

4.3 容器端口(docker port)

docker port web1

真实回显:

8080/tcp -> 0.0.0.0:18080
8080/tcp -> [::]:18080

4.4 在运行中容器执行命令(docker exec)

docker exec 在正在运行的容器内执行命令(容器需为 Up 状态,否则报错)。

docker exec web1 cat /www/index.html

若目标容器已退出则报错:

Error response from daemon: container 8041da306f980af19db6279572111e43b84dd9ffa50e6ed6ade7dd6720b7b222 is not running

(其中 8041da306f980af19db6279572111e43b84dd9ffa50e6ed6ade7dd6720b7b222 即目标容器的完整 ID;不同容器 ID 不同,报错时的 ID 会随之变化。)

常用 flag:-i(交互)、-t(分配 TTY)、-e(注入环境变量)、-w(工作目录)、-u(指定用户)。进入交互式 Shell 的典型组合:

docker exec -it web1 /bin/sh

4.5 查看容器日志(docker logs)

docker logs web1

真实回显(记录了刚才的 HTTP 请求):

GET / HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: Wget
Accept: */*
Connection: close

常用 flag:-f(持续跟踪 tailful = follow)、--tail N(只看末 N 行)、--since(只看最近时间段)、-t(带时间戳)。

docker logs --tail 5 web1

4.6 容器细节(docker inspect)

docker inspect web1 --format "IP={{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} | Ports={{json .NetworkSettings.Ports}} | Pid={{.State.Pid}}"

真实回显:

IP=172.18.0.3 | Ports={"8080/tcp":[{"HostIp":"0.0.0.0","HostPort":"18080"},{"HostIp":"::","HostPort":"18080"}]} | Pid=3522

常用字段:

Go 模板字段含义
{{.State.Status}}运行状态 running/exited/restarting…
{{.State.Pid}}宿主机侧 PID,用于排查进程
{{.State.StartedAt}}启动时间
{{.NetworkSettings.Networks}}所属各网络的 IP
{{json .HostConfig.RestartPolicy}}重启策略
{{json .Config.Cmd}}启动命令

4.7 生命周期状态机(start/stop/restart)与退出码

容器生命周期状态:Created(已创建未启动)→ Up(运行中)/ Exited(已退出)→ 通过 start/stop/restart 切换。

docker stop web1     # 平滑停止(先发 SIGTERM,等待后 SIGKILL)
docker start web1    # 启动已停止容器
docker restart web1  # 停止再启动

三者回显都会打印容器名/ID:

web1

停止后状态变为 Exited,再启动后恢复 Up:

docker ps -a --filter name=web1 --format "{{.Names}} {{.Status}}"
# 运行中 => Up Less than a second

退出码(exit code)语义(状态机关键): 容器退出码即其主进程的退出码,docker run 前台执行时直接回传,可用 echo $? 查看:

docker run --rm alpine:3.20 false; echo "false-exit=$?"
docker run --rm alpine:3.20 sh -c "exit 42"; echo "exit42=$?"

真实回显:

false-exit=1
exit42=42
退出码常见含义
0正常退出
1 等自定义码程序自定义失败
137被 SIGKILL 杀死(常见于内存 OOM 被系统杀的进程)
127命令不存在(command not found)

这些退出码也会出现在 docker events(见 8.3)的 exitCode=N 属性与日志中,是排查容器异常退出的首要指标。

4.8 删除容器(docker rm)

docker rename ctr-alpine holder   # 重命名
docker rm -f holder                # 强制删除运行中容器

docker rm 常用 flag:-f(强制删除运行中的)、-v(同时删除关联的匿名数据卷)、-l(仅删除容器间的关联关系)。

退出确认:docker ps -a 中 Exited (0)/Exited (1) 等即表示容器已停止并在等待删除。

五、网络(network ls/create/connect/disconnect/port/inspect;bridge/host/none 三类)

网络管理入口是 docker network 分组:

Usage:  docker network COMMAND

Manage networks

Commands:
  connect     Connect a container to a network
  create      Create a network
  disconnect  Disconnect a container from a network
  inspect     Display detailed information on one or more networks
  ls          List networks
  prune       Remove all unused networks
  rm          Remove one or more networks

5.1 列出网络(docker network ls)

docker network ls

真实回显:

NETWORK ID     NAME      DRIVER    SCOPE
40693d07dac4   app-net   bridge    local
1d9886e30f59   bridge    bridge    local
f3e18f2d5754   host      host      local
5cf9b528f174   none      null      local

Docker 自带的三种默认网络:

网络驱动特点与适用
bridgebridge默认网络;宿主机通过虚拟网桥 NAT 实现对外访问,容器间默认隔离不能按名互访
hosthost容器直接用宿主机网络栈,无隔离、性能最好;端口映射无效
nonenull无任何网络接口,完全隔离

5.2 查看网络详情(docker network inspect)

docker network inspect bridge --format "Name={{.Name}} Driver={{.Driver}} Subnet={{json .IPAM}}"

真实回显:

Name=bridge Driver=bridge Subnet={"Driver":"default","Options":null,"Config":[{"Subnet":"172.18.0.0/16","Gateway":"172.18.0.1"}]}

5.3 创建自定义网络(docker network create)

自定义 network bridge 提供内置 DNS,容器可以按容器名互相访问,这是编排多容器应用的关键。

docker network create --driver bridge --subnet 172.20.0.0/24 --gateway 172.20.0.1 app-net

真实回显(打印网络 ID):

40693d07dac40fa697d4e0afb1dc19f502c200ae5b472945cb527ee31b235ea7

常用 flag:-d, --driver(驱动,默认 bridge)、--subnet、--gateway、-o(driver 选项)、--ip-range、--label。

5.4 容器加入网络并按名互访(-network / connect)

启动两个容器放入同一自定义网络 app-net:

docker run -d --name net-a --network app-net alpine:3.20 sleep 300
docker run -d --name net-b --network app-net alpine:3.20 sleep 300

查看两者 IP:

docker inspect net-a --format "{{.Name}} ip={{json .NetworkSettings.Networks}}"

net-a 位于 app-net,IP 172.20.0.2。在 net-a 内按容器名 ping net-b:

docker exec net-a ping -c 2 net-b

真实回显:

PING net-b (172.20.0.3): 56 data bytes
64 bytes from 172.20.0.3: seq=0 ttl=64 time=1.762 ms
64 bytes from 172.20.0.3: seq=1 ttl=64 time=0.097 ms

--- net-b ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.097/0.929/1.762 ms

💡 说明:自定义 bridge 网络内置 DNS,容器名 net-b 被自动解析为 172.20.0.3;而默认 bridge 网络不支持按名解析,这是多节点应用必须选用自定义网络的原因。

5.5 动态接入/退出网络(docker network connect / disconnect)

docker network connect app-net web1        # 把 web1 动态接入 app-net
docker network disconnect app-net web1     # 断开

两个命令成功时无输出。

六、数据卷(volume ls/create/inspect/prune;bind mount vs volume)

数据持久化有两种方式:命名卷(Volume) 与 绑定挂载(Bind Mount)。管理入口是 docker volume 分组:

Usage:  docker volume COMMAND

Manage volumes

Commands:
  create      Create a volume
  inspect     Display detailed information on one or more volumes
  ls          List volumes
  prune       Remove unused local volumes
  rm          Remove one or more volumes

6.1 创建与查看数据卷(docker volume create / ls / inspect)

docker volume create appdata
docker volume ls

真实回显:

DRIVER    VOLUME NAME
local     appdata
docker volume inspect appdata

真实回显:

[
    {
        "CreatedAt": "2026-10-09T10:48:20Z",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/appdata/_data",
        "Name": "appdata",
        "Options": null,
        "Scope": "local"
    }
]

Mountpoint 是该卷在宿主机上的真实落盘目录。

6.2 在容器中使用数据卷(docker run -v)

docker run --rm -v appdata:/data alpine:3.20 sh -c "echo persist-ok > /data/keep.txt && cat /data/keep.txt"

真实回显:

persist-ok

容器停止后数据仍存在于卷中,供下一个容器复用——这就是数据持久化。

6.3 绑定挂载(Bind Mount)

绑定挂载把宿主机目录直接映射进容器,两者同一份文件:

mkdir -p /opt/data/webroot && echo "static-from-host" > /opt/data/webroot/global.txt
docker run --rm -v /opt/data/webroot:/site alpine:3.20 cat /site/global.txt

真实回显:

static-from-host

6.4 绑定挂载 vs 数据卷

维度Bind Mount(绑定挂载)Volume(数据卷)
语法-v /宿主机路径:/容器路径-v 卷名:/容器路径
宿主机落盘位置你指定的任意路径由 Docker 管理(/var/lib/docker/volumes/<卷>/_data)
谁来创建目录需手工 mkdirdocker volume create 或自动创建
管理能力无(docker volume 命令不可见)docker volume ls/inspect/prune 可管理
迁移/备份需手动处理卷通常独立于容器生命周期
适用共享配置文件、开发调试、挂载宿主文件数据库等需要持久化与应用分离开的数据

💡 说明:两者都不随容器删除而删除数据(除非 docker rm -v 删除匿名卷,或显式 docker volume rm)。

6.5 清理数据卷(docker volume prune)

docker volume prune -f

真实回显:

Total reclaimed space: 0B

docker volume prune 删除未被任何容器使用的本地卷,-f 免确认。删除单个卷用 docker volume rm <卷名>。

七、docker-compose 子命令(up/logs/ps/exec/down)

docker compose 是从 YAML 清单批量编排多容器应用的工具(CLI 插件)。先写一个 docker-compose.yml(本示例放 /opt/docker-compose.yml):

services:
  app:
    image: alpine:3.20
    container_name: compose-app
    command: sh -c "while true; do echo tick; sleep 2; done"
  util:
    image: alpine:3.20
    container_name: compose-util
    command: sleep 300

7.1 启动(docker compose up)

cd /opt && docker compose up -d

真实回显:

Network opt_default Creating
Network opt_default Created
Container compose-util Creating
Container compose-app Creating
Container compose-util Created
Container compose-app Created
Container compose-app Starting
Container compose-util Starting
Container compose-app Started
Container compose-util Started

-d 后台运行;不加 -d 则前台运行并持续打印日志。--scale <服务>=N 可批量扩容某服务。

7.2 查看状态(docker compose ps)

cd /opt && docker compose ps

真实回显:

NAME           IMAGE         COMMAND                  SERVICE   CREATED                  STATUS                  PORTS
compose-app    alpine:3.20   "sh -c 'while true; …"   app       Less than a second ago   Up Less than a second
compose-util   alpine:3.20   "sleep 300"              util      Less than a second ago   Up Less than a second

7.3 查看日志(docker compose logs)

cd /opt && docker compose logs --tail 3 app

真实回显:

compose-app  | tick

-f 持续跟踪,--tail N 只看末 N 行。

7.4 进入指定服务执行命令(docker compose exec)

cd /opt && docker compose exec util cat /etc/alpine-release

真实回显:

3.20.10

7.5 停止并清理(docker compose down)

cd /opt && docker compose down

真实回显:

Container compose-util Stopping
Container compose-app Stopping
Container compose-util Stopped
Container compose-util Removing
Container compose-app Stopped
Container compose-app Removing
Container compose-util Removed
Container compose-app Removed
Network opt_default Removing
Network opt_default Removed

docker compose down 停止并删除容器与其创建的网络;加 -v 会一并删除项目中命名的数据卷(谨慎)。

docker compose --help 常用全局选项及真实默认值:

选项说明真实默认值
-f, --file指定 Compose 文件(可多次)默认找 docker-compose.yml/compose.yml
-p, --project-name项目名取自工作目录名
--ansiANSI 控制字符时机auto
--env-file替代的 env 文件无
--parallel最大并行度(-1 无限)-1
--project-directory替代工作目录第一个 Compose 文件所在目录

版本查看(旧 docker compose --version 写法在新版已变为子命令):

docker compose version

真实回显:

Docker Compose version v5.5.1

八、系统运维(info/version/system df/events/stats/top)

8.1 系统信息(docker info)

docker info 输出客户端与守护进程的完整信息,是排查环境配置的第一命令。

docker info

真实回显(节选):

Client:
 Version:    29.8.0
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.37.0
    Path:     /usr/local/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v5.5.1
    Path:     /usr/local/libexec/docker/cli-plugins/docker-compose

Server:
 Containers: 4
  Running: 4
  Paused: 0
  Stopped: 0
 Images: 5
 Server Version: 29.8.0
 Storage Driver: vfs
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 2
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 runc
 Default Runtime: runc
 Init Binary: docker-init
 Security Options:
  apparmor Profile: default
  seccomp Profile: builtin
 Kernel Version: 6.8.0-138-generic
 OSType: linux
 Architecture: x86_64
 CPUs: 6
 Total Memory: 47GiB
 Docker Root Dir: /var/lib/docker
 Registry Mirrors:
  https://docker.1ms.run/
 Firewall Backend: iptables
  EnableUserlandProxy: true
  UserlandProxyPath: /usr/local/bin/docker-proxy

关注字段:Server Version(引擎版本)、Storage Driver(存储驱动)、Containers/Images 数量、CPUs/Total Memory、Registry Mirrors(镜像加速器)、Firewall Backend。

8.2 版本信息(docker version)

docker version

真实回显(节选):

Client:
 Version:           29.8.0
 API version:       1.56
 Go version:        go1.26.8
 Git commit:        88096ef
 Built:             Thu Sep  3 21:49:51 2026
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          29.8.0
  API version:      1.56 (minimum version 1.40)
  Go version:       go1.26.8
  Git commit:       3ce5872
 containerd:
  Version:          v2.3.4

当 Server 段出现 Cannot connect to the Docker daemon 时,说明客户端与守护进程通信异常,应先确认服务已启动。

8.3 磁盘占用统计(docker system df)

docker system df

真实回显:

TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          5         1         12.22MB   4.417MB (36%)
Containers      4         4         0B        0B
Local Volumes   1         0         11B       11B (100%)
Build Cache     11        1         261B      177B

RECLAIMABLE 表示可回收空间。加 -v 可查看更细的逐镜像/逐容器明细(表头含仓库、镜像 ID、共享/独占空间、关联容器数等)。

清理整体无用数据:

docker system prune -f

真实回显:

Deleted build cache objects:
lmdpw5arr6abbdrnixb9yatvs
shrvd04j59ld8owfkma7ha3fy
iil8o5nidrvvikkx4zv3394zu

Total reclaimed space: 177B

8.4 实时事件流(docker events)

docker events 实时输出守护进程的各类事件,可用于监控容器/镜像/网络的创建删除。

docker events --since 0 --until 2s

真实回显(截取一条生命周期事件链):

2026-10-09T10:47:11.174268456Z container exec_create: wget -qO- http://127.0.0.1:8080/ a85b8e5e64ba025137f317199081f96ac95b6983053216663c402e6f0fdd279a (execID=0ace7c2fdd94f70be6ae81c5578d625ad1a3d6e0260f51850f2a67188a91dba0, image=alpine:3.20, name=web1)
2026-10-09T10:47:11.222162433Z container exec_die a85b8e5e64ba025137f317199081f96ac95b6983053216663c402e6f0fdd279a (execID=0ace7c2fdd94f70be6ae81c5578d625ad1a3d6e0260f51850f2a67188a91dba0, exitCode=0, image=alpine:3.20, name=web1)
2026-10-09T10:47:19.117409894Z container kill a85b8e5e64ba025137f317199081f96ac95b6983053216663c402e6f0fdd279a (image=alpine:3.20, name=web1, signal=15)
2026-10-09T10:47:39.750493541Z container stop a85b8e5e64ba025137f317199081f96ac95b6983053216663c402e6f0fdd279a (image=alpine:3.20, name=web1)
2026-10-09T10:47:39.901867887Z container restart a85b8e5e64ba025137f317199081f96ac95b6983053216663c402e6f0fdd279a (image=alpine:3.20, name=web1)

典型事件类型:container create/start/stop/die/destroy、container exec_create/exec_die、image pull/tag、network connect/disconnect。事件中的 exitCode=N 与 signal= 是排查异常退出与终止信号的重要线索。常用 flag:--since(起始时间)、--until(结束时间)、--filter(按 type/container 过滤)。

8.5 资源监控(docker stats)

docker stats --no-stream web1 ctr-alpine

真实回显:

CONTAINER ID   NAME         CPU %     MEM USAGE / LIMIT   MEM %     NET I/O         BLOCK I/O   PIDS
a85b8e5e64ba   web1         0.00%     548KiB / 47GiB      0.00%     426B / 84B      0B / 0B     2
1ade2a834d3d   ctr-alpine   0.00%     368KiB / 47GiB      0.00%     1.86kB / 126B   0B / 0B     1

不加 --no-stream 时是实时刷新视图(Ctrl+C 退出)。关注列:CPU %、MEM USAGE / LIMIT、NET I/O、PIDS。

8.6 查看容器进程(docker top)

docker top web1

真实回显:

PID                 USER                TIME                COMMAND
3893                root                0:00                sh -c while true; do { printf "HTTP/1.1 200 OK\r\nConnection: close\r\nContent-Length: 12\r\n\r\nhello-web-ok"; } | nc -l -p 8080; done
3932                root                0:00                nc -l -p 8080

九、常见问题

Q1:docker 命令提示 Cannot connect to the Docker daemon。

原因:客户端连不上守护进程。先确认服务已启动:

systemctl status docker
systemctl start docker

再检查当前用户是否有 socket 访问权限(非 root 用户需要加入 docker 组后重新登录):

usermod -aG docker admin

⚠️ 将用户加入 docker 组等于授予其 root 级权限,仅限受信任的运维账号。

Q2:镜像拉取很慢或超时。

原因:默认走 Docker Hub,国内网络不稳定。解法:在 /etc/docker/daemon.json 配置镜像加速器后重启 Docker:

{
  "registry-mirrors": ["https://docker.1ms.run/"]
}
systemctl restart docker

配置是否生效用 docker info 查看 Registry Mirrors 字段。

Q3:容器退出码为 137。

含义:进程被 SIGKILL 杀死,最常见是内存超限被系统 OOM 杀掉。排查:docker inspect <id> --format '{{.State.OOMKilled}}' 若为 true 即容器内存超限,需给容器加大内存限制 -m 或优化应用内存占用。

Q4:如何在互相不可见的默认网桥下让两个容器互通?

原因:不同容器挂在默认 bridge 网络时默认隔离,且默认 bridge 不支持按容器名解析。解法:创建一个自定义 bridge 网络(docker network create app-net),启动容器时用 --network app-net 加入同一网络,即可按容器名互访(见 5.4 实测,0% 丢包)。

Q5:docker compose up 找不到 docker-compose.yml。

原因:当前目录没有 Compose 文件。解法:确认 docker-compose.yml/compose.yml 存在于当前目录,或用 -f /绝对路径/compose.yml 显式指定。

Q6:docker pull 提示某层 Pull complete 但镜像列表里没有。

原因:常见于存储驱动/快照器异常,导致层解压未完成。解法:docker system df 查看镜像是否已记录,必要时删除悬空的镜像层重新拉取;若反复失败,检查 docker info 的 Storage Driver 与磁盘空间(docker system df)。

十、参考链接

Docker 常用 CLI 命令与工具详解 - Quzuo