Docker Compose开发环境搭建:Docker安装MySQL8.4.7,Docker安装Elasticsearch8.18.8,Docker安装Redis8.4.0,Docker安装SkyWalking10.3.0

Docker Compose 方式搭建

Docker Compose 完全变量化,包括:

  • 端口号、账号、密码、环境(dev/test/prod)
  • 容器名 / 服务名自动拼接环境后缀
  • 挂载目录统一变量

这样一份 Compose 文件,就能通过 修改 .env 文件 自动生成不同环境的服务,非常灵活。

.env

# =========================================================
# 环境名称
#
# 用途:
# - 作为环境维度标识(dev / test / prod)
# - 用于容器名、网络名、volume 路径等变量拼接
#
# 示例:
#   dev  -> 本地开发环境
#   test -> 测试环境
#   prod -> 生产环境
#
ENV=dev


# =========================================================
# Docker Compose 项目名称(Project Name)
#
# 这是 Docker Compose 资源命名与生命周期管理的“根标识”
#
# 作用范围(非常重要):
# - 容器(containers)
# - 网络(networks)
# - 数据卷(volumes)
#
# 资源实际命名规则:
#   <COMPOSE_PROJECT_NAME>_<资源名>
#
# 示例(当前配置):
#   COMPOSE_PROJECT_NAME=dev
#
# 实际生成资源示例(如挂载目录):
#   - dev_es_data
#   - dev_es_logs
#
# 推荐用法(多环境):
#   COMPOSE_PROJECT_NAME=infra-${ENV}
#   例如:
#     ENV=dev   -> infra-dev
#     ENV=test  -> infra-test
#     ENV=prod  -> infra-prod
#
# 注意事项(⚠ 必读):
# - 修改该值后,Docker Compose 会认为是“一个全新的项目”
# - 旧的容器 / 网络 / volume 不会自动复用
# - 一旦进入稳定使用阶段,不建议频繁修改
#
# 官方文档:
# https://docs.docker.com/compose/reference/envvars/#compose_project_name
#
COMPOSE_PROJECT_NAME=dev


# =========================================================
# Docker 网络配置
#
# NETWORK_NAME:
# - Compose 创建的 Docker 自定义网络名称
# - 使用 ENV 后缀,保证多环境网络隔离
#
# NETWORK_SUBNET:
# - 自定义 bridge 网络的子网
# - 用于固定容器 IP 范围,避免与宿主或其他网络冲突
#
NETWORK_NAME=network-${ENV}
NETWORK_SUBNET=172.168.20.0/24


# =========================================================
# 宿主机数据卷根目录(Bind Mount Root)
#
# 所有容器的宿主机挂载目录统一从此路径派生
#
# 示例:
#   MySQL 数据目录:
#     ${HOST_VOLUME}/${ENV}/MySQL8/data
#
# 强烈建议:
# - Windows 下优先使用已共享的磁盘
# - 所有目录需提前手动创建
#
HOST_VOLUME=B:/Docker/volume


# =========================================================
# MySQL 配置
#
# MYSQL_VERSION:
# - MySQL Docker 镜像版本
#
# MYSQL_ROOT_PASSWORD:
# - root 用户初始化密码
#
# MYSQL_PORT:
# - 映射到宿主机的端口
# - 外部客户端连接 MySQL 使用
#
MYSQL_VERSION=8.4.7
MYSQL_ROOT_PASSWORD=123456
MYSQL_PORT=23306


# =========================================================
# Elasticsearch 配置
#
# ES_VERSION:
# - Elasticsearch Docker 镜像版本
#
# ES_PASSWORD:
# - 内置 elastic 用户密码
# - SkyWalking OAP / 外部访问 ES 使用
#
# ES_PORT_HTTP:
# - Elasticsearch HTTP REST API 端口
#
# ES_PORT_TRANSPORT:
# - 节点间通信端口(单节点时一般不用)
#
ES_VERSION=8.18.8
ES_PASSWORD=Pass@1688
ES_PORT_HTTP=29200
ES_PORT_TRANSPORT=9300


