跳到主要内容

Docker 命令速查:80+ 真实命令带常见坑、Compose 与构建技巧

Docker 命令速查,80+ 条命令带真实例子和常见坑,含 Compose 章节。

  • 本地处理
  • 分类 开发运维
  • 适合 格式化、校验、压缩或检查和代码相关的文本。
148 条命令
镜像 (19)
docker pull <image>

从 registry 拉取镜像(或指定 tag)到本地。

常见坑: 不加 tag 默认拉 :latest,这个标签会一直变。生产环境要钉死版本号。

例子
docker pull nginx
docker pull node:20-alpine
docker pull ghcr.io/user/app:v1.2.3
docker push <image>

把本地镜像推到 registry。镜像必须先 tag 成 registry 完整路径。

常见坑: 没 docker login 或 tag 不带 registry 前缀,push 会报 "denied"。先 tag 再 login 再 push。

例子
docker push myorg/app:v1.0
docker push registry.example.com/team/app:latest
docker build -t <name> <path>

按 <path> 下的 Dockerfile 构建镜像并打 <name> 标签。

常见坑: 构建上下文是整个目录,没写 .dockerignore 会把 node_modules / .git 一起塞进 daemon,几个 GB 起步。

例子
docker build -t myapp .
docker build -t myapp:v1.0 -f Dockerfile.prod .
docker build --no-cache -t myapp .
docker images

列出本地所有镜像,含仓库、tag、ID、年龄、体积。

例子
docker images
docker images -a
docker images --filter "dangling=true"
docker rmi <image>

删除本地镜像。可一次删多个。

常见坑: `rmi` 删镜像,`rm` 删容器。两者混淆是 docker 新手第一坑。还有容器在用要加 -f 强删。

例子
docker rmi nginx:1.25
docker rmi -f myapp:old
docker rmi $(docker images -q -f "dangling=true")
docker tag <src> <dst>

给已有镜像加一个新 tag。新旧 tag 指向同一个 image ID。

常见坑: tag 不会复制数据,push 新 tag 会复用已有 layer,几乎瞬完成。

例子
docker tag myapp:latest myorg/myapp:v1.0
docker tag abc123 registry.example.com/team/app:prod
docker save -o <file.tar> <image>

把镜像(含所有 layer 和元信息)打包成 tar 文件,适合离网传输。

例子
docker save -o myapp.tar myapp:v1.0
docker save myapp:v1.0 | gzip > myapp.tar.gz
docker load -i <file.tar>

从 docker save 生成的 tar 文件导入镜像。

常见坑: `load` 是恢复镜像;`import` 是从裸文件系统 tar 造镜像。输入不同命令不同。

例子
docker load -i myapp.tar
gunzip -c myapp.tar.gz | docker load
docker history <image>

查看镜像的逐层构建历史,每条命令、体积、时间戳。

例子
docker history nginx
docker history --no-trunc myapp:v1.0
docker scout cves <image>

扫描镜像的已知 CVE 漏洞(取代了已弃用的 docker scan)。

常见坑: `docker scan`(Snyk 那套)从 Docker Desktop 4.27 起已弃用。新项目用 docker scout。

例子
docker scout cves myapp:latest
docker scout quickview myapp:latest
docker image prune

删除所有悬挂镜像(无 tag 的镜像,一般是反复构建留下的残渣)。

常见坑: 加 `-a` 会删所有未使用的镜像(不只是悬挂的),会误删还想留的镜像。

例子
docker image prune
docker image prune -a
docker image prune -a --filter "until=168h"
docker inspect <image>

打印镜像的底层 JSON 元信息:layer、env、entrypoint、暴露端口、label。

例子
docker inspect nginx
docker inspect --format "{{.Config.Env}}" myapp
docker import <file.tar> <image>

从裸文件系统 tar 包(比如 docker export 出来的)造一个全新镜像。没有 layer,没有历史。

常见坑: `import` 吃文件系统 tar 并压平;`load` 吃 docker save 的归档并保留 layer。两者不能互换。

例子
docker import rootfs.tar myrootfs:base
docker export web | docker import - web-snapshot:v1
docker image ls --digests

列出镜像并显示内容寻址的 digest(sha256),不只是给人看的 tag。

常见坑: tag 可以被重新 push 指向新内容,digest 永远不变。生产里用 image@sha256:… 钉死才是真不可变。

例子
docker image ls --digests
docker pull nginx@sha256:abc123...
docker manifest inspect <image>

查看多架构 manifest list,看一个 tag 到底支持哪些平台(amd64、arm64…)。

常见坑: 这是实验性 CLI 功能,老版本 docker 要先在 ~/.docker/config.json 里设 experimental: enabled。

例子
docker manifest inspect nginx:latest
docker buildx imagetools inspect nginx:latest
docker pull -a <repo>

一次拉取一个仓库下的所有 tag。

常见坑: 热门仓库可能有几百个 tag、几十 GB。基本不是你想要的,老老实实拉单个 tag。

例子
docker pull -a alpine
docker tag <img> <img>:<sha>

用 git commit SHA 给镜像打 tag,让每次构建都能溯源到代码。

例子
docker tag myapp:latest myapp:$(git rev-parse --short HEAD)
docker tag myapp registry.example.com/team/myapp:$(date +%Y%m%d)
docker scout recommendations <image>

推荐更安全、更小的基础镜像和升级 tag,帮你压低 CVE 数量。

例子
docker scout recommendations myapp:latest
docker scout compare --to myapp:prod myapp:staging
docker image inspect --format

用 Go 模板只取镜像元信息里的某一个字段,不用读整坨 JSON。

例子
docker image inspect --format "{{.Architecture}}" nginx
docker image inspect --format "{{.Size}}" myapp
容器 (43)
docker run <image>

基于镜像创建并起一个新容器。docker 最常用命令。

常见坑: 每次 docker run 都新建一个容器。反复跑会堆一堆停止状态的容器,一次性任务加 --rm,复用就 docker start <name>。

例子
docker run nginx
docker run -d -p 8080:80 nginx
docker run --rm -it ubuntu bash
docker run -it <image> <cmd>

