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)