# =========================================================
# Redis 配置
#
# REDIS_VERSION:
# - Redis Docker 镜像版本
#
# REDIS_PASSWORD:
# - Redis 访问密码
#
# REDIS_PORT:
# - 映射到宿主机的端口
#
REDIS_VERSION=8.4.0
REDIS_PASSWORD=Pass@1688
REDIS_PORT=26379


# =========================================================
# SkyWalking 配置
#
# SW_VERSION:
# - SkyWalking OAP / UI Docker 镜像版本
#
# SW_ES_USER / SW_ES_PASSWORD:
# - SkyWalking OAP 连接 Elasticsearch 使用的账号
#
# SW_OAP_PORT_GRPC:
# - OAP gRPC 服务端口(Agent 上报使用)
#
# SW_OAP_PORT_REST:
# - OAP REST API 端口
#
# SW_UI_PORT:
# - SkyWalking UI Web 访问端口
#
SW_VERSION=10.3.0
SW_ES_USER=elastic
SW_ES_PASSWORD=Pass@1688
SW_OAP_PORT_GRPC=11800
SW_OAP_PORT_REST=12800
SW_UI_PORT=18080

.env 文件是什么

  • .env 文件是一个 环境变量文件,它存放 键值对,格式如下:
    KEY=value
    ANOTHER_KEY=another_value
    
  • Docker Compose 会自动读取它(默认就是 docker-compose.yml 同目录的 .env 文件)
  • 变量在 Compose 文件里通过 ${KEY} 的方式引用

docker-compose.yml

# =========================================================
# 用于构建环境:MySQL、Elasticsearch、Redis、SkyWalking OAP/UI
# 宿主机挂载目录、端口、密码、版本号、环境后缀均通过 .env 文件管理
# =========================================================

###########################################################
# 网络配置
###########################################################
networks:
  env_network: # 内部网络标识固定
    driver: bridge
    name: ${NETWORK_NAME}        # Docker 实际网络名动态生成
    ipam:
      config:
        - subnet: ${NETWORK_SUBNET}  # 子网从 .env 获取

###########################################################
# 卷(Volume)配置
###########################################################
volumes:
  # MySQL
  mysql_data:
    driver: local
    driver_opts:
      type: none
      device: ${HOST_VOLUME}/${ENV}/MySQL8/data
      o: bind
  mysql_conf:
    driver: local
    driver_opts:
      type: none
      device: ${HOST_VOLUME}/${ENV}/MySQL8/conf
      o: bind
  mysql_logs:
    driver: local
    driver_opts:
      type: none
      device: ${HOST_VOLUME}/${ENV}/MySQL8/logs
      o: bind

  # Elasticsearch
  es_data:
    driver: local
    driver_opts:
      type: none
      device: ${HOST_VOLUME}/${ENV}/ElasticSearch8/data
      o: bind
  es_logs:
    driver: local
    driver_opts:
      type: none
      device: ${HOST_VOLUME}/${ENV}/ElasticSearch8/logs
      o: bind

  # Redis
  redis_data:
    driver: local
    driver_opts:
      type: none
      device: ${HOST_VOLUME}/${ENV}/Redis/data
      o: bind

