🧙♂️ 第一节:为什么需要魔法军团?
想象一下:你的魔法网页应用(Node.js)需要:
-
🐼 数据库(PostgreSQL)- 记帐的熊猫掌柜
-
📨 消息队列(Redis)- 传信的猫头鹰
-
🌐 反向代理(Nginx)- 守门的石像鬼
手动一个个启动?太麻烦了!docker-compose就是你的魔法军团统帅!
version: '3.8'
services:
# 第一个兵团:网页魔法服务器
网页魔法屋:
build: . # 使用当前目录的Dockerfile
ports:
- "3000:3000" # 开通魔法通道
depends_on:
- 熊猫数据库 # 需要数据库先启动
# 第二个兵团:数据库
熊猫数据库:
image: postgres:15 # 直接使用现成镜像
environment:
POSTGRES_PASSWORD: 魔法密码123 # 设置魔法密码
# 第三个兵团:传信猫头鹰
猫头鹰信箱:
image: redis:7-alpine # 轻量版Redis
ports:
- "6379:6379"
📜 第二节:编写军团调遣书(docker-compose.yml)
🐼 实战一:Go语言魔法军团
我们要组建一个:Go API服务器 + Redis缓存的军团!
1. Go程序(main.go):
go
package main
import (
"fmt"
"net/http"
"github.com/redis/go-redis/v9"
)
func main() {
// 连接Redis(会自动连接到"猫头鹰信箱"服务)
rdb := redis.NewClient(&redis.Options{
Addr: "猫头鹰信箱:6379", // 注意:直接用服务名!
})
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
count, _ := rdb.Incr(r.Context(), "访问次数").Result()
fmt.Fprintf(w, "🐼你是第%d位访客!", count)
})
http.ListenAndServe(":8080", nil)
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
count, _ := rdb.Incr(r.Context(), "访问次数").Result()
fmt.Fprintf(w, "🐼你是第%d位访客!", count)
})
http.ListenAndServe(":8080", nil)
}
2. Dockerfile:
dockerfile
FROM golang:1.19-alpine AS 建造师
WORKDIR /app
COPY go.mod go.sum .
RUN go mod download
COPY . .
RUN go build -ldflags="-s -w" -o 熊猫计数器
FROM alpine:latest
COPY --from=建造师 /app/熊猫计数器 .
CMD ["./熊猫计数器"]
3. docker-compose.yml:
version: '3.8'
services:
熊猫计数器:
build: .
ports:
- "8080:8080"
depends_on:
- 猫头鹰信箱
猫头鹰信箱:
image: redis:7-alpine
# Redis不需要暴露端口给外界,只需要内部访问
4. 启动整个军团!
# 一键启动所有服务!
访问 http://localhost:8080 看看计数效果!🎉
🌐 实战二:Node.js魔法变色军团
现在来组建一个更酷的:Node网页 + 数据库 + 后台任务的军团!
1. Node.js应用(server.js):
const express = require('express');
const app = express();
// 魔法:连接数据库(会自动解析"熊猫数据库"主机名)
app.get('/', async (req, res) => {
const visitCount = await recordVisit(); // 记录访问
const color = getRandomColor(); // 随机颜色
res.send(`你的魔法袍变成了${color}!这是第${visitCount}次变身!`);
});
app.listen(3000, () => console.log('魔法军团启动!'));
2. docker-compose.yml:
version: '3.8'
services:
魔法变色袍:
build: .
ports:
- "3000:3000"
environment:
DATABASE_URL: "postgresql://熊猫数据库:5432"
depends_on:
- 熊猫数据库
- 猫头鹰信箱
熊猫数据库:
image: postgres:15
environment:
POSTGRES_PASSWORD: 魔法密码123
volumes:
- 数据库数据:/var/lib/postgresql/data # 持久化存储!
猫头鹰信箱:
image: redis:7-alpine
后台任务员: # 第四个服务!
build: .
command: ["node", "worker.js"] # 专门运行后台任务
depends_on:
- 熊猫数据库
volumes:
数据库数据: # 声明持久化存储卷
🎯 第三章:军团指挥咒语(常用命令)
# 启动整个军团(前台运行)
docker-compose up
# 后台启动军团
docker-compose up -d
# 查看军团状态
docker-compose ps
# 停止军团
docker-compose down
# 只重建某个服务(比如修改了代码)
docker-compose build 网页魔法屋
docker-compose up --no-deps 网页魔法屋 # 只重启这个服务
💡 魔法军团的优势:
-
一键启停:不用手动启动每个容器
-
服务发现:直接用服务名互相访问(比如
熊猫数据库
) -
网络隔离:军团有自己的内部网络,更安全
-
依赖管理:自动处理启动顺序
🎩 终极魔法:扩展军团!
想要3个Node.js实例做负载均衡?只需:
yaml
魔法变色袍:
build: .
ports:
- "3000-3002:3000"
# 开放多个端口
deploy:
replicas: 3
# 启动3个实例!
(魔法帽喷出彩虹)🌈现在你就是魔法军团统帅了!试着创建你自己的军团吧!
记住:docker-compose让微服务变得像搭积木一样简单! 去组建你的数字魔法王国吧!✨