交互式起容器并分配 TTY。-i 保持 STDIN 打开,-t 分配伪终端。两个合起来才有真正的 shell。

常见坑: 只 -i 没提示符,只 -t 收不到输入。两个一起用。被 pipe 的时候去掉 -t(如 echo x | docker run -i …)。

例子
docker run -it ubuntu bash
docker run -it --rm alpine sh
docker run -it node:20 node
docker run -d <image>

后台起容器(detached 模式),只输出容器 ID。

例子
docker run -d nginx
docker run -d --name web -p 80:80 nginx
docker run --rm <image>

容器退出时自动删除。一次性命令必备,不会堆积死容器。

常见坑: --rm 是退出时删容器,不删镜像。容器里没挂卷的目录里的数据,退出就没。

例子
docker run --rm alpine echo hello
docker run --rm -v $(pwd):/work -w /work node:20 npm test
docker run -p <host>:<container> <image>

把容器端口映射到宿主机。格式:宿主端口:容器端口。

常见坑: 宿主端口写前面,容器端口写后面。颠倒了就出现“app 监听了但访问不到”的迷惑错误。

例子
docker run -p 8080:80 nginx
docker run -p 127.0.0.1:5432:5432 postgres
docker run -P nginx
docker run -v <host>:<container> <image>

把宿主路径或命名卷挂到容器内指定路径。

常见坑: macOS/Windows 的 bind mount 巨慢(要经过 VM 同步)。node_modules 这种热路径用命名卷。

例子
docker run -v $(pwd):/app node:20
docker run -v mydata:/var/lib/mysql mysql
docker run -v $(pwd):/app:ro alpine
docker run --name <name> <image>

给容器起一个好认的名字,不要再用自动生成的“happy_elephant”。

常见坑: 名字必须唯一。同名再起会失败,要先 docker rm 老的。

例子
docker run --name web -d nginx
docker run --name pg -e POSTGRES_PASSWORD=secret -d postgres
docker run -e KEY=value <image>

向容器传环境变量。

常见坑: 密钥写在命令行会留在 shell 历史里。用 --env-file .env 或专门的 secret 管理。

例子
docker run -e NODE_ENV=production node:20
docker run --env-file .env myapp
docker run -e DEBUG=1 -e LOG_LEVEL=info myapp
docker run --restart unless-stopped <image>

重启策略:崩了重启、daemon 重启也重启,但你手动 docker stop 后不会自动起。

常见坑: `--restart=always` 你 docker stop 之后 daemon 重启它还会复活。`unless-stopped` 才是日常想要的。

例子
docker run -d --restart unless-stopped --name web nginx
docker run -d --restart on-failure:5 myapp
docker ps

列出正在运行的容器。加 -a 包含已停止的。

例子
docker ps
docker ps -a
docker ps --filter "status=exited"
docker ps --format "table {{.Names}}\t{{.Status}}"
docker start <container>

启动一个或多个已停止的容器(保留 run 时的所有数据和配置)。

例子
docker start web
docker start -a web
docker start $(docker ps -aq -f "status=exited")
docker stop <container>

优雅停止容器(先 SIGTERM,10 秒后再 SIGKILL)。

常见坑: 不处理 SIGTERM 的应用(如 sh -c 包起来的 node)会被直接 KILL。Dockerfile 用 CMD 的 exec 形式(数组形式)。

例子
docker stop web
docker stop -t 30 web
docker stop $(docker ps -q)
docker restart <container>

先停后起一个容器,卡死进程最快的修法之一。

例子
docker restart web
docker restart -t 5 web
docker rm <container>

删除一个或多个已停止的容器。-f 强删运行中的。

常见坑: `rm` 删容器,`rmi` 删镜像。容器挂的卷不会被删,要一起删加 -v。

例子
docker rm web
docker rm -f web
docker rm -v old-db
docker rm $(docker ps -aq)
docker exec -it <container> <cmd>

在运行中的容器里跑一条临时命令,一般是开个 shell 进去看看。

常见坑: 容器必须在运行。停了的容器用 exec 不行,要先 docker start,或干脆 docker run 个新的。

例子
docker exec -it web bash
docker exec -it web sh
docker exec web ls /etc
docker exec -u 0 -it web bash
docker logs <container>

打印容器的 STDOUT + STDERR(应用直接打到屏幕的,不是磁盘上的日志文件)。

常见坑: 应用把日志写进 /var/log/app.log 而不是 stdout,docker logs 就是空。12-factor 应用都 log 到 stdout。

例子
docker logs web
docker logs -f web
docker logs --tail 100 web
docker logs --since 10m web
docker attach <container>

把终端接到运行中容器的主进程上。注意 Ctrl-C 会把容器干掉。

常见坑: `attach` 不是开 shell,是接到已存在的进程上。没特殊需要就用 docker exec -it … bash。

例子
docker attach web
docker attach --detach-keys="ctrl-p,ctrl-q" web
docker cp <src> <dst>

在宿主和容器之间拷文件。哪边都可以是容器。

例子
docker cp web:/etc/nginx/nginx.conf ./nginx.conf
docker cp ./fix.patch web:/tmp/
docker cp web:/var/log/. ./logs/
docker inspect <container>

打印容器的所有底层 config 和状态 JSON:IP、挂载、env、网络、退出码。

例子
docker inspect web
docker inspect --format "{{.State.Status}}" web
docker inspect --format "{{.NetworkSettings.IPAddress}}" web
docker stats

实时查看运行容器的 CPU、内存、网络、磁盘 IO。

例子
docker stats
docker stats --no-stream
docker stats web db
docker top <container>

查看容器内部在跑的进程(类似宿主 ps)。

例子
docker top web
docker top web aux
docker kill <container>

立即给容器主进程发 SIGKILL(或用 -s 发其他信号)。

常见坑: SIGKILL 应用没机会善后,文件写一半、DB 没刷盘。除非卡死,平时都用 docker stop。

例子
docker kill web
docker kill -s SIGHUP web
docker rename <old> <new>

重命名一个已存在的容器。

例子
docker rename web web-old
docker rename happy_elephant payment-service
docker pause <container>

