找回密码
 立即注册

QQ登录

只需一步,快速开始

peUfSYR.png
查看: 235|回复: 0

Day 15 Docker Compose入门:一个命令启动全栈应用

[复制链接]

1736

主题

14

回帖

5640

积分

管理员

积分
5640
发表于 2026-3-29 16:17:11 | 显示全部楼层 |阅读模式
Docker 30天实战系列 · Day 15

你有没有经历过这样的场景:项目需要同时运行数据库、缓存、后端 API、前端应用,每次启动要敲五六条
  1. docker run
复制代码
命令,参数一长串,漏一个端口映射整个系统就跑不通?

Docker Compose 就是来终结这种痛苦的。一个 YAML 文件定义所有服务,一条命令全部拉起。

什么是 Docker Compose

Docker Compose 是 Docker 官方提供的多容器编排工具。它的核心思想很简单:用一个
  1. docker-compose.yml
复制代码
文件,声明式地描述应用所需的所有服务、网络和存储卷,然后通过
  1. docker compose up
复制代码
一键启动整个应用栈。

你可以把它理解为一份"应用部署说明书"。以前这份说明书在你脑子里,现在它变成了一个可版本控制、可复现、可分享的文件。

核心原理

Docker Compose 的工作流程分三步:

第一步:解析。 Compose 读取
  1. docker-compose.yml
复制代码
,解析出每个服务的镜像、端口、环境变量、依赖关系等配置。

第二步:构建基础设施。 自动创建一个专属的 bridge 网络(默认以项目目录名为前缀),所有服务加入同一网络。同时创建声明的数据卷。

第三步:按依赖顺序启动容器。 根据
  1. depends_on
复制代码
声明的依赖关系,决定启动顺序。每个服务名自动注册为 DNS 名称——在容器内部,你可以直接用服务名当主机名访问其他服务。

这意味着:你再也不需要手动查容器 IP,也不需要
  1. --link
复制代码
做容器互联。Compose 内置的 DNS 解析帮你搞定一切。

YAML 配置详解

一个标准的
  1. docker-compose.yml
复制代码
长这样:
  1. version: "3.8"
  2. services:
  3.   # 后端 API 服务
  4.   backend:
  5.     build: ./backend          # 从 Dockerfile 构建
  6.     ports:
  7.       - "8080:8080"           # 宿主机端口:容器端口
  8.     environment:
  9.       - DB_HOST=db            # 直接用服务名作为主机名
  10.       - DB_PORT=5432
  11.       - REDIS_HOST=cache
  12.     depends_on:
  13.       - db
  14.       - cache
  15.     restart: unless-stopped
  16.   # 前端服务
  17.   frontend:
  18.     build: ./frontend
  19.     ports:
  20.       - "3000:3000"
  21.     depends_on:
  22.       - backend
  23.   # PostgreSQL 数据库
  24.   db:
  25.     image: postgres:16-alpine
  26.     environment:
  27.       POSTGRES_DB: myapp
  28.       POSTGRES_USER: admin
  29.       POSTGRES_PASSWORD: secret123
  30.     volumes:
  31.       - db_data:/var/lib/postgresql/data  # 持久化存储
  32.     ports:
  33.       - "5432:5432"
  34.   # Redis 缓存
  35.   cache:
  36.     image: redis:7-alpine
  37.     ports:
  38.       - "6379:6379"
  39. volumes:
  40.   db_data:                    # 声明命名卷
复制代码

几个关键配置项拆解说明:

| 配置项 | 作用 | 注意事项 |
|--------|------|----------|
|
  1. build
复制代码
| 指定 Dockerfile 路径并构建镜像 | 与
  1. image
复制代码
二选一,也可同时使用 |
|
  1. image
复制代码
| 直接拉取已有镜像 | 指定版本号,避免用
  1. latest
复制代码
|
|
  1. ports
复制代码
| 端口映射 | 格式为
  1. 宿主机:容器
复制代码
,注意端口冲突 |
|
  1. volumes
复制代码
| 数据持久化 | 命名卷需要在顶层
  1. volumes
复制代码
声明 |
|
  1. depends_on
复制代码
| 启动顺序控制 | 只保证启动顺序,不保证服务就绪 |
|
  1. environment
复制代码
| 环境变量注入 | 敏感信息建议使用
  1. .env
复制代码
文件 |
|
  1. restart
复制代码
| 重启策略 | 生产环境推荐
  1. unless-stopped
复制代码
|

常用命令速查

掌握以下 8 个命令,日常使用基本够了:
  1. # 启动所有服务(后台运行)
  2. docker compose up -d
  3. # 查看运行状态
  4. docker compose ps
  5. # 查看日志(实时跟踪)
  6. docker compose logs -f backend
  7. # 停止所有服务
  8. docker compose stop
  9. # 停止并删除容器、网络(保留数据卷)
  10. docker compose down
  11. # 停止并删除一切(包括数据卷)——慎用
  12. docker compose down -v
  13. # 重新构建镜像并启动
  14. docker compose up -d --build
  15. # 进入某个服务的容器
  16. docker compose exec backend sh
