# Docker Compose 配置文件版本,3.8 是较新的稳定版本,支持更多特性
version: '3.8'

# 定义自定义网络,所有服务加入此网络,实现容器间通信(无需暴露端口到主机)
networks:
  wcb_network:
    driver: bridge  # 使用桥接网络(默认网络模式,适合单机容器通信)

services:

# MySQL 5.7 数据库服务(默认账户:root,密码:root)
  wcb_mysql:
    image: mysql:5.7  # 使用 MySQL 5.7 镜像(版本固定,避免兼容性问题)
    container_name: wcb_mysql  # 容器名称,方便管理和访问
    restart: always  # 容器退出时自动重启(故障恢复)
    ports:
      - "3306:3306"  # 端口映射(主机端口:容器端口),外部可通过 3306 访问MySQL
    environment:  # 环境变量配置
      - MYSQL_ROOT_PASSWORD=root  # 根用户密码(生产环境需修改为强密码)
      # - MYSQL_DATABASE=nacos_config2.0.2  # 容器启动时自动创建的数据库(供Nacos使用)
      #- TZ=Asia/Shanghai # 设置容器时区 我这里通过下面挂载方式同步的宿主机时区和时间了,这里忽略
      # 可选:创建自定义用户(如 - MYSQL_USER=nacos; - MYSQL_PASSWORD=nacos)
    volumes:  # 数据持久化和初始化配置
      # - ./container_config/mysql/init:/docker-entrypoint-initdb.d      # 挂载初始化脚本目录(.sql/.sh文件),容器启动时自动执行(如建表语句)
      - ./container_data/mysql/log:/var/log/mysql # 映射日志目录,宿主机:容器
      - ./container_data/mysql/data:/var/lib/mysql # 映射数据目录,宿主机:容器
      - ./container_config/mysql/conf.d:/etc/mysql/conf.d # 映射配置目录,宿主机:容器
      - /etc/localtime:/etc/localtime:ro # 让容器的时钟与宿主机时钟同步,避免时间的问题,ro是read only的意思,就是只读。
    networks:
      - wcb_network  # 加入自定义网络,与其他服务通信
    healthcheck: # 健康检查 Docker 相当于在容器内执行下面的语句,可以直接docker ps查看状态STATUS  Up 1 second (health)
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p$$MYSQL_ROOT_PASSWORD"]
      interval: 10s # 每 10 秒检查一次
      timeout: 5s # 超过 5 秒没响应,就认为本次检查失败。
      retries: 5 # 连续失败 5 次,才标记为不健康 避免刚启动时临时连不上就误判。

# PostgreSQL 14 数据库服务(默认账户:postgres,密码:postgres)
  wcb_pg:
    image: postgres:14  # 使用 PostgreSQL 14 镜像(版本可按需修改为13/15等)
    container_name: wcb_pg  # 容器名称
    restart: always  # 自动重启
    environment:  # 环境变量
      # - POSTGRES_USER=postgres #  可选:自定义用户名(默认是 postgres)
      - POSTGRES_PASSWORD=postgres  # 密码(生产环境需修改)
      # 可选:初始化数据库名 - POSTGRES_DB=wcb_default_db
      # - TZ=Asia/Shanghai  # 时区设置(避免时间同步问题) 我这里通过下面挂载方式同步的宿主机时区和时间了,这里忽略
    volumes:  # 数据和配置挂载
      - ./container_data/pg/data:/var/lib/postgresql/data       # 数据持久化目录(PostgreSQL 数据文件存储路径)
      - ./container_config/pg/conf/postgresql.conf:/etc/postgresql/postgresql.conf   # 可选:挂载自定义配置文件(如需修改 PostgreSQL 配置)
      - /etc/localtime:/etc/localtime:ro # 让容器的时钟与宿主机时钟同步,避免时间的问题,ro是read only的意思,就是只读。
    ports:
      - "5432:5432"  # 端口映射,外部通过 5432 访问
    networks:
      - wcb_network  # 加入统一网络
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres -d postgres"]  # 健康检查
      interval: 10s   # 每10秒检查一次
      timeout: 5s     # 超时5秒算失败
      retries: 5      # 连续失败5次才标记不健康

# Redis 7.2 缓存服务(默认密码:123456,需在配置文件中设置)
  wcb_redis:
    image: redis:7.2  # Redis 7.2 镜像
    container_name: wcb_redis  # 容器名称
    restart: always      # docker启动时,自动启动该容器
    ports:
      - "6379:6379"  # 端口映射(Redis默认端口)
    environment:
      - TZ=Asia/Shanghai  # 时区设置
    volumes:  # 数据和配置挂载
      - ./container_data/redis/data:/data  # 持久化 Redis 数据(RDB/AOF文件)
      - ./container_config/redis/conf/redis.conf:/etc/redis/redis.conf       # 挂载自定义配置文件(如设置密码、持久化策略等)
      - /etc/localtime:/etc/localtime:ro # 让容器的时钟与宿主机时钟同步,避免时间的问题,ro是read only的意思,就是只读。
    command: redis-server /etc/redis/redis.conf  # 启动命令:使用自定义配置文件
    #command: redis-server --requirepass 123456 --appendonly yes --protected-mode no      # 启动命令:设置密码 + 开启AOF持久化 + 关闭保护模式
    networks:
      - wcb_network  # 加入统一网络
    healthcheck:
      test: ["CMD", "redis-cli", "-a", "123456", "ping"]  # 检查Redis健康状态 
      interval: 10s
      timeout: 5s
      retries: 5

