Docker 常用 CLI 命令与工具详解
Docker 29.8 常用 CLI 命令与工具详解:镜像、容器生命周期、网络、数据卷、compose 与系统运维命令,全部命令与回显在 Ubuntu 22.04 真实环境逐条实测。
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/fatal | info |
-D, --debug | 开启调试模式 | 关 |
-c, --context string | 连接的 context 名称(覆盖 DOCKER_HOST) | 当前默认 context |
--tlscacert / --tlscert / --tlskey | TLS 证书路径 | 均在 /root/.docker/ 下 |
--tlsverify | 启用 TLS 并校验证书 | 关 |
常用命令速查表:
| 传统写法 | 管理命令分组写法 | 作用 |
|---|---|---|
docker run | docker container run | 创建并启动容器 |
docker ps | docker container ls | 查看运行中容器 |
docker images | docker image ls | 查看本地镜像 |
docker rm | docker container rm | 删除容器 |
docker rmi | docker 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.21 | Tag(标签);不写则默认 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 decimal | CPU 核数限制 | 不加 |
--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 自带的三种默认网络:
| 网络 | 驱动 | 特点与适用 |
|---|---|---|
bridge | bridge | 默认网络;宿主机通过虚拟网桥 NAT 实现对外访问,容器间默认隔离不能按名互访 |
host | host | 容器直接用宿主机网络栈,无隔离、性能最好;端口映射无效 |
none | null | 无任何网络接口,完全隔离 |
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) |
| 谁来创建目录 | 需手工 mkdir | docker 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 | 项目名 | 取自工作目录名 |
--ansi | ANSI 控制字符时机 | 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 官方参考:https://docs.docker.com/reference/cli/docker/
- Dockerfile 参考:https://docs.docker.com/reference/dockerfile/
- Docker Compose 参考:https://docs.docker.com/compose/reference/
- Docker 网络(网络驱动与 bridge):https://docs.docker.com/network/
- Docker 存储(Volume 与 Bind Mount):https://docs.docker.com/storage/
- Docker 日志与监控:https://docs.docker.com/config/containers/logging/