第3课 如何用docker-compose编排Docker整个魔法军团

第3课 如何用docker-compose编排Docker整个魔法军团

🧙♂️ 第一节:为什么需要魔法军团?

想象一下:你的魔法网页应用(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. 启动整个军团!

bash
 
docker-compose up  
# 一键启动所有服务!

访问 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 网页魔法屋  # 只重启这个服务

💡 魔法军团的优势:

  1. 一键启停:不用手动启动每个容器

  2. 服务发现:直接用服务名互相访问(比如熊猫数据库

  3. 网络隔离:军团有自己的内部网络,更安全

  4. 依赖管理:自动处理启动顺序


🎩 终极魔法:扩展军团!

想要3个Node.js实例做负载均衡?只需:

yaml

魔法变色袍:
  build: .
  ports:
    - "3000-3002:3000"  
# 开放多个端口

  deploy:
    replicas: 3  
# 启动3个实例!

(魔法帽喷出彩虹)🌈现在你就是魔法军团统帅了!试着创建你自己的军团吧!

记住:docker-compose让微服务变得像搭积木一样简单! 去组建你的数字魔法王国吧!✨

给TA打赏
共{{data.count}}人
人已打赏
Docker

第2课 Dockerfile 镜像的制作

2025-8-24 14:42:59

Docker

第4课 Docker Swarm--终极军团魔法

2025-8-27 18:56:28

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索