###########################################################
# 服务定义
###########################################################
services:
  # MySQL
  mysql:
    image: mysql:${MYSQL_VERSION}
    container_name: mysql_${MYSQL_VERSION}_${ENV}   # 容器名体现版本和环境
    networks:
      - env_network   # 内部网络引用固定标识
    ports:
      - "${MYSQL_PORT}:3306"
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
    volumes:
      - mysql_data:/var/lib/mysql
      - mysql_conf:/etc/mysql/conf.d
      - mysql_logs:/logs
    restart: unless-stopped
    labels:
      env: ${ENV}
      version: ${MYSQL_VERSION}
      service: mysql_${ENV}

  # Elasticsearch
  elasticsearch:
    image: elasticsearch:${ES_VERSION}
    container_name: elasticsearch_${ES_VERSION}_${ENV}
    networks:
      - env_network
    ports:
      - "${ES_PORT_HTTP}:9200"
      - "${ES_PORT_TRANSPORT}:9300"
    environment:
      discovery.type: single-node
      ELASTIC_PASSWORD: ${ES_PASSWORD}
      xpack.security.enabled: "true"
      # 防止再被 flood-stage 锁死
      cluster.routing.allocation.disk.watermark.low: "90%"
      cluster.routing.allocation.disk.watermark.high: "95%"
      cluster.routing.allocation.disk.watermark.flood_stage: "97%"
    volumes:
      - es_data:/usr/share/elasticsearch/data
      - es_logs:/usr/share/elasticsearch/logs
    healthcheck:
      test:
        [
          "CMD-SHELL",
          "curl -sf -u elastic:${ES_PASSWORD} http://localhost:9200 >/dev/null || exit 1"
        ]
      # 两次健康检查之间的间隔
      interval: 10s
      # 单次健康检查的最大执行时间
      timeout: 5s
      # 允许连续失败多少次
      retries: 30
      # 启动宽限期,在这段时间内,健康检查失败不会被算作失败,成功直接 healthy
      start_period: 300s
    restart: unless-stopped
    labels:
      env: ${ENV}
      version: ${ES_VERSION}
      service: elasticsearch_${ENV}

  # Redis
  redis:
    image: redis:${REDIS_VERSION}
    container_name: redis_${REDIS_VERSION}_${ENV}
    networks:
      - env_network
    ports:
      - "${REDIS_PORT}:6379"
    environment:
      REDIS_PASSWORD: ${REDIS_PASSWORD}
    command: redis-server --requirepass "${REDIS_PASSWORD}"
    volumes:
      - redis_data:/data
    restart: unless-stopped
    labels:
      env: ${ENV}
      version: ${REDIS_VERSION}
      service: redis_${ENV}

  # SkyWalking OAP
  skywalking-oap:
    image: apache/skywalking-oap-server:${SW_VERSION}
    container_name: skywalking-oap_${SW_VERSION}_${ENV}
    networks:
      - env_network
    depends_on:
      elasticsearch:
        condition: service_healthy
    ports:
      - "${SW_OAP_PORT_GRPC}:11800"
      - "${SW_OAP_PORT_REST}:12800"
    environment:
      SW_STORAGE: elasticsearch
      SW_STORAGE_ES_HTTP_PROTOCOL: http
      # 内部访问 ES 使用服务名,不用 container_name
      SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200
      SW_ES_USER: elastic
      SW_ES_PASSWORD: ${SW_ES_PASSWORD}
      SW_CORE_RECORD_DATA_TTL: 7
      SW_CORE_METRICS_DATA_TTL: 15
      SW_CORE_LOG_DATA_TTL: 7
      SW_STORAGE_FLUSH_INTERVAL: 10
    restart: unless-stopped
    labels:
      env: ${ENV}
      version: ${SW_VERSION}
      service: skywalking-oap_${ENV}

  # SkyWalking UI
  skywalking-ui:
    image: apache/skywalking-ui:${SW_VERSION}
    container_name: skywalking-ui_${SW_VERSION}_${ENV}
    networks:
      - env_network
    depends_on:
      skywalking-oap:
        condition: service_started
    ports:
      - "${SW_UI_PORT}:8080"
    environment:
      SW_OAP_ADDRESS: http://skywalking-oap:12800
    restart: unless-stopped
    labels:
      env: ${ENV}
      version: ${SW_VERSION}
      service: skywalking-ui_${ENV}

如何运行

docker-compose.yml 所在目录执行:

docker compose up -d
  • -d 表示 后台运行
  • Compose 会:
    • 自动读取 .env 文件里的变量
    • 根据 docker-compose.yml 配置创建网络、卷和容器
    • 容器名、端口、挂载目录都会根据 .env 替换

运行结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Elasticsearch 分词器安装

进入容器安装插件(避免重启重复安装):

docker exec -it elasticsearch_8.18.8_dev bash

执行安装 IK分词器 命令

elasticsearch-plugin install --batch https://release.infinilabs.com/analysis-ik/stable/elasticsearch-analysis-ik-8.18.8.zip

访问测试

在这里插入图片描述

在这里插入图片描述

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