云计算百科
云计算领域专业知识百科平台

wsl集成docker desktop环境下使用docker-compose一键部署mysql,nacos,redis,mq详细教程(服务器同理)


📚 微服务组件单机环境搭建教程(WSL+Docker Compose)


上篇我们已经搭建了wsl集成docker desktop环境,实际上是可以把wsl当作服务器来操作的,今天就教大家使用上篇搭建的环境集成docker-compose搭建一套简单的微服务单机教程,过一阵子时间充足再出一期企业级微服务分布式架构搭建。(有自己服务器的同学连接服务器操作是一样的步骤)

🌟 前置准备
  • 确保已按上篇教程完成 WSL 与 Docker Desktop 集成
  • 安装 FinalShell 客户端(官网下载)

  • 🔌 第一部分:SSH 连接 WSL 环境

    1.1 进入 WSL 终端

    # Windows 终端操作
    win+R → 输入 cmd → 回车
    wsl -d Ubuntu # 若未启动则用 wsl.exe -d Ubuntu
    ip a | grep eth0 # 查看 IPv4 地址(示例:172.27.123.45)

    1.2 配置 SSH 服务

    sudo apt update
    sudo apt install openssh-server -y
    sudo systemctl start ssh
    sudo systemctl enable ssh
    sudo systemctl status ssh # 确认状态为 running

    1.3 FinalShell 连接配置
    • 连接类型:SSH
    • 主机地址:172.27.123.45(替换为刚查到的 IPv4 地址)
    • 用户名:你的 WSL 用户名
    • 认证方式:密码(或密钥)

    🛠 第二部分:项目结构搭建

    2.1 创建目录结构

    cd /home/tomcat
    mkdir -p docker-compose-project/{mysql,nacos,redis,rocketmq/conf}

    2.2 编写 Docker Compose 文件

    cd docker-compose-project
    vi docker-compose.yml

    📄 docker-compose.yml 完整配置(点击展开)
    services:
    # MySQL 服务
    mysql:
    image: mysql:8.4
    container_name: mysql
    ports:
    "3306:3306"
    environment:
    MYSQL_ROOT_PASSWORD: root
    MYSQL_DATABASE: nacos_config
    volumes:
    ./mysql/data:/var/lib/mysql
    ./mysql/init.sql:/dockerentrypointinitdb.d/init.sql
    networks:
    app_network
    healthcheck:
    test:
    "CMD-SHELL"
    "mysqladmin ping -uroot -proot && mysql -uroot -proot -e 'USE nacos_config; SELECT 1 FROM config_info LIMIT 1;'"
    interval: 3s
    timeout: 5s
    retries: 20

    # Nacos 服务
    nacos:
    image: nacos/nacosserver:latest
    container_name: nacos
    ports:
    "8848:8848"
    environment:
    MODE: standalone
    SPRING_DATASOURCE_PLATFORM: mysql
    MYSQL_SERVICE_HOST: mysql
    MYSQL_SERVICE_PORT: 3306
    MYSQL_SERVICE_DB_NAME: nacos_config
    MYSQL_SERVICE_USER: root
    MYSQL_SERVICE_PASSWORD: root
    # 新增数据库连接参数
    MYSQL_SERVICE_DB_PARAM: "characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true"
    # 强制指定时区(必须)
    TZ: Asia/Shanghai
    depends_on:
    mysql:
    condition: service_healthy
    # 添加健康检查(关键)
    healthcheck:
    test: ["CMD", "curl", "-f", "http://localhost:8848/nacos/health"]
    interval: 10s
    timeout: 5s
    retries: 20
    command:
    /bin/sh
    c
    |
    # 增加循环检测逻辑
    while ! nc -z mysql 3306; do
    echo "等待 MySQL 服务就绪…"
    sleep 2
    done

    # 增加数据库连通性测试
    while ! mysql hmysql P3306 uroot proot e "USE nacos_config; SELECT 1;"; do
    echo "等待数据库初始化完成"
    sleep 5
    done

    echo " 启动 Nacos "
    bash /home/nacos/startup.sh m standalone
    networks:
    app_network

    # Redis 单机
    redis:
    image: redis:latest
    container_name: redisserver
    ports:
    "6379:6379"
    volumes:
    ./redis/data:/data
    command: redisserver appendonly yes
    networks:
    app_network

    # RocketMQ 消息队列
    rocketmq-namesrv:
    image: apache/rocketmq:5.1.4
    container_name: rocketmqnamesrv
    ports:
    "9876:9876"
    command: sh mqnamesrv n 0.0.0.0:9876
    networks:
    app_network

    rocketmq-broker:
    image: apache/rocketmq:5.1.4
    container_name: rocketmqbroker
    ports:
    "10909:10909"
    "10911:10911"
    environment:
    NAMESRV_ADDR: rocketmqnamesrv:9876
    command: # 统一使用列表格式
    sh
    c
    "/home/rocketmq/rocketmq-5.1.4/bin/mqbroker -n rocketmq-namesrv:9876 -c /home/rocketmq/conf/broker.conf"
    volumes:
    ./rocketmq/data:/home/rocketmq/store
    ./rocketmq/conf/broker.conf:/home/rocketmq/conf/broker.conf
    depends_on:
    rocketmqnamesrv
    networks:
    app_network

    # RocketMQ Dashboard 服务
    rocketmq-dashboard:
    image: apacherocketmq/rocketmqdashboard:latest
    container_name: rocketmqdashboard
    ports:
    "9886:8080"
    environment:
    NAMESRV_ADDR: rocketmqnamesrv:9876
    depends_on:
    rocketmqnamesrv
    rocketmqbroker
    networks:
    app_network

    networks:
    app_network:
    driver: bridge


    📦 第三部分:初始化配置

    3.1 创建 MySQL 初始化脚本

    cd mysql
    vi init.sql # 粘贴下方 SQL 内容(或从 Nacos GitHub 获取最新版本)

    — Nacos 官方完整 SQL 链接:
    — https://github.com/alibaba/nacos/blob/master/distribution/conf/mysql-schema.sql

    CREATE DATABASE IF NOT EXISTS nacos_config;
    USE nacos_config;
    — 在此处粘贴 Nacos 的 SQL 初始化脚本(来自 /*
    /******************************************/
    /* 表名称 = config_info */
    /******************************************/
    CREATE TABLE `config_info` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
    `data_id` varchar(255) NOT NULL COMMENT 'data_id',
    `group_id` varchar(128) DEFAULT NULL COMMENT 'group_id',
    `content` longtext NOT NULL COMMENT 'content',
    `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
    `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
    `src_user` text COMMENT 'source user',
    `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
    `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
    `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
    `c_desc` varchar(256) DEFAULT NULL COMMENT 'configuration description',
    `c_use` varchar(64) DEFAULT NULL COMMENT 'configuration usage',
    `effect` varchar(64) DEFAULT NULL COMMENT '配置生效的描述',
    `type` varchar(64) DEFAULT NULL COMMENT '配置的类型',
    `c_schema` text COMMENT '配置的模式',
    `encrypted_data_key` varchar(1024) NOT NULL DEFAULT '' COMMENT '密钥',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';

    /******************************************/
    /* 表名称 = config_info since 2.5.0 */
    /******************************************/
    CREATE TABLE `config_info_gray` (
    `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
    `data_id` varchar(255) NOT NULL COMMENT 'data_id',
    `group_id` varchar(128) NOT NULL COMMENT 'group_id',
    `content` longtext NOT NULL COMMENT 'content',
    `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
    `src_user` text COMMENT 'src_user',
    `src_ip` varchar(100) DEFAULT NULL COMMENT 'src_ip',
    `gmt_create` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'gmt_create',
    `gmt_modified` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'gmt_modified',
    `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
    `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
    `gray_name` varchar(128) NOT NULL COMMENT 'gray_name',
    `gray_rule` text NOT NULL COMMENT 'gray_rule',
    `encrypted_data_key` varchar(256) NOT NULL DEFAULT '' COMMENT 'encrypted_data_key',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_configinfogray_datagrouptenantgray` (`data_id`,`group_id`,`tenant_id`,`gray_name`),
    KEY `idx_dataid_gmt_modified` (`data_id`,`gmt_modified`),
    KEY `idx_gmt_modified` (`gmt_modified`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='config_info_gray';

    /******************************************/
    /* 表名称 = config_info_beta */
    /******************************************/
    CREATE TABLE `config_info_beta` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
    `data_id` varchar(255) NOT NULL COMMENT 'data_id',
    `group_id` varchar(128) NOT NULL COMMENT 'group_id',
    `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
    `content` longtext NOT NULL COMMENT 'content',
    `beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps',
    `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
    `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
    `src_user` text COMMENT 'source user',
    `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
    `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
    `encrypted_data_key` varchar(1024) NOT NULL DEFAULT '' COMMENT '密钥',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';

    /******************************************/
    /* 表名称 = config_info_tag */
    /******************************************/
    CREATE TABLE `config_info_tag` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
    `data_id` varchar(255) NOT NULL COMMENT 'data_id',
    `group_id` varchar(128) NOT NULL COMMENT 'group_id',
    `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
    `tag_id` varchar(128) NOT NULL COMMENT 'tag_id',
    `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
    `content` longtext NOT NULL COMMENT 'content',
    `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
    `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
    `src_user` text COMMENT 'source user',
    `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';

    /******************************************/
    /* 表名称 = config_tags_relation */
    /******************************************/
    CREATE TABLE `config_tags_relation` (
    `id` bigint(20) NOT NULL COMMENT 'id',
    `tag_name` varchar(128) NOT NULL COMMENT 'tag_name',
    `tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type',
    `data_id` varchar(255) NOT NULL COMMENT 'data_id',
    `group_id` varchar(128) NOT NULL COMMENT 'group_id',
    `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
    `nid` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'nid, 自增长标识',
    PRIMARY KEY (`nid`),
    UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),
    KEY `idx_tenant_id` (`tenant_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation';

    /******************************************/
    /* 表名称 = group_capacity */
    /******************************************/
    CREATE TABLE `group_capacity` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
    `group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群',
    `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
    `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
    `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
    `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值',
    `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
    `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
    `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_group_id` (`group_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';

    /******************************************/
    /* 表名称 = his_config_info */
    /******************************************/
    CREATE TABLE `his_config_info` (
    `id` bigint(20) unsigned NOT NULL COMMENT 'id',
    `nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'nid, 自增标识',
    `data_id` varchar(255) NOT NULL COMMENT 'data_id',
    `group_id` varchar(128) NOT NULL COMMENT 'group_id',
    `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
    `content` longtext NOT NULL COMMENT 'content',
    `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
    `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
    `src_user` text COMMENT 'source user',
    `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
    `op_type` char(10) DEFAULT NULL COMMENT 'operation type',
    `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
    `encrypted_data_key` varchar(1024) NOT NULL DEFAULT '' COMMENT '密钥',
    `publish_type` varchar(50) DEFAULT 'formal' COMMENT 'publish type gray or formal',
    `gray_name` varchar(50) DEFAULT NULL COMMENT 'gray name',
    `ext_info` longtext DEFAULT NULL COMMENT 'ext info',
    PRIMARY KEY (`nid`),
    KEY `idx_gmt_create` (`gmt_create`),
    KEY `idx_gmt_modified` (`gmt_modified`),
    KEY `idx_did` (`data_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造';

    /******************************************/
    /* 表名称 = tenant_capacity */
    /******************************************/
    CREATE TABLE `tenant_capacity` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
    `tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID',
    `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
    `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
    `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
    `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数',
    `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
    `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
    `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_tenant_id` (`tenant_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表';

    CREATE TABLE `tenant_info` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
    `kp` varchar(128) NOT NULL COMMENT 'kp',
    `tenant_id` varchar(128) default '' COMMENT 'tenant_id',
    `tenant_name` varchar(128) default '' COMMENT 'tenant_name',
    `tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc',
    `create_source` varchar(32) DEFAULT NULL COMMENT 'create_source',
    `gmt_create` bigint(20) NOT NULL COMMENT '创建时间',
    `gmt_modified` bigint(20) NOT NULL COMMENT '修改时间',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),
    KEY `idx_tenant_id` (`tenant_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';

    CREATE TABLE `users` (
    `username` varchar(50) NOT NULL PRIMARY KEY COMMENT 'username',
    `password` varchar(500) NOT NULL COMMENT 'password',
    `enabled` boolean NOT NULL COMMENT 'enabled'
    );

    CREATE TABLE `roles` (
    `username` varchar(50) NOT NULL COMMENT 'username',
    `role` varchar(50) NOT NULL COMMENT 'role',
    UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE
    );

    CREATE TABLE `permissions` (
    `role` varchar(50) NOT NULL COMMENT 'role',
    `resource` varchar(128) NOT NULL COMMENT 'resource',
    `action` varchar(8) NOT NULL COMMENT 'action',
    UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
    );

    3.2 配置 RocketMQ Broker

    cd ~/docker-compose-project/rocketmq/conf
    touch broker.conf
    cd ~
    #注意生产千万不要777
    chmod -R 777 docker-compose-project/
    cd ~/docker-compose-project/rocketmq/conf
    vi broker.conf

    # RocketMQ Broker 核心配置
    brokerClusterName = DefaultCluster
    brokerName = broker-a
    brokerId = 0
    namesrvAddr = rocketmq-namesrv:9876
    storePathRootDir = /home/rocketmq/store
    autoCreateTopicEnable = true


    🚀 第四部分:启动服务

    4.1 docker desktop拉取镜像版本(可跳过,up 命令会自动拉取)

    mysql:8.4
    nacos/nacos-server:latest
    redis:latest
    apache/rocketmq:5.1.4
    apacherocketmq/rocketmq-dashboard:latest

    在这里插入图片描述

    4.2 启动所有服务

    cd ~/docker-compose-project
    docker-compose up -d


    ✅ 第五部分:服务验证

    服务验证方式预期结果
    MySQL Navicat 连接 localhost:3306 成功查看 nacos_config 库
    Nacos 访问 http://localhost:8848/nacos 出现登录界面(默认账号 nacos/nacos)
    Redis redis-cli -p 6379 → ping 返回 PONG
    RocketMQ 访问 http://localhost:9886/#/ops Dashboard 正常显示集群状态

    Nacos 登录界面 RocketMQ Dashboard


    📝 常见问题排查

    注意:我们启动docker-compose之后,所有的docker操作都是可以在docker desktop上面操作的,同学们自己点点就清楚了,比较简单就不多说了

  • SSH 连接失败

    • 检查 WSL IP 是否变化(每次重启可能变动)
    • 确认 sudo systemctl status ssh 显示为 active
  • Nacos 无法连接 MySQL

    • 检查 init.sql 是否完整执行
    • 查看 MySQL 容器日志:docker logs mysql
    • 可能健康检测未生效,重启nacos就好了
  • RocketMQ Dashboard 无数据

    • 确认 Broker 容器正常启动:docker logs rocketmq-broker
    • 检查 broker.conf 中 namesrvAddr 配置
  • mysql初始化 无数据

    • 手动创建数据库,并导入上面初始化sql,由于配置里面有健康检查和重试机制,所以这个问题一般不会出现,出现了就手动加吧

  • 🔜 下期预告

    《企业级微服务分布式架构搭建》将包含:

    • 微服务组件集群搭建集成项目示例

    💡 本文档持续更新,欢迎关注博主获取最新动态!

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » wsl集成docker desktop环境下使用docker-compose一键部署mysql,nacos,redis,mq详细教程(服务器同理)
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!