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 的磁盘镜像是只长不缩的。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!
相关文章智能推荐
1
12进阶:出事了怎么查
深入技术面对一个起不来或跑着跑着崩掉的容器,能在十分钟内定位到出错的那一层。
2
16怪兽:手搓迷你容器
深入技术用 namespace 与 cgroups 亲手拼出一个最小可用的容器,回头对照 Docker 的每个概念。
3
15怪兽:底层原理
深入技术看懂 namespace、cgroups、veth、iptables 与 overlayfs 各自在哪一层做了什么。
4
14进阶:资源限制与性能
深入技术给容器划出 CPU 与内存的上限,并弄清一个容器为什么还能把宿主机拖垮。
5
13进阶:容器安全
深入技术把容器关进笼子:以非 root 运行、裁剪 Linux 能力、限制系统调用,并知道这些边界在哪。
随机文章随机推荐