用 cgroup freezer 冻结容器内所有进程(进程还在内存里)。

常见坑: 暂停的容器端口和内存都还占着。只适合调试,别拿来当“低资源待机”。

例子
docker pause web
docker unpause web
docker unpause <container>

恢复一个已暂停的容器。

例子
docker unpause web
docker commit <container> <image>

把运行中容器的文件系统快照成新镜像。调试用,不要拿来构建生产镜像。

常见坑: commit 出来的镜像是黑盒,没 Dockerfile、不可重现。要发布的镜像永远走 Dockerfile。

例子
docker commit web debug-snapshot:v1
docker commit -m "added trace" -a "lei" web debug:v2
docker diff <container>

显示容器相对于基础镜像新增(A)、改动(C)、删除(D)的所有文件。

例子
docker diff web
docker wait <container>

阻塞直到容器退出,然后打印退出码。

例子
docker wait batch-job
EXIT=$(docker wait batch-job) && echo "Job finished: $EXIT"
docker port <container>

列出容器对外的端口映射。

例子
docker port web
docker port web 80
docker run -w <dir> <image>

设置命令在容器内的工作目录,后续 exec 也默认在这里。

例子
docker run -w /app -v $(pwd):/app node:20 npm test
docker run -w /src --rm gcc:13 gcc main.c
docker run -u <uid>:<gid> <image>

以指定用户/用户组身份跑容器进程,而不是 root。

常见坑: 写进 bind mount 的文件在宿主上归这个 UID 所有。用 $(id -u):$(id -g) 才能跟你宿主用户对上。

例子
docker run -u 1000:1000 -v $(pwd):/app node:20
docker run -u $(id -u):$(id -g) --rm -v $(pwd):/work alpine touch /work/x
docker run --memory <limit> <image>

限制容器内存。超限时内核会 OOM 把容器干掉。

常见坑: 不把 --memory-swap 设成等于 --memory,容器还能用宿主 swap。两个都设才是真限内存。

例子
docker run -m 512m myapp
docker run --memory 1g --memory-swap 1g myapp
docker run --cpus <n> <image>

限制容器能用几个 CPU 核(可以写小数)。

例子
docker run --cpus 1.5 myapp
docker run --cpus 0.5 --cpu-shares 512 myapp
docker run --read-only <image>

把容器根文件系统挂成只读。无状态服务的强力加固默认值。

常见坑: 会写临时文件的应用会挂。加 --tmpfs /tmp(以及其他要写的路径)给它们一块可写区。

例子
docker run --read-only --tmpfs /tmp nginx
docker run --read-only -v logs:/var/log myapp
docker run --cap-drop ALL <image>

丢掉所有 Linux capability,再用 --cap-add 只加回应用真正需要的那几个。

常见坑: 容器默认带的 cap 集比多数应用所需的多。先全丢再按需加,才是真正的最小权限。

例子
docker run --cap-drop ALL --cap-add NET_BIND_SERVICE nginx
docker run --cap-drop ALL alpine id
docker run --security-opt no-new-privileges <image>

禁止容器进程通过 setuid 程序提权。

例子
docker run --security-opt no-new-privileges:true myapp
docker run --health-cmd <cmd> <image>

挂一个健康检查,docker ps 会显示 healthy/unhealthy,编排器也能据此动作。

常见坑: 只 ping localhost 的健康检查,应用上游坏了也可能报 healthy。要探真正的业务端点。

例子
docker run --health-cmd "curl -f http://localhost/ || exit 1" --health-interval 30s nginx
docker run --gpus all <image>

把宿主 NVIDIA GPU 暴露给容器(需要装 NVIDIA Container Toolkit)。

常见坑: --gpus 要宿主装了 nvidia-container-toolkit,没装就报 "could not select device driver"。

例子
docker run --gpus all nvidia/cuda:12.4.1-base nvidia-smi
docker run --gpus "device=0,1" myapp
docker run --add-host <host>:<ip> <image>

在容器的 /etc/hosts 里加一条自定义解析。

例子
docker run --add-host db.local:10.0.0.5 myapp
docker run --add-host host.docker.internal:host-gateway myapp
docker update <container>

在不重建的前提下,改运行中容器的资源限制(CPU、内存、重启策略)。

常见坑: 多数设置即时生效,少数(如 --restart)要下次启动才生效。端口和卷挂载根本改不了。

例子
docker update --memory 1g web
docker update --restart unless-stopped web
docker update --cpus 2 web
docker exec -e <KEY=val> <container> <cmd>

在运行中容器里执行命令,并临时给这条命令加环境变量。

例子
docker exec -e DEBUG=1 -it web node debug.js
docker exec -e PGPASSWORD=secret db psql -U app
docker logs --timestamps <container>

给每行日志加上 daemon 记录的 RFC3339 时间戳。

例子
docker logs -t web
docker logs -t --since 2026-01-01T00:00:00 web
docker run --init <image>

用一个极小的 init(tini)当 PID 1,回收僵尸进程并正确转发信号。

常见坑: 应用 fork 子进程又不回收,僵尸进程会堆积。--init 不动镜像就能解决。

例子
docker run --init myapp
docker run --init -d --name worker myapp
网络 (12)
docker network ls

列出所有 docker 网络。默认就有 bridge、host、none 三个。

例子
docker network ls
docker network ls --filter "driver=bridge"
docker network create <name>

创建一个用户自定义 bridge 网络。同一网络内的容器可以用容器名互相解析。

常见坑: 默认 bridge 网络没有基于 DNS 的服务发现,容器之间不能用名字互通。生产/开发都建一个用户网络。

例子
docker network create app-net
docker network create --driver bridge app-net
docker network create --subnet 172.20.0.0/16 app-net
docker network inspect <network>

查看网络详情:子网、网关、连接的容器、选项。

例子
docker network inspect bridge
docker network inspect app-net
docker network connect <network> <container>

把运行中容器接到额外的网络(容器可同时在多个网络)。

例子
docker network connect app-net web
docker network connect --alias api app-net web
docker network disconnect <network> <container>

把容器从某个网络断开,但不停容器。

