Docker 常用语法与命令:CLI、Dockerfile 与 Compose 速查

Docker 常用语法与命令:CLI、Dockerfile 与 Compose 速查

摘要:用开发环境场景整理 Docker CLI、Dockerfile、Buildx、Bind Mount、Compose、镜像迁移与磁盘清理的常用语法,重点解释参数改变了什么。

文章目录

  • [Docker 常用语法与命令:CLI、Dockerfile 与 Compose 速查](#Docker 常用语法与命令:CLI、Dockerfile 与 Compose 速查)
    • [1. Docker CLI 先按"对象 + 动作"理解](#1. Docker CLI 先按“对象 + 动作”理解)
    • [2. 一条 `docker run` 命令怎么拆](#2. 一条 docker run 命令怎么拆)
    • [3. `docker run` 最常用参数](#3. docker run 最常用参数)
    • [4. `docker run`、`docker exec`、`docker start` 不一样](#4. docker rundocker execdocker start 不一样)
      • [`docker run`](#docker run)
      • [`docker start`](#docker start)
      • [`docker exec`](#docker exec)
    • [5. Image 常用命令](#5. Image 常用命令)
    • [6. Container 常用命令](#6. Container 常用命令)
    • [7. Bind mount:开发源码最常见](#7. Bind mount:开发源码最常见)
    • [8. Volume:Docker 管理的持久数据](#8. Volume:Docker 管理的持久数据)
    • [10. Dockerfile 最常见指令](#10. Dockerfile 最常见指令)
    • [12. `.dockerignore` 怎么读](#12. .dockerignore 怎么读)
    • [13. `docker buildx build` 常用参数](#13. docker buildx build 常用参数)
    • [14. BuildKit 的 `RUN --mount`](#14. BuildKit 的 RUN --mount)
    • [15. Compose 最小结构](#15. Compose 最小结构)
    • [16. `docker compose run`、`up`、`exec` 怎么区分](#16. docker compose runupexec 怎么区分)
    • [17. Image 导入导出:`save/load`](#17. Image 导入导出:save/load)
    • [18. Docker 磁盘空间怎么看](#18. Docker 磁盘空间怎么看)
    • [19. 常用排障命令组合](#19. 常用排障命令组合)
      • [Docker 命令存在,但 Engine 是否正常](#Docker 命令存在,但 Engine 是否正常)
      • [Image 是否存在](#Image 是否存在)
      • [Image 默认入口是什么](#Image 默认入口是什么)
      • [Container 实际挂载了什么](#Container 实际挂载了什么)
      • [Container 为什么已经退出](#Container 为什么已经退出)
      • [Compose 变量最终解析成什么](#Compose 变量最终解析成什么)
      • [Docker 占了多少磁盘](#Docker 占了多少磁盘)
    • [20. 四组最值得记住的模板](#20. 四组最值得记住的模板)
      • [临时进入一个 Image](#临时进入一个 Image)
      • [把 Host 源码挂到 Container](#把 Host 源码挂到 Container)
      • [构建一个本地开发 Image](#构建一个本地开发 Image)
      • [用 Compose 进入一次性开发环境](#用 Compose 进入一次性开发环境)
    • 参考资料

这一篇把前面频繁出现的 Docker 语法集中成开发机速查表,不穷举全部参数,只保留最常用对象和命令结构。

1. Docker CLI 先按"对象 + 动作"理解

现代 Docker CLI 很多命令可以读成:

text 复制代码
docker <object> <command> [options]

例如:

bash 复制代码
docker image ls
docker image inspect arm64-dev:20.04
docker container ls
docker container rm demo
docker volume ls
docker network ls

同时 Docker 仍保留大量短写:

bash 复制代码
docker images
docker ps
docker rm
docker rmi

完整对象形式更容易建立 Image、Container、Volume、Network、Builder 的边界。

2. 一条 docker run 命令怎么拆

例如:

bash 复制代码
docker run --rm -it \
    --name demo-shell \
    -e MODE=debug \
    --mount type=bind,src=/home/dev/project,dst=/workspace \
    -w /workspace \
    arm64-dev:20.04 \
    cmake --build build --parallel 4

从左到右分成四段:

text 复制代码
docker run
    ↓
Docker runtime options
    --rm -it --name -e --mount -w
    ↓
Image
    arm64-dev:20.04
    ↓
Container 内执行的命令
    cmake --build build --parallel 4

Image 名之后的 --build --parallel 4 已经属于 Container 内的 cmake,不是 Docker 参数。

3. docker run 最常用参数

--rm

bash 复制代码
docker run --rm image

主进程退出后自动删除这个 Container。

它不会删除 Image 或 bind mount 的 Host 文件,适合一次性开发 shell、编译和验证任务。

-i-t

通常写成:

bash 复制代码
-it

-i 保持标准输入打开,-t 分配伪终端。

进入 Bash 时通常两个都要:

bash 复制代码
docker run --rm -it ubuntu:24.04 bash

如果只是跑一个非交互命令:

bash 复制代码
docker run --rm image verify-env

就不一定需要 -it

--name

bash 复制代码
--name demo-dev

给 Container 一个明确名称,方便后续:

bash 复制代码
docker exec -it demo-dev bash
docker inspect demo-dev
docker rm -f demo-dev

-e / --env

bash 复制代码
-e HOST_UID=1000
-e MODE=debug

向 Container 注入环境变量。

也可以:

bash 复制代码
--env-file .env

但要注意不要把密码、token 等敏感信息随意写入版本库。

-w / --workdir

bash 复制代码
-w /workspace

设置 Container 主进程的工作目录,相当于启动程序前先 cd /workspace

--entrypoint

bash 复制代码
docker run --entrypoint /bin/sh image

它会覆盖 Image 原来的 ENTRYPOINT。假设原入口负责:

text 复制代码
source SDK
→ 设置环境变量
→ 降权
→ 执行参数命令

你用 --entrypoint verify-env 后,这整条初始化链都被跳过。

如果只是想让原 ENTRYPOINT 最终执行一个验证命令,通常写:

bash 复制代码
docker run --rm image verify-env

更合适。

4. docker rundocker execdocker start 不一样

docker run

bash 复制代码
docker run image

创建新的 Container,并立即启动。

docker start

bash 复制代码
docker start old-container

启动一个已经存在、当前停止的 Container。

docker exec

bash 复制代码
docker exec -it running-container bash

在一个已经运行的 Container 里再启动一个新进程。

所以:

text 复制代码
run   = create + start 新 Container
start = 启动旧 Container
exec  = 在运行中的 Container 增加进程

排障时这三者不要混用。

5. Image 常用命令

列出:

bash 复制代码
docker image ls

查看某个 Image:

bash 复制代码
docker image inspect arm64-dev:20.04

只看 ENTRYPOINT/CMD:

bash 复制代码
docker image inspect arm64-dev:20.04 \
    --format 'Entrypoint={{json .Config.Entrypoint}} Cmd={{json .Config.Cmd}}'

删除:

bash 复制代码
docker image rm arm64-dev:20.04

拉取:

bash 复制代码
docker pull ubuntu:24.04

注意 tag 不是不可变版本号。ubuntu:24.04 后续可能指向更新后的镜像内容;如果需要严格固定内容,可以进一步研究 digest pinning。

6. Container 常用命令

查看运行中的:

bash 复制代码
docker container ls

包含停止的:

bash 复制代码
docker container ls -a

停止:

bash 复制代码
docker stop demo

删除:

bash 复制代码
docker rm demo

强制删除仍在运行的 Container:

bash 复制代码
docker rm -f demo

能正常 stop 时优先正常停止,不要默认依赖 -f

查看日志:

bash 复制代码
docker logs demo

持续跟踪:

bash 复制代码
docker logs -f demo

Inspect:

bash 复制代码
docker inspect demo

挂载、环境变量或启动命令异常时,优先看 inspect

7. Bind mount:开发源码最常见

长语法:

bash 复制代码
docker run --rm -it \
    --mount type=bind,src=/home/dev/project,dst=/workspace \
    image

短语法:

bash 复制代码
docker run --rm -it \
    -v /home/dev/project:/workspace \
    image

工程脚本更推荐 --mount 或 Compose 长语法。

只读:

bash 复制代码
--mount type=bind,src=/home/dev/config,dst=/config,ro

Bind mount 的关键语义:

text 复制代码
Container 看到的是 Host 真实文件
Container 默认可以修改它们
Container 删除不影响这些文件

因此源码、配置和需要 Host IDE/Git 同时访问的内容适合 bind mount。

8. Volume:Docker 管理的持久数据

创建:

bash 复制代码
docker volume create build-cache

使用:

bash 复制代码
docker run --rm \
    --mount type=volume,src=build-cache,dst=/home/dev/.cache \
    image

查看:

bash 复制代码
docker volume ls

删除:

bash 复制代码
docker volume rm build-cache

Volume 更适合数据库、编译缓存和由 Docker 管理的长期状态;需要 Host 与 Container 双方直接编辑的文件则优先 bind mount。

10. Dockerfile 最常见指令

一个基础开发镜像:

dockerfile 复制代码
FROM ubuntu:20.04

ARG DEBIAN_FRONTEND=noninteractive

ENV DEV_MODE=1

RUN apt-get update \
    && apt-get install -y --no-install-recommends \
        git cmake make \
    && rm -rf /var/lib/apt/lists/*

COPY docker/entrypoint.sh /usr/local/bin/entrypoint

WORKDIR /workspace

ENTRYPOINT ["/usr/local/bin/entrypoint"]
CMD ["/bin/bash"]

FROM

dockerfile 复制代码
FROM ubuntu:20.04

指定基础 Image。

RUN

dockerfile 复制代码
RUN apt-get update && apt-get install -y git

镜像构建阶段执行命令,结果进入 Image layer。

不要和 Container 运行后的 shell 命令混淆。

COPY

dockerfile 复制代码
COPY docker/entrypoint.sh /usr/local/bin/entrypoint

从 build context 把文件写进 Image。

日常源码如果使用 bind mount,就不需要 COPY 进开发 Image。

ARG

dockerfile 复制代码
ARG DEBIAN_FRONTEND=noninteractive

主要用于 build time。

ENV

dockerfile 复制代码
ENV SDK_ROOT=/opt/vendor-sdk

写入 Image 配置,后续 Container 默认能看到。

WORKDIR

dockerfile 复制代码
WORKDIR /workspace

设置后续 Dockerfile 指令和默认 Container 工作目录。

ENTRYPOINTCMD

例如:

dockerfile 复制代码
ENTRYPOINT ["/usr/local/bin/entrypoint"]
CMD ["/bin/bash"]

默认可以理解为:

text 复制代码
/usr/local/bin/entrypoint /bin/bash

如果运行:

bash 复制代码
docker run image verify-env

通常变成:

text 复制代码
/usr/local/bin/entrypoint verify-env

所以 ENTRYPOINT 适合固定初始化入口,CMD 适合提供默认命令/参数。

12. .dockerignore 怎么读

例如:

dockerignore 复制代码
.git
logs
*.log
workspace/*
!workspace/.gitkeep
*.tar.gz
!assets/tool.tar.gz

常用规则:

text 复制代码
pattern       排除匹配内容
!pattern      重新包含

.dockerignore 的目标是减少不必要的主 build context 输入,并避免日志、Git 数据、源码 workspace、归档包意外进入构建。

如果一个文件先被 *.tar.gz 排除,但确实是 Dockerfile 的必要资产,就可以再用 ! 精确包含。

13. docker buildx build 常用参数

典型:

bash 复制代码
docker buildx build \
    --progress=plain \
    --build-context sdk=/opt/vendor-sdk \
    --load \
    -t arm64-dev:20.04 \
    .

重点参数:

参数 含义
--progress=plain 纯文本构建日志
--build-context name=path 增加额外构建输入
--load 把单平台结果导入本地 Docker Image store
-t 设置 repository:tag
. 当前目录作为主 build context

最后的 . 很重要。它不是"结束符",而是 build context 路径。

Dockerfile 不在 context 根目录时,用 -f 指定文件位置。

14. BuildKit 的 RUN --mount

Dockerfile 中可能看到:

dockerfile 复制代码
RUN --mount=type=bind,from=sdk,source=/,target=/mnt/sdk,ro \
    cp -a /mnt/sdk/. /opt/vendor-sdk/

它是构建时临时 mount ,生命周期只覆盖当前 RUN

还常见:

dockerfile 复制代码
RUN --mount=type=cache,target=/root/.cache \
    some-build-command

用于构建 cache。

不要把 Dockerfile RUN --mount 与:

bash 复制代码
docker run --mount ...

混为一谈。前者是 Image build 阶段,后者是 Container runtime 阶段。

15. Compose 最小结构

开发 Container 可以写:

yaml 复制代码
services:
  dev:
    image: "${DEV_IMAGE:-arm64-dev:20.04}"
    environment:
      HOST_UID: "${HOST_UID:-1000}"
      HOST_GID: "${HOST_GID:-1000}"
    volumes:
      - type: bind
        source: "${WORKSPACE_DIR:-./workspace}"
        target: /workspace
    working_dir: /workspace
    stdin_open: true
    tty: true

Compose 的价值不是只用于"很多微服务"。一个单 Container 开发环境也可以用它把长 docker run 参数版本化。

常用检查:

bash 复制代码
docker compose config

它能展开变量并显示 Compose 最终解析后的配置。

16. docker compose runupexec 怎么区分

run

bash 复制代码
docker compose run --rm dev

为某个 Service 创建一个一次性 Container。

很适合开发 shell 或一次性 build。

up

bash 复制代码
docker compose up

按 Compose 描述启动整个应用/Service 集合,更适合长期服务。

后台:

bash 复制代码
docker compose up -d

exec

bash 复制代码
docker compose exec dev bash

在已经由 Compose 启动且正在运行的 Service Container 里执行新进程。

17. Image 导入导出:save/load

导出:

bash 复制代码
docker save -o arm64-dev.tar arm64-dev:20.04

导入:

bash 复制代码
docker load -i arm64-dev.tar

如果压缩:

bash 复制代码
gzip -1 arm64-dev.tar

迁移前建议生成校验:

bash 复制代码
sha256sum arm64-dev.tar.gz > arm64-dev.tar.gz.sha256

这里迁移的是 Image,不是 bind mount 的 Host 源码。开发镜像迁移通常优先 save/load,不要和 Container filesystem 的 export/import 混淆。

18. Docker 磁盘空间怎么看

Host 文件系统:

bash 复制代码
df -h /var/lib/docker

Docker 对象分类:

bash 复制代码
docker system df

Build cache:

bash 复制代码
docker builder prune

删除停止的 Container 等常见无用对象:

bash 复制代码
docker system prune

范围更大的:

bash 复制代码
docker system prune -a

需要谨慎,因为 -a 会把所有没有被 Container 使用的 Image 也纳入清理范围。

刚构建完的大开发 Image 即使 ACTIVE 0 也可能仍然重要。

所以清理前先:

bash 复制代码
docker image ls
docker system df

明确自己要删的是 cache、Container 还是 Image。

19. 常用排障命令组合

Docker 命令存在,但 Engine 是否正常

bash 复制代码
docker version
docker info

Image 是否存在

bash 复制代码
docker image ls arm64-dev:20.04

Image 默认入口是什么

bash 复制代码
docker image inspect arm64-dev:20.04 \
    --format 'Entrypoint={{json .Config.Entrypoint}} Cmd={{json .Config.Cmd}}'

Container 实际挂载了什么

bash 复制代码
docker inspect demo

重点看 Mounts

Container 为什么已经退出

bash 复制代码
docker ps -a
docker logs demo

Compose 变量最终解析成什么

bash 复制代码
docker compose config

Docker 占了多少磁盘

bash 复制代码
docker system df

这些命令比"先删了重装"更适合做第一轮证据收集。

20. 四组最值得记住的模板

临时进入一个 Image

bash 复制代码
docker run --rm -it image bash

把 Host 源码挂到 Container

bash 复制代码
docker run --rm -it \
    --mount type=bind,src=/host/project,dst=/workspace \
    -w /workspace \
    image

构建一个本地开发 Image

bash 复制代码
docker buildx build --load -t dev-image:tag .

用 Compose 进入一次性开发环境

bash 复制代码
docker compose run --rm dev

理解这四个模板后,其他命令主要是在此基础上增加参数。

参考资料

相关推荐
无敌糖果1 小时前
K8S network namespace错误分析
docker·容器·kubernetes
skywalk81631 小时前
通过下载Ubuntu ova文件在Virtual Box快速安装ubuntu
linux·运维·ubuntu·virtualbox
姚不倒1 小时前
HAProxy 系列(四):多中间件统一 VIP 入口 — 架构模式与最佳实践
运维·中间件·架构·haproxy
happymade1 小时前
7000 台网络设备批量纳管 & 自动拓扑生成实战——MSRM3 完整操作流程与关键要点复盘
运维·服务器·网络·zabbix·grafana·msrm3
郝开1 小时前
Docker Compose 模块化多环境配置规范指南:示例搭建Kibana 9.4.2
docker·容器·kibana
做萤石二次开发的哈哈1 小时前
萤石蓝海 AIoT 一站式工作台:海康LCD会议平板接入,多端大屏运维应用一站生成
运维·物联网·电脑·萤石开放平台·会议室管理·蓝海aiot一站式工作台·otap物模型
运维老郭2 小时前
Prometheus 监控 K8s 从入门到入坑:工作原理 + 部署实操 + 避坑指南
云原生·容器·kubernetes
Shadow(⊙o⊙)2 小时前
Linux网络——文件与网络的连接桥梁struct sock {
linux·运维·网络
其实防守也摸鱼2 小时前
教育信息技术应用创新---基础软件信息赛(题库)
大数据·运维·人工智能·web安全·自动化