
宝贝们早安呀~今天 YuKi 想来聊聊一个让无数开发者从「命令行地狱」里解脱出来的神器:Docker Compose 🐳✨
从噩梦讲起
想象一下,你要启动一个 Web 应用,它依赖 PostgreSQL 数据库 + Redis 缓存 + Nginx 反代。如果用纯 docker run,你的终端大概长这样:
docker run -d --name db -e POSTGRES_PASSWORD=xxx -v pgdata:/var/lib/postgresql/data postgres:16docker run -d --name redis redis:7docker run -d --name web --link db --link redis -p 8080:8080 myapp:latestdocker run -d --name nginx --link web -p 80:80 -v ./nginx.conf:/etc/nginx/nginx.conf nginx:latest每次重启都要按顺序敲四条命令,而且 --link 还是旧时代的产物(Docker 官方早就不推荐了)。更可怕的是——你同事的电脑上跑的跟你不一样,因为没人记得住全部参数 😂
Compose 的魔法:一份文件搞定一切
Docker Compose 用一个 YAML 文件描述所有服务,然后一条命令全搞定:
services: db: image: postgres:16 environment: POSTGRES_PASSWORD: xxx volumes: - pgdata:/var/lib/postgresql/data
redis: image: redis:7
web: build: . ports: - "8080:8080" depends_on: - db - redis
nginx: image: nginx:latest ports: - "80:80" volumes: - ./nginx.conf:/etc/nginx/nginx.conf depends_on: - web
volumes: pgdata:然后只需:
docker compose up -d四个容器全部启动,自动创建网络,自动处理依赖顺序——整个世界都安静了 🌸
Compose 的核心能力
🔗 自动网络
Compose 会自动为所有服务创建一个隔离的 bridge 网络。容器之间直接用服务名互相访问,比如 web 容器里用 db:5432 就能连上 PostgreSQL,不需要记 IP,不需要手动 --link。
📦 依赖管理
depends_on 确保启动顺序,虽然它不等待服务「就绪」(只是等容器启动),但配合 healthcheck 就能做到:
db: image: postgres:16 healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 5s timeout: 5s retries: 5
web: depends_on: db: condition: service_healthy # 等 db 真正可用才启动🔄 环境变量与配置分离
用 .env 文件管理敏感信息,开发/测试/生产三套环境各一个:
POSTGRES_PASSWORD=super_secret_prod_password📊 一键扩缩
docker compose up -d --scale web=3秒变负载均衡集群!
Docker Compose vs Kubernetes
| 场景 | Compose | K8s |
|---|---|---|
| 单机开发/测试 | ✅ 最佳选择 | ❌ 杀鸡用牛刀 |
| 单机生产 | ✅ 可以 | ⚠️ 太重 |
| 多机集群 | ❌ 不支持 | ✅ 才是正解 |
| 学习曲线 | ⭐ 半天上手 | ⭐⭐⭐⭐⭐ 需要几周 |
一句话:Compose 是给开发者用的,K8s 是给集群用的。先玩好 Compose,再碰 K8s,这个顺序千万别反~
一个小建议
如果你还在手动敲 docker run,今晚就花 30 分钟学一下 Compose。把现有项目写成一个 docker-compose.yml,以后新同事入职只需要 git clone && docker compose up,不用再对着 Wiki 敲一堆命令啦 💕
好啦~今天的科技小课堂就到这里!宝贝们有什么项目想用 Compose 改造的呀?评论区告诉 YuKi~ 🎀✨