18附录:命令速查

3500 字
18 分钟
18附录:命令速查

命令速查#

按主题汇总全系列出现过的命令。同一条命令往往在好几关里反复出现,所以这里只收一处,正文在用到时链到对应小节;每条命令表正后方跟着它那几条容易记反、记漏的地方。

上下文#

命令作用
docker context ls列出所有上下文,带 * 的是当前在用的那个
docker context use <名字>切换当前上下文
docker --context <名字> <子命令>只对这一条命令指定上下文,不动全局设置

容器生命周期#

命令作用
docker run hello-world最简的一次运行:拉镜像、建容器、跑一次、退出
docker run -d -p 8080:80 nginx后台运行一个容器,把宿主机 8080 转发到容器的 80
docker ps列出运行中的容器
docker ps -a连已停止的容器一起列出
docker start <容器>启动一个已停止的容器
docker stop <容器>停止一个运行中的容器
docker restart <容器>重启容器
docker rm <容器>删除容器
docker rm -f <容器>强制删除,运行中的也能删
docker rename <容器> <新名字>改容器名,运行中或已停止都能改,不用重启

备忘:退出码直接说明「怎么死的」——0 正常结束;1 程序报错;125 docker run 参数错;126 命令不可执行;127 命令找不到;137 被 SIGKILL(128+9,常见于内存超限或 stop 超时);143 被 SIGTERM(128+15)。

运行时的参数#

命令作用
docker run -d --name <名字> <镜像>给容器指定名字;不指定则随机生成一个,用名字或 ID 指代容器都可以
docker run --hostname <名字> <镜像>指定主机名;不写就是容器 ID。容器名(--name)和主机名是两回事,内建 DNS 两个都登记
docker run --rm <镜像>容器退出后自动删除
docker run -e 名字=值 <镜像>用环境变量改掉镜像的默认行为,要传几个就写几遍
docker run -v 宿主路径:容器路径 <镜像>把宿主机的目录或文件接到容器里,顺序是「宿主<容器>」
docker run -v 宿主路径:容器路径:ro <镜像>同上,但容器里只能读不能改
docker run <镜像> <命令>覆盖镜像默认启动的那个程序(顶掉的是 CMD)
docker run --entrypoint <程序> <镜像>连 ENTRYPOINT 一起换掉,而不只是换 CMD

备忘:

  • 带冒号的参数,两边都是「宿主机在前,容器在后」——-p、-v 一个规矩。
  • 想无条件钻进任意镜像,用 --entrypoint sh;docker run -it <镜像> sh 不保证有效——镜像名后面那个位置的含义由镜像决定。

安全#

命令作用
docker run --user <uid:gid> <镜像>指定容器里以哪个用户跑;不写就是镜像的 USER,再没有就是 root
docker run --cap-drop ALL --cap-add <能力> <镜像>先收走全部 Linux 能力,再按需加回
docker run --security-opt no-new-privileges <镜像>禁止进程通过 setuid 程序升权
docker run --security-opt seccomp=<文件> <镜像>换一份系统调用白名单;默认那份已经在挡
docker network create --internal <名字>建一张没有出口的内部网,只有接在上面的容器互通
docker run -p 127.0.0.1:<宿主端口>:<容器端口> <镜像>只绑本机回环;不写 127.0.0.1 会绑 0.0.0.0,同网段都能连

备忘:

  • 密码别放 -e:它会留在终端历史、Config.Env、每个进程的环境变量里,且只能重建才改得掉。放文件挂进去(mysql 有 MYSQL_ROOT_PASSWORD_FILE 这类写法,-e 里只写路径)。
  • --privileged 等于把笼子拆了;要最小化用 --cap-drop ALL 再按需 --cap-add。

资源限制#

命令作用
docker run --cpus=1.5 <镜像>CPU 硬上限:最多用 1.5 个核的算力
docker run --cpu-shares=512 <镜像>CPU 相对权重(默认 1024),只在抢的时候起作用,不是上限
docker run --cpuset-cpus="0,1" <镜像>绑到指定的核上
docker run --memory=512m <镜像>内存硬上限;碰到就被 OOM killer 杀(退出码 137)
docker run --memory=512m --memory-swap=1g <镜像>内存 + swap 的总量
docker run --memory-reservation=256m <镜像>内存软上限,系统吃紧时才尽量压回来
docker stats实时看每个容器的 CPU、内存、网络、磁盘;--no-stream 只取一次
docker update --cpus=0.5 --memory=256m <容器>对运行中的容器直接改资源限制,不用重建

备忘:

  • --cpus 是封顶,--cpu-shares 是抢 CPU 时的权重(不是上限)。
  • --memory 是上限不是预留:超了被 OOM killer 杀(137),日志里常常什么都没有。
  • docker update 能改运行参数,不能改配置:环境变量、端口、挂载、启动命令只能重建。
  • Docker Desktop 还有一层总配额:docker info 里的总内存是虚拟机的,不是宿主机的。

日志与进入容器#