例子
docker network disconnect app-net web
docker network disconnect -f app-net web
docker network rm <network>

删除一个或多个空的用户自定义网络。

常见坑: 还有容器连着的网络删不掉,要先 disconnect 容器或删容器。

例子
docker network rm app-net
docker network prune
docker run --network <name> <image>

启动容器时直接接到指定网络。

例子
docker run -d --network app-net --name web nginx
docker run --network host nginx
docker network create --internal <name>

创建一个无外网连接的网络;容器之间能通,但出不去公网。

常见坑: 适合永远不该外联的数据库层。但这样 DB 也拉不了更新、发不了 webhook。

例子
docker network create --internal backend
docker run --network backend --name db postgres
docker run --network host <image>

直接共用宿主网络栈;容器没有独立的网络命名空间。

常见坑: macOS/Windows 上 --network host 不像 Linux 那样能访问宿主端口,docker 跑在 VM 里。基本只在 Linux 有意义。

例子
docker run --network host nginx
docker run --network host -d prom/prometheus
docker run --dns <ip> <image>

覆盖容器用于域名解析的 DNS 服务器。

例子
docker run --dns 1.1.1.1 alpine nslookup example.com
docker run --dns 8.8.8.8 --dns-search corp.local myapp
docker network create --attachable <name>

创建一个独立容器也能接入的 overlay/bridge 网络(不只限 swarm 服务)。

例子
docker network create --driver overlay --attachable mesh
docker network connect mesh standalone-tool
docker run --network none <image>

完全不给容器网络,只有 loopback。运行不可信代码时的最强隔离。

例子
docker run --network none --rm untrusted-job
docker run --network none alpine ip addr
数据卷 (9)
docker volume ls

列出所有 docker 管理的卷。

例子
docker volume ls
docker volume ls --filter "dangling=true"
docker volume create <name>

创建命名卷。数据脱离容器生命周期持久化。

例子
docker volume create pgdata
docker volume create --driver local --opt type=tmpfs fastdata
docker volume inspect <name>

查看卷的元信息:driver、宿主上的挂载点、label。

例子
docker volume inspect pgdata
docker volume rm <name>

删除一个或多个卷。还有容器在用会失败。

常见坑: 删卷不可逆,DB 数据真没了。共享卷在 prune 前先备份。

例子
docker volume rm pgdata
docker volume rm $(docker volume ls -q -f "dangling=true")
docker volume prune

删除所有当前没被任何容器使用的卷。

常见坑: 停止的容器算“在用”。只被已删容器引用过的卷算“没用”,会被 prune 掉。

例子
docker volume prune
docker volume prune -a -f
docker run --mount type=volume,...

比 -v 更显式啰嗦的写法。每个选项都是 key=value,不容易悄悄写错。

常见坑: 用 -v 时源路径打错会悄悄新建一个空卷。--mount 会直接报错,生产更安全。

例子
docker run --mount type=volume,source=pgdata,target=/var/lib/postgresql/data postgres
docker run --mount type=bind,source=$(pwd),target=/app,readonly node:20
docker run --mount type=tmpfs,...

把内存里的 tmpfs 挂进容器;读写快、停止即消失。适合密钥/临时盘。

例子
docker run --mount type=tmpfs,target=/tmp,tmpfs-size=64m myapp
docker run --tmpfs /run:rw,size=16m nginx
docker volume create --opt (nfs)

用 local driver 的选项创建一个由 NFS 共享支撑的卷。

例子
docker volume create --driver local --opt type=nfs --opt o=addr=10.0.0.5,rw --opt device=:/exports/data nfsdata
volume backup via tar

起一个一次性容器把命名卷内容 tar 到宿主,实现卷备份。

常见坑: 没有 docker volume backup 这条命令。靠一次性容器 tar 出来是标准做法。

例子
docker run --rm -v pgdata:/data -v $(pwd):/backup alpine tar czf /backup/pgdata.tar.gz -C /data .
docker run --rm -v pgdata:/data -v $(pwd):/backup alpine tar xzf /backup/pgdata.tar.gz -C /data
系统 (13)
docker system df

显示镜像、容器、卷、构建缓存各占多少磁盘(docker 版的 du)。

例子
docker system df
docker system df -v
docker system prune

一把清掉已停容器、悬挂镜像、没用的网络、构建缓存。

常见坑: `-a --volumes` 会连未用的镜像和卷一起删,常见事故就是 DB 数据被这条命令清没。看清提示再 y。

例子
docker system prune
docker system prune -a
docker system prune -a --volumes
docker system info

打印 daemon 级别信息:容器/镜像总数、存储驱动、内核、操作系统、registry 镜像。

例子
docker info
docker info --format "{{.ServerVersion}}"
docker version

显示 client、server 版本,API 版本,Go 版本,git commit。

例子
docker version
docker version --format "{{.Server.Version}}"
docker events

实时流式输出 daemon 事件:容器启停、镜像 pull、网络创建。调试神器。

例子
docker events
docker events --filter "type=container"
docker events --since 1h --until 5m
docker login

登录到一个 registry。凭证存在 ~/.docker/config.json。

常见坑: 共享机上 config.json 可能明文存。用 docker-credential-helpers(osxkeychain / pass)才安全。

例子
docker login
docker login ghcr.io
echo $TOKEN | docker login -u user --password-stdin ghcr.io
docker logout

清除已缓存的 registry 凭证。

例子
docker logout
docker logout ghcr.io
docker context ls

列出 docker context(本地 socket、远程 SSH 主机、Desktop)。切换 CLI 连的是哪个 daemon。

常见坑: 连错 context(比如本想连本地却连了生产)是经典翻车点。先 docker context show 确认。

例子
docker context ls
docker context use my-remote
docker context create remote --docker "host=ssh://user@host"
docker builder prune

专门回收 BuildKit 构建缓存占的磁盘,不动镜像和容器。

常见坑: docker system df 里构建缓存常是占盘最多的一项。用这条单独清掉,不误伤镜像。

例子
docker builder prune
docker builder prune -af --filter "until=72h"
docker stats --format

用自定义单行格式流式输出容器统计,不要那张完整的实时表。