复制代码

实战案例:全栈博客系统

假设我们要搭建一个博客系统:React 前端 + Node.js API + MongoDB 数据库 + Nginx 反向代理。
  1. version: "3.8"
  2. services:
  3.   nginx:
  4.     image: nginx:alpine
  5.     ports:
  6.       - "80:80"
  7.     volumes:
  8.       - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
  9.     depends_on:
  10.       - frontend
  11.       - api
  12.   frontend:
  13.     build: ./frontend
  14.     expose:
  15.       - "3000"               # 只在内部网络暴露,不映射到宿主机
  16.   api:
  17.     build: ./api
  18.     expose:
  19.       - "4000"
  20.     environment:
  21.       - MONGO_URI=mongodb://mongo:27017/blog
  22.     depends_on:
  23.       - mongo
  24.   mongo:
  25.     image: mongo:7
  26.     volumes:
  27.       - mongo_data:/data/db
  28.     # 不映射端口到宿主机,只允许内部访问——更安全
  29. volumes:
  30.   mongo_data:
复制代码

这个配置有三个设计要点值得注意:

第一,Nginx 统一入口。 所有外部流量只通过 80 端口进入,由 Nginx 分发到前端或 API,减少暴露面。

第二,
  1. expose
复制代码
代替
  1. ports
复制代码
。
前端和 API 使用
  1. expose
复制代码
仅在 Compose 内部网络可达,外部无法直接访问。

第三,数据库不暴露端口。 MongoDB 没有映射到宿主机,只有同网络的 API 服务能连接,安全性大幅提升。

环境变量管理

硬编码密码在 YAML 里是大忌。推荐使用
  1. .env
复制代码
文件:
  1. # .env(必须加入 .gitignore)
  2. POSTGRES_PASSWORD=my_secure_password
  3. API_SECRET_KEY=a1b2c3d4e5
复制代码
  1. # docker-compose.yml 中引用
  2. services:
  3.   db:
  4.     image: postgres:16-alpine
  5.     environment:
  6.       POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
复制代码

Compose 会自动读取同目录下的
  1. .env
复制代码
文件,将变量注入配置中。

常见问题与排坑

Q1:
  1. depends_on
复制代码
设置了,但后端连不上数据库?

  1. depends_on
复制代码
只保证容器启动顺序,不保证服务就绪。PostgreSQL 容器启动后还需要几秒初始化。解决方案有两种:在应用代码中加入重连机制(推荐),或使用
  1. healthcheck
复制代码
配合
  1. depends_on.condition
复制代码
:
  1. services:
  2.   db:
  3.     image: postgres:16-alpine
  4.     healthcheck:
  5.       test: ["CMD-SHELL", "pg_isready -U admin"]
  6.       interval: 5s
  7.       timeout: 3s
  8.       retries: 5
  9.   backend:
  10.     depends_on:
  11.       db:
  12.         condition: service_healthy
复制代码

Q2:修改了代码,
  1. docker compose up -d
复制代码
没生效?


Compose 会复用已有镜像。代码变更后需要重新构建:
  1. docker compose up -d --build
复制代码
。

Q3:数据怎么没了?

如果你用了
  1. docker compose down -v
复制代码
,数据卷会被一起删除。日常停止服务用
  1. docker compose stop
复制代码
或
  1. docker compose down
复制代码
(不带
  1. -v
复制代码
)。

Q4:多个项目端口冲突怎么办?

两个项目都映射了
  1. 5432:5432
复制代码
就会冲突。解决方法:修改宿主机端口(如
  1. 5433:5432
复制代码
),或者不映射到宿主机——只要同一 Compose 网络内的服务能互相访问就够了。

Compose 与生产环境

Docker Compose 非常适合以下场景:本地开发、CI/CD 测试环境、个人或小团队的单机部署。

但它不适合大规模生产环境。原因很直接:Compose 只能管理单台主机上的容器,没有跨节点调度、自动扩缩容、滚动更新等能力。当你需要管理多台服务器上的容器集群时,应该考虑 Kubernetes 或 Docker Swarm。

一个务实的路径是:用 Compose 把开发环境跑通,验证架构可行性,再迁移到 K8s 做生产编排。 两者的 YAML 配置思路相通,迁移成本并不高。

小结

Docker Compose 的价值可以用一句话概括:把"一堆容器的启动方式"变成"一个可版本管理的配置文件"。

你需要记住的核心操作就三步:写好
  1. docker-compose.yml
复制代码
,执行
  1. docker compose up -d
复制代码
,然后专注于写业务代码。

明天 Day 16,我们聊 Docker 网络模型——理解了网络,你才能真正掌控容器之间的通信。

━━━━━━━━━━━━━━━━━━━━

如果这篇文章对你有帮助,欢迎点赞、在看、转发,这是我持续更新的最大动力。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码关注微信公众号

Archiver|手机版|小黑屋|风叶林

GMT+8, 2026-11-5 23:51 , Processed in 0.036658 second(s), 20 queries .

Powered by 风叶林

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表