Docker Compose开发环境搭建:Docker安装MySQL8.4.7、Elasticsearch8.18.8、Redis8.4.0、安装SkyWalking10.3.0
本文介绍如何使用Docker Compose搭建包含MySQL 8.4.7、Elasticsearch 8.18.8、Redis 8.4.0和SkyWalking 10.3.0的开发环境。通过.env文件实现完全变量化配置,包括端口号、账号密码、环境标识(dev/test/prod)等。系统自动为容器名、服务名添加环境后缀,并统一管理挂载目录路径。Docker Compose文件通过变量引用.en
·
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
访问测试


更多推荐
所有评论(0)