例子
docker stats --no-stream --format "{{.Name}}: {{.MemUsage}}"
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemPerc}}"
docker inspect --format (template)

用 Go 模板从任何对象的 inspect JSON 里精确取出你要的字段。

常见坑: 在 --format 里用 {{json .Field}} 把子对象转成 JSON,用 {{index .Map "key"}} 按键读 map。

例子
docker inspect --format "{{json .Mounts}}" web
docker inspect --format "{{index .Config.Labels \"version\"}}" web
docker system events --filter

订阅过滤后的实时事件流,比如只看容器 die 事件,用于告警或审计。

例子
docker events --filter "event=die"
docker events --filter "image=nginx" --filter "event=start"
docker info --format (driver)

快速查存储驱动、cgroup 版本或默认 runtime,不用翻整页 docker info。

例子
docker info --format "{{.Driver}}"
docker info --format "{{.CgroupVersion}}"
Compose (18)
docker compose up

创建并启动 compose.yaml 里定义的所有服务。加 -d 后台跑。

常见坑: `docker-compose`(带横线)是 V1 已弃用。现在用 `docker compose`(空格),是内置在新版 docker 里的 V2 插件。

例子
docker compose up
docker compose up -d
docker compose up --build
docker compose up web db
docker compose down

停止并删除所有容器、网络、默认网络。加 -v 连命名卷一起删。

常见坑: `down -v` 会把数据卷一起清。开发顺手敲一下没事,到 staging 同样命令就丢用户数据。把 -v 当作破坏性操作。

例子
docker compose down
docker compose down -v
docker compose down --rmi all
docker compose ps

列出本 compose 项目管理的容器(带健康状态和端口)。

例子
docker compose ps
docker compose ps --status running
docker compose logs

聚合查看所有服务的日志。-f 跟踪,--tail 限定每个服务的行数。

例子
docker compose logs
docker compose logs -f web
docker compose logs --tail=50 -f
docker compose build

构建(或重建)compose.yaml 里所有写了 build: 的服务。

常见坑: 默认 `docker compose up` 不会因为 Dockerfile 改了就重建。要么加 --build,要么先单独 build。

例子
docker compose build
docker compose build --no-cache web
docker compose build --pull
docker compose restart

重启所有(或指定)服务,但不重建容器。

例子
docker compose restart
docker compose restart web
docker compose exec <svc> <cmd>

在 compose 服务的运行容器里执行命令(区别于 run,run 会起新容器)。

例子
docker compose exec web bash
docker compose exec db psql -U postgres
docker compose exec -T db pg_dump mydb > backup.sql
docker compose run <svc> <cmd>

为某服务起一个临时新容器跑命令。会接上网络和卷,但默认不发布端口。

常见坑: `compose run` 默认不发布 compose.yaml 里写的端口,要端口加 --service-ports。

例子
docker compose run --rm web npm test
docker compose run --rm --service-ports web bash
docker compose pull

为所有写了 image: 的服务拉取最新镜像。

例子
docker compose pull
docker compose pull web db
docker compose config

解析并校验 compose.yaml,打印合并后的最终配置。调试环境变量插值很好用。

例子
docker compose config
docker compose config --services
docker compose -f compose.yaml -f compose.prod.yaml config
docker compose stop

停止服务但不删容器。之后用 start 启回来。

例子
docker compose stop
docker compose stop web
docker compose up -d --wait

后台起服务并阻塞,直到全部报 healthy(或失败)。CI 里很理想。

常见坑: --wait 只有服务定义了 healthcheck 才有意义。没有的话 compose 把“启动”当“就绪”,而它经常不是。

例子
docker compose up -d --wait
docker compose up -d --wait --wait-timeout 60
docker compose --profile <p> up

只启动打了指定 profile 标签的服务。让一个 compose 文件能容纳仅开发/仅调试用的服务。

例子
docker compose --profile debug up
docker compose --profile prod up -d
docker compose pull --policy missing

控制 compose 何时拉镜像。missing 只拉本地没有的镜像。

例子
docker compose pull --policy missing
docker compose up --pull never
docker compose watch

监听源码文件,按 compose.yaml 里 develop.watch 配置自动同步/重建服务。

常见坑: watch 要服务里写 develop: 段,默认不开。它是 compose 原生热重载,不用 bind mount。

例子
docker compose watch
docker compose up --watch
docker compose -p <name> ...

显式设置 compose 项目名,把容器/网络/卷的命名与其他 stack 隔开。

常见坑: 默认项目名就是文件夹名。同名文件夹里的两份 clone 会撞。每个 stack 用 -p(或 COMPOSE_PROJECT_NAME)。

例子
docker compose -p staging up -d
COMPOSE_PROJECT_NAME=ci docker compose up
docker compose cp <svc>:<src> <dst>

在 compose 服务容器和宿主之间拷文件(compose 版的 docker cp)。

例子
docker compose cp db:/var/lib/postgresql/data/pg_hba.conf ./
docker compose cp ./seed.sql db:/tmp/
docker compose top

按服务分组显示各服务容器内正在跑的进程。

例子
docker compose top
docker compose top web
构建技巧 (17)
DOCKER_BUILDKIT=1 docker build

启用 BuildKit,现代构建引擎,支持并行 layer、cache mount、secret,构建速度起飞。

常见坑: BuildKit 从 Docker Engine 23.0 起默认开启。老版本要么每次 export DOCKER_BUILDKIT=1,要么写到 daemon.json。

例子
DOCKER_BUILDKIT=1 docker build -t myapp .
docker buildx build -t myapp .
docker build --target <stage>

在多阶段 Dockerfile 里只构建到指定 stage。dev 镜像停在 builder 阶段很常用。

例子
docker build --target builder -t myapp:dev .
docker build --target prod -t myapp:prod .
docker build --platform <plat>

构建指定目标平台的镜像。支持跨架构(amd64 宿主构 linux/arm64),底层走模拟。

常见坑: QEMU 模拟跨架构构建比原生慢 5-20 倍。生产多架构用 docker buildx + 远端 ARM 节点。