# Nacos 2.0.2 服务注册与配置中心(账户:nacos;密码nacos)
  wcb_nacos:
    image: nacos/nacos-server:2.0.2  # 固定版本(避免自动更新导致兼容性问题)
    container_name: wcb_nacos  # 容器名称
    restart: always  # 自动重启
    ports:  # 端口映射(Nacos 2.x 需暴露多个端口)
      - "8848:8848"  #  HTTP 接口端口(控制台和客户端访问)
      - "9848:9848"  # 客户端 gRPC 通信端口(2.x 新增)
      - "9849:9849"  # 服务端 gRPC 通信端口(2.x 新增)
    depends_on:  # 依赖关系:等待 MySQL 健康后再启动
      wcb_mysql:
        condition: service_healthy  # 仅当 MySQL 健康检查通过后启动
    environment:  # 核心配置
      - MODE=standalone  # 单机模式(集群模式需修改为 cluster 并配置节点)
      - SPRING_DATASOURCE_PLATFORM=mysql  # 使用 MySQL 存储配置数据
      - MYSQL_SERVICE_HOST=wcb_mysql  # MySQL 服务名(容器内网络直接通过名称访问)
      - MYSQL_SERVICE_PORT=3306  # MySQL 端口
      - MYSQL_SERVICE_DB_NAME=nacos_config2.0.2  # 对应 MySQL 中自动创建的数据库
      - MYSQL_SERVICE_USER=root  # 数据库用户名
      - MYSQL_SERVICE_PASSWORD=root  # 数据库密码(与 MySQL 配置一致)
      - MYSQL_DATABASE_NUM=1  # 数据库数量(单机1个)
      - NACOS_AUTH_ENABLE=true  # 开启认证(默认用户名/密码:nacos/nacos)
    volumes:  # 数据持久化
      - ./container_config/nacos/conf:/home/nacos/conf       # 可选:挂载配置文件(如需自定义 Nacos 配置)
      - ./container_data/nacos/data:/home/nacos/data  # 数据持久化目录
      # - ./container_data/nacos/logs:/home/nacos/logs  # 日志目录
    networks:
      - wcb_network  # 加入统一网络


# Elasticsearch 8.11.0 搜索引擎
  wcb_es:
    image: elasticsearch:8.11.0  # 版本(7.x/8.x 均可,8.x 安全性增强)
    container_name: wcb_es  # 容器名称
    restart: always  # 自动重启
    environment:  # 核心配置
      - ES_JAVA_OPTS=-Xms1g -Xmx1g  # JVM 堆内存(最小=最大,避免动态调整)
      - discovery.type=single-node  # 单节点模式(无需集群发现)
      - cluster.name=docker-cluster  # 集群名称
      - node.name=es-node-1  # 节点名称
      - bootstrap.memory_lock=true  # 锁定内存(避免内存交换影响性能)
      # JVM GC 日志配置(适配 JDK 8+,避免权限和语法错误)
      - XX:+PrintGCDetails 
      - XX:+PrintGCDateStamps 
      - XX:+PrintGCTimeStamps 
      - XX:+UseGCLogFileRotation 
      - XX:NumberOfGCLogFiles=32 
      - XX:GCLogFileSize=64m 
      - Xloggc:logs/gc.log
      - xpack.security.enabled=false  # 关闭安全认证(测试环境用,生产环境需开启)
    ulimits:  # 系统资源限制
      memlock:
        soft: -1
        hard: -1  # 允许内存锁定(配合 bootstrap.memory_lock=true)
    volumes:  # 数据和日志挂载(注意权限!)
      # 数据持久化目录(ES 数据存储路径)
      - ./container_data/es/data:/usr/share/elasticsearch/data
      - ./container_data/es/config:/usr/share/elasticsearch/config       # 可选:挂载配置文件(如需自定义 ES 配置)
      # - ./container_data/es/logs:/usr/share/elasticsearch/logs  # 日志目录
    ports:
      - "9200:9200"  # HTTP API 端口(外部访问)
      - "9300:9300"  # 节点间通信端口(集群用)
    networks:
      - wcb_network  # 加入统一网络
    healthcheck:  # 健康检查(验证 ES 集群健康状态)
      test: ["CMD", "curl", "-f", "http://localhost:9200/_cluster/health"]  # 访问集群健康接口
      interval: 10s
      timeout: 5s
      retries: 5
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