Dockerfile
文本配方。指定基础环境、复制什么、执行什么,以及容器默认运行哪条命令。
不要先把 Container 想成“小电脑”。抓住一条主线:Docker 把程序文件和启动方式做成 Image,再把 Image 启动成受隔离的 Linux 进程。
点击步骤或自动播放。build 只负责制作 Image;create/start 才把 Image 变成 Container。
Dockerfile 只是一份配方,描述基础环境、复制哪些文件,以及以后如何启动程序。
app.jar
config/FROM java:21
COPY app.jar执行指令 · 复用缓存maple-api:1.0writable layer + isolationdb:5432/var/lib/postgresql/data ls app.jar Dockerfile
找到程序文件和构建配方。此时还没有 Image,也没有 Container。
用“菜谱 → 预制餐包 → 正在营业的餐车”区分制作模板和启动实例。
文本配方。指定基础环境、复制什么、执行什么,以及容器默认运行哪条命令。
构建完成的只读模板。由文件层和启动元数据组成,可以打标签、推送、复用。
Image 的运行实例。拥有可写层、进程视图和网络;主进程退出,Container 就停止。
点击 Dockerfile 每一行。上游没变化时,下次 build 可以直接复用只读层缓存。
示例后端镜像:Java 环境 + 工作目录 + 业务 JAR + 启动命令。
namespaces 隔离“看见什么”,cgroups 约束“能用多少”;容器通常不启动独立内核。
亲手删一次容器,再试一次 localhost,两个最常见误区会立即变得直观。
写入数据后删除并重建:可写层消失,Named Volume 留存。
Maple Shop 的 Compose 网络提供服务名 DNS;容器里的 localhost 指向它自己。
Maple Shop 需要构建 web、api、worker 三个自有 Image,并复用 PostgreSQL 与对象存储的现成 Image,最后启动 5 个 Container。
判断命令是在“制作模板”还是“管理实例”,Docker 命令体系就不会乱。
docker build -t demo:1.0 .Dockerfile → Image:构建并打标签。docker pull postgres:16Registry → 本地:下载现成 Image。docker create demo:1.0Image → 停止状态的 Container。docker run demo:1.0create + start;缺 Image 时会 pull,但不会读取 Dockerfile build。docker compose up --build构建自有 Images,再创建或重建并启动整套 Containers。docker compose down删除 Compose Containers 与网络;默认保留 Named Volumes。平时只操作 Docker CLI;下面是它通向 Linux 内核的内部链路。
读取命令与 compose.yml,通过 API 请求 Docker Engine。
docker compose up管理 Images、Containers、Networks、Volumes;BuildKit 负责构建与缓存。
dockerd + buildkit准备 root filesystem 和运行配置,最终创建容器主进程。
OCI image + runtime提供 namespaces、cgroups、网络和联合文件系统,执行隔离后的进程。
PID 1 starts here