例子
docker build --platform linux/amd64 -t myapp .
docker buildx build --platform linux/amd64,linux/arm64 -t myorg/myapp --push .
docker build --build-arg <KEY=VALUE>

传一个构建时变量给 Dockerfile 里 ARG 对应的字段。

常见坑: ARG 值会出现在 docker history 里,千万别这样传密钥。用 BuildKit 的 --secret 才安全。

例子
docker build --build-arg NODE_VERSION=20 -t myapp .
docker build --build-arg GIT_SHA=$(git rev-parse HEAD) -t myapp .
docker buildx build --secret

向构建传递密钥,不会出现在最终镜像或 docker history 里。

例子
docker buildx build --secret id=npmrc,src=$HOME/.npmrc -t myapp .
RUN --mount=type=secret,id=npmrc cp /run/secrets/npmrc ./
docker buildx build --cache-from

从远端镜像复用构建缓存(CI 里本地缓存为空时特别有用)。

例子
docker buildx build --cache-from type=registry,ref=myorg/myapp:cache --cache-to type=registry,ref=myorg/myapp:cache,mode=max -t myorg/myapp:v1 --push .
.dockerignore

告诉 docker 构建上下文里要排除哪些路径。语法跟 .gitignore 一样。

常见坑: 没 .dockerignore,docker 会把 node_modules、.git、dist、.env 全传给 daemon,构建慢,密钥还可能漏进 layer。

例子
echo "node_modules\n.git\ndist\n.env*" > .dockerignore
multi-stage Dockerfile

用多个 FROM 块在第一阶段(带工具链)构建,把产物复制到极小的运行时镜像。

常见坑: 不用多阶段,生产镜像把 gcc、npm、源码、测试都带上,轻松 1GB+。用了多阶段同样的应用 50MB 搞定。

例子
FROM node:20 AS builder\nWORKDIR /app\nCOPY . .\nRUN npm ci && npm run build\n\nFROM nginx:alpine\nCOPY --from=builder /app/dist /usr/share/nginx/html
docker buildx

扩展构建命令(BuildKit)。多平台、缓存后端、输出到 registry/tar/oci,一站式。

例子
docker buildx create --use --name multi
docker buildx build --platform linux/amd64,linux/arm64 -t myorg/app --push .
docker buildx ls
RUN --mount=type=cache,...

BuildKit 缓存挂载:让包管理器缓存跨构建保留,又不烤进 layer。

常见坑: 缓存挂载在构建之间保留,但从不进镜像,给 ~/.npm、/root/.cache/pip、go mod 缓存用正好。

例子
RUN --mount=type=cache,target=/root/.npm npm ci
RUN --mount=type=cache,target=/root/.cache/pip pip install -r requirements.txt
docker buildx bake

用 docker-bake.hcl / compose 文件,一次并行、声明式地构建一整组目标。

例子
docker buildx bake
docker buildx bake --push web api
docker buildx bake -f docker-bake.hcl --set "*.platform=linux/amd64,linux/arm64"
docker build --output type=local

把构建产物直接导出到宿主文件系统,而不是生成容器镜像。

常见坑: 用 --output type=local,dest=./out,最终 stage 的文件系统落到磁盘,编静态二进制或站点很方便。

例子
docker buildx build --output type=local,dest=./dist .
docker buildx build -o type=tar,dest=out.tar .
docker build --progress=plain

打印完整不折叠的构建日志(每条 RUN 都展开),不要那个整洁的 TTY 视图。CI 排错必备。

例子
docker build --progress=plain --no-cache -t myapp .
BUILDKIT_PROGRESS=plain docker build -t myapp .
HEALTHCHECK in Dockerfile

把健康检查烤进镜像,让基于它起的每个容器都自动上报健康状态。

常见坑: Dockerfile 里的 HEALTHCHECK 被所有容器继承;docker run --health-cmd 只对那一次生效且会覆盖它。

例子
HEALTHCHECK --interval=30s --timeout=3s CMD curl -f http://localhost/ || exit 1
HEALTHCHECK NONE  # disable an inherited check
ENTRYPOINT vs CMD

ENTRYPOINT 定固定可执行程序;CMD 定默认参数。两者配合做出可配置的容器命令。

常见坑: 用 exec 数组形式 ["nginx","-g","daemon off;"],别用 shell 形式。shell 形式套了 /bin/sh -c,会吞掉 SIGTERM。

例子
ENTRYPOINT ["python", "app.py"]\nCMD ["--port", "8080"]
docker run myapp --port 9090  # overrides CMD, keeps ENTRYPOINT
COPY --chown / --chmod

在 COPY 同一步里设好拷入文件的属主和权限,省掉一条额外的 RUN chown layer。

例子
COPY --chown=node:node . /app
COPY --chmod=755 entrypoint.sh /usr/local/bin/
COPY --from=<image>

从另一个镜像(不只是前面的构建 stage)把文件拷进当前 stage。

例子
COPY --from=golang:1.22 /usr/local/go/bin/go /usr/local/bin/go
COPY --from=builder /app/dist /usr/share/nginx/html
常见错误 (17)
Cannot connect to the Docker daemon

daemon 没起,或当前用户不在 docker 组。Linux 上:sudo systemctl start docker 然后 sudo usermod -aG docker $USER 重登。

常见坑: macOS/Windows 上 daemon 就是 Docker Desktop,把 app 开起来。WSL2 要在 Docker Desktop 里给对应发行版开 WSL 集成。

例子
sudo systemctl start docker
sudo systemctl status docker
docker context ls
permission denied while trying to connect (Linux)

当前用户没在 docker 组。加入并重登(组成员关系是登录时加载的)。

常见坑: `sudo docker` 能跑,但每条命令都 sudo 失去意义。组关系要重登才生效(或 newgrp docker 临时切)。

例子
sudo usermod -aG docker $USER
newgrp docker
docker ps
image too large

换 slim 基础镜像(alpine / distroless),用多阶段,npm ci --omit=dev,把大目录的 COPY 放最后以保证缓存命中。

常见坑: 每条 RUN 一层,`RUN apt update && apt install -y x && rm -rf /var/lib/apt/lists/*` 写一行比拆三条 RUN 小得多。

