Docker的核心逻辑
Docker的核心逻辑
[Dockerfile] ——> 构建 ——> [镜像 Image] ——> 运行 ——> [容器 Container]
│
└─ [docker-compose.yml] 负责编排与管理
🔗 一、 关系总结表
| 角色 | 文件类型 | 谁使用它 | 作用 | 是否运行 |
|---|---|---|---|---|
| Dockerfile | .Dockerfile |
开发者 | 定义镜像怎么构建 | ❌ 不运行 |
| 镜像 (Image) | 二进制模板 | Docker | 容器的模板 | ❌ 不运行 |
| 容器 (Container) | 运行实例 | Docker | 运行应用的实际环境 | ✅ 运行 |
| docker-compose.yml | .yml |
运维/开发者 | 编排多个容器(网络、卷、端口) | ❌ 自身不运行,但控制运行 |
🧱 二、Dockerfile:镜像的“配方表”
💡 概念
Dockerfile 是一个文本文件,描述如何构建镜像。
它就像烹饪菜谱,告诉 Docker:
“请用什么底料,装哪些软件,执行哪些命令,最后产出一个镜像。”
🧰 举例
# 1. 基础镜像:以官方 Node 20 镜像为底
FROM node:20-alpine
# 2. 设置工作目录
WORKDIR /app
# 3. 复制项目代码到镜像中
COPY . .
# 4. 安装依赖
RUN npm install
# 5. 暴露端口(让外界可访问)
EXPOSE 3001
# 6. 启动命令(容器启动后执行的命令)
CMD ["npm", "start"]
👉 结果:构建完成后得到一个“镜像(Image)”。
🧭 三、 docker-compose.yml(YAML 文件):服务的“编排图”
💡 概念
docker-compose.yml 是一个容器编排文件。
它告诉 Docker:
“我要运行哪些容器、每个容器用哪个镜像、端口怎么映射、数据存哪、网络怎么连。”
🧰 举例(最小例子)
version: '3.8'
services:
web:
build: . # 使用当前目录的 Dockerfile 构建镜像
ports:
- "8080:3001" # 宿主机8080映射容器3001
volumes:
- ./data:/app/data # 数据挂载
environment:
- NODE_ENV=production
🧩 它可以做什么?
| 功能 | 示例 |
|---|---|
| 定义多个服务 | web、db、redis 等 |
| 自动构建镜像 | build: . |
| 端口映射 | 8080:80 |
| 数据卷挂载 | ./data:/app/data |
| 网络互通 | networks: |
| 环境变量 | environment: |
| 自动重启策略 | restart: |
| 健康检查 | healthcheck: |
👉 结果:运行 docker compose up -d 时,Docker 会:
- 列表项按 Dockerfile 构建镜像;
- 按 YML 启动容器;
- 创建网络、卷等资源。
🧊 四、容器(Container):镜像的“活体运行实例”
💡 概念
容器是镜像运行起来的实例。
如果说镜像是“系统快照”,那么容器就是“正在运行的操作系统进程”。
举个比喻:
| 类比 | 含义 |
|---|---|
| 📦 镜像 (Image) | 安卓 ROM |
| ▶️ 容器 (Container) | 运行中的手机系统 |
| 🧾 Dockerfile | ROM 烧录脚本 |
| 🗂️ docker-compose.yml | 启动多台手机的配置文件 |
🧰 容器特点
- 它本质上是一个独立运行的进程;
- 共享宿主机的内核,但有自己的文件系统、网络、进程空间;
- 启动快(秒级)、占用小;
- 删除容器不会删除镜像;
- 如果挂载了卷(volume),数据不会丢
🔍 容器操作
| 命令 | 作用 |
|---|---|
docker ps |
查看正在运行的容器 |
docker stop name |
停止容器 |
docker rm name |
删除容器 |
docker exec -it name /bin/sh |
进入容器内部 |
docker logs name |
查看容器日志 |
🎯 五、 一个完整生命周期示意
① 你写 Dockerfile
↓
② docker build -t myapp .
↓
③ 生成镜像 myapp:latest
↓
④ docker run -d -p 8080:80 myapp
↓
⑤ 运行出容器 myapp_container
↓
⑥ docker-compose.yml 可以一次性启动多个容器 + 配置网络/卷
总结
| 概念 | 一句话解释 |
|---|---|
| Dockerfile | “定义镜像长什么样” |
| 镜像 (Image) | “程序的模板快照” |
| 容器 (Container) | “镜像运行起来的进程实例” |
| docker-compose.yml | “告诉 Docker 要运行哪些容器、怎么连、怎么配” |