命令作用
docker logs <容器>查看容器主进程的输出
docker logs -f <容器>持续跟随输出
docker inspect --format '{{.LogPath}}' <容器>看这个容器的日志文件落在哪(在跑引擎的那台机器上)
docker run --log-opt max-size=10m --log-opt max-file=3 <镜像>给日志设上限:单文件最大 10m,最多留 3 个
docker exec -it <容器> bash在运行中的容器里另起一个进程,通常是开一个交互式终端

备忘:

  • -it 两个参数缺一不可:-i 保持输入,-t 分配终端。
  • 日志默认无上限,话多的容器能把磁盘写满。设上限:--log-opt 单次,或 daemon.json 全局(Linux 是 /etc/docker/daemon.json,Docker Desktop 走 Settings → Docker Engine;改完重启、只对新容器生效)。轮转的代价是旧日志会被丢。

进程与信号#

命令作用
docker top <容器>列出容器里跑着的进程
docker stop -t <秒> <容器>改那个宽限期;默认 10 秒,-t 0 直接发 SIGKILL
docker kill <容器>直接发 SIGKILL,不给商量的余地
docker kill -s <信号> <容器>发指定信号,发完就走,不等

备忘:

  • stop 先发 SIGTERM 再等(默认 10 秒),kill 直接 SIGKILL。
  • 信号只发给 1 号进程;想让程序优雅退出,它就得是 1 号——entrypoint 结尾 exec、CMD 用数组写法。

镜像#

命令作用
docker login [仓库]登录仓库,不写就是 Docker Hub;正经场景用 access token 而不是账号密码
docker logout [仓库]退出登录
docker pull <镜像>把镜像从仓库拉到本地
docker tag <镜像> <新名字>给同一个镜像再挂一个名字,不复制镜像
docker push <名字:标签>把镜像推到仓库;名字要带上仓库里的路径,否则不知道往谁那儿推
docker images列出本地已有的镜像
docker rmi <镜像>删除镜像,前提是没有容器还引用着它
docker inspect <镜像或容器>打出完整的配置,包含镜像的默认值与这次运行实际用的值
docker inspect --format '{{.State.ExitCode}}' <容器>只取一个字段,不用在整段 JSON 里翻;{{json .Config.Env}}、{{json .Mounts}} 同理
docker inspect --format '{{.State.Pid}}' <容器>容器 1 号进程在宿主机上的 PID,nsenter -t <PID> 要用它

备忘:

  • 镜像名四段:[仓库地址/]命名空间/名字:标签。省掉前两段默认 Docker Hub + 你的账号(nginx 就是 docker.io/library/nginx)。
  • latest 不是「最新」,是没写标签时的默认值,随时会变;生产用明确版本,较真用 digest(nginx@sha256:...)。
  • docker inspect 不用整段读:Config.Cmd/Entrypoint/Env/ExposedPorts、Mounts、State.* 各看各的。

构建镜像#

命令作用
docker build -t 名字:标签 .用当前目录的 Dockerfile 构建;末尾的 . 指的就是当前目录,材料都从这儿取
docker build --no-cache -t 名字:标签 .不用缓存,每次都从零重来
docker build --target <阶段> .多阶段构建里,只建到指定阶段为止
docker builder prune清掉构建缓存
docker history <镜像>列出这个镜像是一层层怎么来的
docker commit <容器> <新镜像>把容器当前的改动冻成一个新镜像(不推荐当常规手段)

备忘:

  • docker build 末尾 . 是当前目录(材料来源),不是 Dockerfile 位置;不想要的用 .dockerignore 挡掉。
  • -t 名字:标签:冒号前名字、后标签;不写标签是 latest。
  • 构建复用层:指纹没变打 CACHED,一变后面全重做;不常变的放前面、常变的放后面。
  • COPY --from=<阶段> 源 目标 从别的阶段(或镜像)拷文件。
  • VOLUME 声明过的目录,docker run 时自动生成匿名卷。

卷与数据#

命令作用
docker volume create <名字>建一个卷
docker volume ls列出所有卷;看起来像一长串随机字符的是匿名卷
docker volume inspect <名字>看这个卷在磁盘上的位置
docker volume rm <名字>删卷,前提是没有容器在用它
docker volume prune清掉所有没被使用的卷(不问就删)
docker run -v 卷名:容器路径 <镜像>把卷挂进容器
docker run -v 容器路径 <镜像>只写一边 → Docker 自动建一个匿名卷
docker run --tmpfs 容器路径 <镜像>挂一块内存盘,不落磁盘,容器一停就没

备忘:

  • -v 第一段以 /、./、../ 开头是路径,否则被当卷名;~ 别写进引号(会被当成卷名而报错)。
  • :ro 是 Linux 挂载的 read-only 选项(mount -o ro)。
  • 三种挂载怎么选:长期/交付 → 卷;开发改文件 → 绑定挂载;临时 → --tmpfs。
  • 备份卷:临时容器挂「卷(:ro) + 宿主目录」再 tar,两个 -v 少一个不行,打包加 -C。

网络#