例子
FROM node:20-alpine
FROM gcr.io/distroless/nodejs20
docker history --no-trunc myapp:latest
container exited with code 137 (OOMKilled)

137 = 128 + SIGKILL(9)。内核 OOM killer 干掉了容器。要么加 --memory,要么修内存泄漏。

常见坑: Docker Desktop 那个 VM 自己有内存上限(老版本默认 2GB,新版 8GB)。Settings > Resources 里改。

例子
docker run -m 1g myapp
docker inspect --format "{{.State.OOMKilled}}" web
docker stats --no-stream web
container exited with code 125 / 126 / 127

125 = docker 自己报错;126 = 命令找到但不可执行;127 = 容器里找不到这个命令。

常见坑: alpine 上常遇到 127,多数发行版有 bash,alpine 只有 sh。要么用 sh,要么装 bash。

例子
docker run --rm alpine sh -c "echo hi"
docker run --rm alpine bash  # exit 127
docker run --rm alpine apk add --no-cache bash
no space left on device

docker 占满了 /var/lib/docker。先 docker system prune,再 docker system df 看剩什么。

常见坑: Docker Desktop 那个盘是稀疏 VM 文件,prune 后逻辑空间释放但 .raw 文件不会自动缩。万不得已就 Reset disk image。

例子
docker system df
docker system prune -a --volumes
sudo du -sh /var/lib/docker
address already in use (port conflict)

另一个进程(常是之前的容器)占了宿主端口。lsof -i :<port> 或 docker ps -a 找出来,停掉/删掉。

例子
docker ps -a --filter "publish=8080"
lsof -i :8080
docker rm -f $(docker ps -aq -f "publish=8080")
manifest unknown / image not found

registry 里没这个 tag。检查拼写,用 docker buildx imagetools inspect <image> 或 registry UI 确认。

常见坑: 私有 registry 上也可能是没登录,先 docker login。ARM 机器拉 amd64 only 的镜像也会报这个。

例子
docker buildx imagetools inspect ghcr.io/user/app:v1
docker login ghcr.io
docker pull --platform linux/amd64 myimg
Docker Desktop vs Podman vs nerdctl

三者 CLI 几乎兼容。Desktop 是官方 GUI 套装(大公司收费)。Podman 默认无 daemon、无 root。nerdctl 跟 containerd 一起出。

常见坑: Podman 把 docker 别名指到 podman,直到某个工具假设 /var/run/docker.sock 存在就抓瞎。要么 podman system service 起来,要么留 docker。

例子
alias docker=podman
podman system service --time=0 unix:///tmp/podman.sock &
nerdctl run hello-world
exec format error

你在跑为另一种 CPU 架构构建的镜像(比如 amd64 宿主上跑 arm64 镜像)。

常见坑: Apple Silicon 拉 amd64-only 镜像、或 amd64 的 CI 跑 arm64 构建时常见。加 --platform 或构多架构镜像。

例子
docker run --platform linux/amd64 myimg
docker buildx build --platform linux/amd64,linux/arm64 -t myorg/app --push .
COPY failed: file not found in build context

COPY 的路径在构建上下文之外,或被 .dockerignore 排除了。

常见坑: COPY 路径相对的是构建上下文根(docker build 最后那个参数),不是 Dockerfile 所在目录。COPY ../xxx 是不行的。

例子
docker build -f docker/Dockerfile .   # context is "."
cat .dockerignore   # check nothing excludes the file
changes inside container disappear after restart

容器的可写层是临时的。没挂卷的话,写进去的东西在 rm/重建时就没了。

常见坑: docker stop 再 start 保留可写层;docker rm 再 run 就不保留。要长存的数据请挂卷。

例子
docker run -v pgdata:/var/lib/postgresql/data postgres
docker inspect --format "{{.Mounts}}" db
localhost inside container is not the host

在容器里,localhost 指容器自己,不是宿主机,也不是另一个容器。

常见坑: 容器里要访问宿主用 host.docker.internal(Desktop),Linux 上加 --add-host host.docker.internal:host-gateway。访问另一个容器就用它在共享网络里的服务名/容器名。

例子
docker run --add-host host.docker.internal:host-gateway myapp
curl http://host.docker.internal:5432
failed to solve: failed to read dockerfile

BuildKit 找不到 Dockerfile,-f 路径写错,或上下文里压根没有 Dockerfile。

常见坑: 默认文件名是 Dockerfile(大写 D)。区分大小写的文件系统上,dockerfile 不加 -f 是找不到的。

例子
docker build -f path/to/Dockerfile .
ls -la Dockerfile
tls: failed to verify certificate / x509

从用自签名/不受信证书的 registry 拉取。daemon 拒绝 TLS 握手。

常见坑: 私有 registry 临时调试可在 daemon.json 的 insecure-registries 里加它;生产应把它的 CA 装进宿主信任库。

例子
/etc/docker/daemon.json: {"insecure-registries":["registry.local:5000"]}
sudo cp registry-ca.crt /usr/local/share/ca-certificates/ && sudo update-ca-certificates
context canceled / build hangs at sending build context

构建还没开始,就在往 daemon 上传一个巨大(好几个 GB)的构建上下文。

常见坑: 基本都是 .dockerignore 缺失或太弱。看构建输出里 "transferring context" 的体积,再排除 node_modules/.git/dist。

例子
printf "node_modules\n.git\ndist\n*.log\n" > .dockerignore
du -sh . --exclude=node_modules
health check stuck "health: starting"

容器还在 start-period 窗口内,早期失败的检查暂时不计入。

常见坑: 一直停在 starting,说明你的 --health-cmd 每次都失败。用 docker exec 手动跑一遍那条命令看原因。

例子
docker inspect --format "{{json .State.Health}}" web
docker exec web sh -c "curl -f http://localhost/ || echo FAIL"

这个工具能做什么

