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 要运行哪些容器、怎么连、怎么配”