更简单的一个搭建

version: '3.8'  # 明确指定compose版本,增强兼容性
services:
  # Web服务(前端/反向代理)
  web:
    container_name: web0
    image: openinggame/web:v1
    ports:
      - "83:80"  # 宿主机83端口映射容器80端口
    environment:
      - API_HOST=192.168.2.21  # 移除错误的<>符号
    networks:
      - game
    depends_on:
      - server
    restart: unless-stopped  # 增加重启策略,提高可用性

  # 后端服务(业务逻辑)
  server:
    container_name: server0
    image: openinggame/server:v1
    ports:
      - "81:81"
    networks:
      - game
    depends_on:
      - etcd
      - kafka
      - redis1
      - mysql
      - mongodb
    restart: unless-stopped  # 增加重启策略

  # MySQL数据库
  mysql:
    container_name: mysql0
    image: mysql:8.0.23
    command:
      - --default-authentication-plugin=mysql_native_password  # 兼容旧客户端认证
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_general_ci
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: root  # 建议通过.env文件管理敏感密码
      MYSQL_DATABASE: game_db    # 提前创建业务库,避免手动初始化
    volumes:
      - /data/mysql:/var/lib/mysql  # 数据持久化
      - mysqlconf:/etc/mysql/conf.d  # 配置文件挂载
    networks:
      - game
    # 健康检查:确保MySQL就绪后再启动依赖服务
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-proot"]
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 30s

  # Redis节点0(缓存)
  redis0:
    container_name: redis0
    image: redis:latest
    volumes:
      - redisdata0:/data
    # 修复空格缺失问题,增加持久化配置(AOF)
    command: redis-server --requirepass 123456 --appendonly yes
    networks:
      - game
    depends_on:
      - etcd
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "redis-cli", "-a", "123456", "ping"]
      interval: 10s
      timeout: 5s
      retries: 3

  # Redis节点1(缓存)
  redis1:
    container_name: redis1
    image: redis:latest
    volumes:
      - redisdata1:/data
    command: redis-server --requirepass 123456 --appendonly yes
    networks:
      - game
    depends_on:
      - etcd
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "redis-cli", "-a", "123456", "ping"]
      interval: 10s
      timeout: 5s
      retries: 3

  # Redis节点2(缓存)
  redis2:
    container_name: redis2
    image: redis:latest
    volumes:
      - redisdata2:/data
    command: redis-server --requirepass 123456 --appendonly yes
    networks:
      - game
    depends_on:
      - mysql
      - etcd
      - redis1
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "redis-cli", "-a", "123456", "ping"]
      interval: 10s
      timeout: 5s
      retries: 3

  # Zookeeper(Kafka依赖)
  zookeeper:
    container_name: zookeeper
    image: wurstmeister/zookeeper
    restart: always
    networks:
      - game
    healthcheck:
      test: ["CMD", "zkServer.sh", "status"]
      interval: 10s
      timeout: 5s
      retries: 3

  # Kafka(消息队列)
  kafka:
    container_name: kafka0
    image: wurstmeister/kafka:2.12-2.3.0
    environment:
      KAFKA_BROKER_ID: 0
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka0:9092
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"  # 禁用自动创建主题,提高可控性
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock  # 用于动态发现(生产环境建议移除,降低安全风险)
      - kafka_data:/kafka  # 增加Kafka数据持久化
    restart: always
    depends_on:
      zookeeper:
        condition: service_healthy  # 仅当Zookeeper健康时启动Kafka
    networks:
      - game

  # Etcd(分布式配置/服务发现)
  etcd:
    image: quay.io/coreos/etcd:v3.2.32
    container_name: etcd0
    environment:
      ETCDCTL_API: 3
    command:
      - etcd
      - --name=etcd0  # 修复多余的横杠问题
      - --data-dir=/data/etcd-data  # 数据目录
      - --advertise-client-urls=http://etcd0:2379
      - --listen-client-urls=http://0.0.0.0:2379
    restart: always
    volumes:
      - etcd0_data:/data/etcd-data  # 修复路径不一致问题(原挂载到/etcd-data,与data-dir不符)
    networks:
      - game
    healthcheck:
      test: ["CMD", "etcdctl", "endpoint", "health"]
      interval: 10s
      timeout: 5s
      retries: 3

  # MongoDB(文档数据库)
  mongodb:
    container_name: mongodb0
    image: mongo:4.4.4
    restart: always
    volumes:
      - /data/mongo_data:/data/db  # 数据持久化
      - mongodb_logs:/data/logs
      # 挂载初始化脚本(创建管理员用户,解决--auth后无法连接的问题)
      - ./mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro
    command: --auth
    networks:
      - game
    depends_on:
      etcd:
        condition: service_healthy
    healthcheck:
      test: ["CMD", "mongo", "-u", "root", "-p", "mongo123", "--eval", "db.adminCommand('ping')"]
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 30s

volumes:
  mysqlconf:          # MySQL配置卷
  mongodb_logs:       # MongoDB日志卷
  etcd0_data:         # Etcd数据卷
  redisdata0:         # Redis0数据卷
  redisdata1:         # Redis1数据卷
  redisdata2:         # Redis2数据卷
  kafka_data:         # 新增Kafka数据卷

networks:
  game:
    external: true  # 使用外部已创建的game网络(需提前执行:docker network create game)
更简单的一个搭建
https://www.ifmo.cn/index.php/archives/134.html
本文作者 辣条
发布时间 2025-12-14
许可协议 CC BY-NC-SA 4.0
发表新评论