可搜索的 docker 速查,覆盖你日常真正会在终端里敲的 80+ 条命令, 不是凑数的 hello-world 列表。八大分类:镜像(pull、push、build、 images、rmi、tag、save、load、history、scout、prune、inspect), 容器(run、start、stop、restart、rm、ps、exec、logs、attach、cp、 inspect、stats、top、kill、rename、pause、unpause、commit、diff、 wait、port,以及 -it / -d / --rm / -p / -v / -e / --restart 这些 你天天用却容易记错的标志都单独拆出来讲),网络(create / ls / inspect / connect / disconnect / rm,含“默认 bridge 没 DNS”这个 新手必踩的坑),数据卷(create / ls / inspect / rm / prune 带数据 丢失警告),系统(df / prune / info / version / events / login / logout),Compose V2(up / down / ps / logs / build / restart / exec / run / pull / config / stop,含 docker-compose vs docker compose 弃用提醒),构建技巧(BuildKit、多阶段 Dockerfile、 .dockerignore、--build-arg、--target、--platform、--secret、 --cache-from、buildx),还有“常见错误带解法”章节(连不上 daemon、 permission denied、镜像太大、OOMKilled 退出码 137、退出 125/126/127、 磁盘满、端口冲突、manifest unknown、Docker Desktop vs Podman vs nerdctl)。每条都有完整语法、中英文说明、对应的“常见坑”(比如 `rm vs rmi`、`-it` 拆开讲、`--rm` 是退出时删容器不是删镜像、 `ARG` 值会进 docker history 千万别传密钥、默认 bridge 没 DNS 服务发现),以及 1-4 条能直接拷贝的真实例子。搜索框跨命令/说明/坑 /例子四个字段同时过滤,分类胶囊缩范围,每条命令一键复制。完全在 浏览器里跑,不上传不追踪。配合 Git 速查 + Crontab 助手 一起用, 开发者每周都要 Google 三回的语法都在这里。

工具细节

输入
文本
页面会根据工具类型展示文本框、数值控件、文件选择或结构化输入。
输出
即时结果 + 复制
结果区优先给出可操作结果,支持项会显示复制、下载或可视化预览。
隐私
浏览器本地处理
主工具逻辑未发现外部 API 调用,输入通常留在当前标签页内处理。
保存 / 分享
免账号使用
打开页面即可使用;刷新后是否保留结果取决于具体工具。
性能预算
首屏 JS ≤ 25 KB
没有声明 WASM 依赖,适合快速打开和移动端使用。
适用场景
开发运维 · 程序员
分类和职业标签用于推荐相关工具、组织内链,并帮助用户快速判断是否适合当前任务。

怎么用

  1. 1. 输入

    把内容粘贴或拖入工具面板。

  2. 2. 处理

    点击按钮,在浏览器内本地处理,文件不上传。

  3. 3. 复制 / 下载

    一键复制结果或下载到本地。

Docker 命令速查 适合怎么用

适合穿插在写代码、查问题、做 Review、上线前的小任务里。

适合开发场景

  • 格式化、校验、压缩或检查和代码相关的文本。
  • 把片段整理好再放进文档、工单、提交或交接材料。
  • 不切换工具,快速检查一个小 payload。

开发检查项

  • 压缩、混淆这类不可逆处理,先对副本操作。
  • 除非确认工具本地处理,不要粘贴密钥和敏感片段。
  • 转换后的代码上线前,仍要跑自己的测试或 lint。

下一步可以接着做

这些入口会把当前任务接到更完整的工具链里。

  1. 1 JSON 格式化与校验 浏览器内即时格式化、校验、压缩 JSON,数据不离开本地。 打开
  2. 2 Git 命令速查 Git 命令速查:可搜可分类,每条带说明、常见坑、真实例子。 打开
  3. 3 正则速查表 交互式正则速查表,JS / Python / PCRE 各方言一站查询。 打开

真实使用场景

  • 带新人,他老是删错东西

    新同事为了腾磁盘敲了 `docker rm myimage`,报「no such container」,又加 `-f` 结果删掉了一个在跑的数据库。把「容器」 分类甩给他,指着 `rm` 和 `rmi` 那行「常见坑」,搜索框输入 「删」两边都能命中。读 5 分钟,比一场 40 分钟的事故加恢复卷 划算多了。

  • 排查 CI 里退出码 137 的容器

    构建任务退出码 137 直接挂了,流水线日志啥有用信息都没有。搜 框输「137」或「OOM」,退出码那条就把 OOMKilled 确认命令连同 `--memory`、Docker Desktop VM 内存上限的解法一起翻出来。你把 runner 内存从 2GB 提到 4GB,那个先绿后红跑三小时的偶发就没了。

  • 推镜像前把 1.2GB 砍下来

    往远端区域部署要花 9 分钟,就因为镜像 1.2GB。筛到「构建技巧」, 抄多阶段 Dockerfile 和 `.dockerignore` 写法,运行时基础镜像换 distroless,镜像降到 140MB。推送时间掉到一分钟内,回滚窗口也 跟着变短。

  • 一句话终结 docker-compose 和 docker compose 的争论

    组里一半人脚本写 `docker-compose`(带横线),换了台干净 runner 就报「command not found」。搜「compose」读那条 V2 弃用提醒,你 跑一遍 sed 把 14 个 Makefile 里的横线换成空格。runner 用上自带 的 Go 插件,CI 不用装老的 Python 二进制就转绿了。

常见踩坑

  • 用 `docker rm 镜像名` 删镜像。`rm` 删的是容器,删镜像要 `rmi`(或 `docker image rm`),搞混就报「no such container」。

  • 把密钥塞进 `--build-arg`。ARG 值会写进 `docker history`,拿到镜像的人都能读出你的 token,改用 BuildKit 的 `--secret`。

  • 指望默认 `bridge` 网络能服务发现。它没 DNS,`ping web` 直接失败,建个自定义网络(`docker network create app`)容器之间才能按名字互相解析。

隐私说明

这份速查就是一个静态页面。你搜的内容完全在浏览器里、对内存中的命令 数组做匹配,不上传、不记录、也不写进 URL。打开 DevTools 看 Network 面板一边输入一边看,零请求。公司代理后面、飞机上、离网跳板机上都能 正常用。

常见问题

类似工具组合

做你这行的人, 还会一起用这些。

Made by Toolora · 100% client-side · Updated 2026-07-02