命令作用
docker network ls列出所有网络;bridge、host、none 是自带的三张
docker network create <名字>建一张自定义网络
docker network inspect <名字>看这张网里有谁、各自的 IP
docker network connect <网络> <容器>把容器接上网络,运行中的也能接
docker network disconnect <网络> <容器>摘下来
docker network rm <名字>删网络,前提是没有容器还挂在上面
docker network prune清掉没有容器在用的网络(不问就删)
docker run --network <名字> <镜像>起容器时直接接上某张网络
docker run --network host <镜像>容器不单独隔离网络——但 macOS 上那个「host」是虚拟机,见第 5 关

备忘:

  • 三张自带网差别看 DRIVER:bridge 搭虚拟交换机(默认)、host 用宿主机的、none(驱动 null)什么都不搭;自定义网驱动也是 bridge,差别在有没有内建 DNS。
  • 容器名能解析,靠内建 DNS(127.0.0.11),默认网络不解析;判断用 getent hosts <名字>,别看 curl 通不通。
  • host.docker.internal 是容器里指回宿主机的名字(Docker Desktop 提供)。
  • -p 在 macOS 是 Docker Desktop 占住端口(lsof 看 com.docker.backend),Windows 用 netstat -ano | findstr :<端口>。
  • 连不上先分两层:Connection refused = 到了但没人应答;Connection timed out = 包根本没到。

Compose#

命令作用
docker compose up -d按当前目录的 compose.yaml 后台拉起整个项目,缺的镜像先拉
docker compose down停并删掉项目的容器和它自动建的网;卷不删
docker compose down -v连文件里声明的卷一起删,数据就没了
docker compose ps只看这个项目的容器,STATUS 一列带 (healthy) 这类健康状态
docker compose logs -f <服务>跟踪输出,不写服务名就是整个项目
docker compose exec <服务> <命令>在某个服务里另起一个进程,服务名就是文件里的键
docker compose config校验并打印合并后的完整配置(叠了多份文件时,用它看最后长什么样)
docker compose -f a.yaml -f b.yaml up -d按顺序叠多份文件,后面的覆盖前面的
docker compose --profile <名> up -d连同这个 profile 的服务一起起;可写多遍,或用 "*" 全开
docker compose up -d <服务>只起点名的那个服务;就算它的 profile 没激活也会起

备忘:

  • 服务名就是容器互相叫的名字;自动建 <项目>_default 网,项目名=目录名;卷要顶层 volumes: 声明。
  • depends_on 只管顺序不管就绪;等就绪用 healthcheck + condition: service_healthy。
  • 叠文件:单值项换、键值项按 key 合并、挂载按路径合并、ports 累加;compose.override.yaml 自动叠。
  • profile 控制起不起:没写永远起,写了默认不起;点名叫可以绕过。

Compose 常用字段#

正文用到的字段(image、ports、environment、volumes、depends_on、healthcheck、profiles)在各关讲过。下面这些同样常用,只是还没轮到,写到对应关再展开:

字段作用
build: .不用现成镜像,就地按 Dockerfile 构建
command: / entrypoint:覆盖镜像的启动命令,相当于 docker run 的 <命令> 和 --entrypoint
restart: unless-stopped重启策略:no(默认)/ on-failure / always / unless-stopped
env_file: .env从文件读环境变量,一行一个 名字=值
container_name: <名字>固定容器名(默认是 <项目>-<服务>-<序号>);名一固定,这个服务就不能起多个副本
networks:显式定义、接入网络;不写就用项目自建的那张
secrets:敏感数据,以文件形式挂在 /run/secrets/<名字>;只支持 Linux 容器
deploy:资源上限、副本数等;哪些键本地 docker compose 认、哪些只给 Swarm,看官方参考
logging:日志驱动与上限,如 max-size、max-file(为什么要限制,第 11 关讲)

完整字段清单见官方 Compose file reference。

系统与清理#

命令作用
docker version分别列出客户端与服务端的版本
docker info列出服务端的详细信息(存储、内核、内存等)
docker system df查看镜像、容器、卷、构建缓存各占多少空间
docker system df -v同上,再列出每一项具体是谁
docker container prune清掉已停止的容器
docker image prune清掉悬空镜像;加 -a 连没被任何容器引用的镜像也清
docker system prune清理未使用的容器、网络与悬空镜像
docker system prune -a连未被引用的镜像与构建缓存一起清理
docker system prune -a --volumes再加一样:连没在用的卷也清

备忘:

  • prune 不碰在跑容器的日志,也不治根(缓存会再攒、匿名卷会再造)。
  • macOS 上 prune 释放的空间不一定立刻还给硬盘——Docker Desktop 的磁盘镜像是只长不缩的。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
18附录:命令速查
https://hecloud.top/posts/tech/docker/18docker命令速查/
作者
贺小云
发布于
2026-10-04
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
贺小云
热爱技术与折腾的博客 Dancing with uncertainty. 与不确定性共舞
公告
出于成本考虑,贺云已全面转型Serverless架构
分类
标签
碎碎念
站点统计
文章
95
分类
5
标签
44
总字数
110,484
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Netlify CI
博客版本
Firefly v6.16.5
文章许可
CC BY-NC-SA 4.0