在Windows下使用Docker部署Nacos注册中心(基于MySQL容器)

需要两个容器Nacos容器和MySQL容器,MySQL容器专注数据存储,Nacos容器专注服务发现/配置管理

准备工作

  1. 确保已安装Docker Desktop for Windows
  2. 确保已启用WSL 2(推荐)或Hyper-V
  3. 确保Docker服务正在运行

部署步骤

1. 拉取所需镜像

# 拉取MySQL镜像(这里使用5.7版本作为示例)
docker pull mysql:5.7

# 拉取Nacos镜像(使用最新稳定版)
docker pull nacos/nacos-server:latest

2. 创建专用网络(可选但推荐)

docker network create nacos_network

3. 启动MySQL容器

docker run -d --name nacos-mysql `
    --network nacos_network `
    -p 3306:3306 `
    -e MYSQL_ROOT_PASSWORD=root `
    -e MYSQL_DATABASE=nacos `
    -e MYSQL_USER=nacos `
    -e MYSQL_PASSWORD=nacos `
    mysql:5.7

4. 初始化Nacos数据库

等待MySQL容器启动后(约30秒),执行以下步骤:

  1. 下载Nacos的SQL脚本:

    • 从GitHub下载: https://github.com/alibaba/nacos/blob/master/distribution/conf/mysql-schema.sql
    • 或者直接从容器中获取(如果你已经拉取了nacos镜像):
      docker run --rm nacos/nacos-server cat /home/nacos/conf/mysql-schema.sql > mysql-schema.sql
      
      或者使用我的
      https://gitcode.com/smx6666668/CSDN/blob/main/nacos.sql
  2. 执行SQL脚本初始化数据库:

# 将SQL文件复制到容器中
docker cp mysql-schema.sql nacos-mysql:/tmp/mysql-schema.sql

# 在容器中执行SQL脚本
docker exec -it nacos-mysql bash -c "mysql -uroot -proot nacos < /tmp/mysql-schema.sql"

5. 启动Nacos容器

启动方式一
docker run -d --name nacos-server \
    --network nacos_network \
    -p 8848:8848 \
    -e MODE=standalone \
    -e SPRING_DATASOURCE_PLATFORM=mysql \
    -e MYSQL_SERVICE_HOST=nacos-mysql \
    -e MYSQL_SERVICE_PORT=3306 \
    -e MYSQL_SERVICE_USER=nacos \
    -e MYSQL_SERVICE_PASSWORD=nacos \
    -e MYSQL_SERVICE_DB_NAME=nacos \
    -e NACOS_AUTH_ENABLE=true \
    -e NACOS_AUTH_TOKEN_EXPIRE_SECONDS=18000 \
    -e NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789 \
    -e NACOS_AUTH_CACHE_ENABLE=true \
    -e JVM_XMS=512m \
    -e JVM_XMX=512m \
    nacos/nacos-server

各个参数含义

  1. docker run -d --name nacos-server
  • docker run: 启动一个新的 Docker 容器。
  • -d: 在后台运行容器,即“分离模式”。
  • --name nacos-server: 给这个容器命名为 nacos-server
  1. --network nacos_network
  • 将容器连接到名为 nacos_network 的 Docker 网络上。这有助于容器间的通信,特别是容器需要访问数据库或其他服务时。
  1. -p 8848:8848
  • -p 8848:8848 表示将主机的 8848 端口映射到容器的 8848 端口。通常 Nacos 的默认 HTTP 服务运行在 8848 端口,因此这个设置允许从主机访问容器中的 Nacos 服务。
  1. -e MODE=standalone
  • -e MODE=standalone 设置 Nacos 启动模式为“单机模式”。这种模式下,Nacos 不使用集群部署,而是运行在单个实例上。
  1. -e SPRING_DATASOURCE_PLATFORM=mysql
  • -e SPRING_DATASOURCE_PLATFORM=mysql 表示 Nacos 使用 MySQL 数据库作为数据源。
  1. 与 MySQL 相关的环境变量:
    这些环境变量用于配置 Nacos 与 MySQL 数据库的连接。
  • -e MYSQL_SERVICE_HOST=nacos-mysql: 设置 MySQL 服务的主机名为 nacos-mysql,通常是 Docker 网络中其他容器的服务名称。
  • -e MYSQL_SERVICE_PORT=3306: 设置 MySQL 的端口号为 3306(默认端口)。
  • -e MYSQL_SERVICE_USER=nacos: 设置连接 MySQL 的用户名为 nacos
  • -e MYSQL_SERVICE_PASSWORD=nacos: 设置 MySQL 用户的密码为 nacos
  • -e MYSQL_SERVICE_DB_NAME=nacos: 设置使用的数据库名称为 nacos
  1. -e NACOS_AUTH_ENABLE=true
  • -e NACOS_AUTH_ENABLE=true 启用 Nacos 的身份认证功能,要求用户在访问 Nacos 时进行认证。
  1. -e NACOS_AUTH_TOKEN_EXPIRE_SECONDS=18000
  • -e NACOS_AUTH_TOKEN_EXPIRE_SECONDS=18000 设置 Nacos 身份认证 token 的过期时间为 18000 秒(即 5 小时)。
  1. -e NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789
  • -e NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789 设置一个 secret key,用于身份认证。
  1. -e NACOS_AUTH_CACHE_ENABLE=true
  • -e NACOS_AUTH_CACHE_ENABLE=true 启用认证缓存,这可以提高性能,减少每次请求时的认证开销。
  1. -e JVM_XMS=512m
  • -e JVM_XMS=512m 设置 Java 虚拟机(JVM)的最小内存为 512MB。
  1. -e JVM_XMX=512m
  • -e JVM_XMX=512m 设置 Java 虚拟机(JVM)的最大内存为 512MB。
  1. nacos/nacos-server
  • nacos/nacos-server 是要运行的 Docker 镜像的名称,表示 Nacos 服务的 Docker 镜像。
启动方式二
docker run -d \
--name nacos \
-e PREFER_HOST_MODE=hostname \
-e MODE=standalone \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.150.101 \
-e MYSQL_SERVICE_DB_NAME=nacos \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=123 \
-p 8848:8848 \
-p 9848:9848 \
-p 9849:9849 \
--restart=always \
nacos/nacos-server:v2.1.0-slim

1.重启策略 (–restart=always): 设置了容器的重启策略,确保容器在异常停止后能够自动重启,提高系统的可用性。
2.对 MySQL 主机使用 IP 地址 (MYSQL_SERVICE_HOST=192.168.150.101): 使用了 MySQL 的 IP 地址,避免了 DNS 解析问题,适合在网络环境比较复杂或者没有特定 DNS 名称解析的情况下使用。
3.更多端口映射 (-p 9848:9848, -p 9849:9849): 提供了更多的端口映射(包括 9848 和 9849),可以支持更多的功能或访问方式。
4.更简洁的配置: 配置相比第一段更加简洁,减少了一些细节的配置,适合快速部署

PREFER_HOST_MODE=hostname:指定 nacos 服务优先使用主机名的方式来识别和连接。

MODE=standalone:设置 nacos 为单机模式。如果要在集群模式下运行,可以修改为 cluster。

SPRING_DATASOURCE_PLATFORM=mysql:指示 nacos 使用 MySQL 数据库作为数据源。

MYSQL_SERVICE_HOST=192.168.150.101:指定 MySQL 数据库的主机 IP 地址。这里是 MySQL 服务的地址,可以根据实际情况替换为你的数据库地址。

MYSQL_SERVICE_DB_NAME=nacos:设置数据库的名称为 nacos,这是 nacos 服务使用的数据库名称。

MYSQL_SERVICE_PORT=3306:MySQL 服务的端口号,默认是 3306。

MYSQL_SERVICE_USER=root:数据库用户名,这里设置为 root。

MYSQL_SERVICE_PASSWORD=123:数据库密码,这里设置为 123,你可以根据实际情况修改为你的数据库密码。

6. 验证部署

  1. 等待约30秒让服务启动
  2. 打开浏览器访问: http://localhost:8848/nacos
  3. 使用默认账号登录:
    • 用户名: nacos
    • 密码: nacos

常用管理命令

# 查看Nacos日志
docker logs -f nacos-server

# 停止Nacos服务
docker stop nacos-server

# 启动Nacos服务
docker start nacos-server

# 重启Nacos服务
docker restart nacos-server

# 删除所有容器(谨慎使用)
docker rm -f nacos-server nacos-mysql

注意事项

  1. 生产环境建议:

    • 使用更高版本的MySQL(如8.0)
    • 修改默认密码
    • 配置集群模式而非单机模式
    • 配置持久化卷存储数据
  2. 如果需要持久化存储:

    # 为MySQL添加数据卷
    -v mysql_data:/var/lib/mysql
    
    # 为Nacos添加配置卷
    -v nacos_config:/home/nacos/conf
    
  3. 如果遇到端口冲突,可以修改映射端口,如:

    -p 8849:8848  # 将主机端口改为8849
    
  4. 在Windows防火墙中确保放行了8848和3306端口

  5. 如需更高性能,可以调整JVM参数:

    -e JVM_XMS=1g -e JVM_XMX=1g
    

标题分开两个独立容器

Nacos容器和MySQL容器是分开的两个独立容器,这种设计是微服务架构中的常见做法,具有以下特点:

1. 容器分离的好处

  • 职责单一:MySQL容器专注数据存储,Nacos容器专注服务发现/配置管理
  • 独立扩展:可以单独升级或扩展其中任一服务
  • 资源隔离:故障和资源竞争互不影响
  • 安全性:数据库可部署在内网,Nacos对外暴露

2. 连接方式

虽然物理分离,但通过以下方式保持通信:

--network nacos_network  # 使两容器共享同一网络
-e MYSQL_SERVICE_HOST=nacos-mysql  # Nacos通过容器名访问MySQL

3. 验证连接状态

可以通过以下命令检查:

# 进入Nacos容器
docker exec -it nacos-server bash

# 测试MySQL连接(在容器内执行)
ping nacos-mysql  # 应能解析IP
telnet nacos-mysql 3306  # 检查端口连通性

4. 替代方案对比

方案特点适用场景
分容器(当前方案)需要管理多个容器,但灵活性高开发/生产环境
单容器多进程部署简单但违背容器最佳实践快速测试
Docker Compose简化多容器管理推荐开发环境使用

如果需要更简单的管理,可以使用Docker Compose来编排这两个容器(示例docker-compose.yml):

version: '3'
services:
  mysql:
    image: mysql:5.7
    container_name: nacos-mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: nacos
      MYSQL_USER: nacos
      MYSQL_PASSWORD: nacos
    volumes:
      - mysql_data:/var/lib/mysql
    networks:
      - nacos_net

  nacos:
    image: nacos/nacos-server
    container_name: nacos-server
    depends_on:
      - mysql
    environment:
      MODE: standalone
      SPRING_DATASOURCE_PLATFORM: mysql
      MYSQL_SERVICE_HOST: mysql  # 使用service名作为host
      MYSQL_SERVICE_PORT: 3306
      MYSQL_SERVICE_USER: nacos
      MYSQL_SERVICE_PASSWORD: nacos
      MYSQL_SERVICE_DB_NAME: nacos
    ports:
      - "8848:8848"
    networks:
      - nacos_net

volumes:
  mysql_data:

networks:
  nacos_net:
    driver: bridge

启动命令:

docker-compose up -d

两种启动方式的对比

这段新的 Docker 命令与之前的命令比较,主要有一些不同的配置。下面是详细的对比:

相同点:

  1. docker run -d: 都是以后台模式运行容器。
  2. --name nacos: 容器名为 nacos,但与第一个命令的 nacos-server 略有不同。
  3. -e MODE=standalone: 都是设置 Nacos 为单机模式。
  4. -e SPRING_DATASOURCE_PLATFORM=mysql: 都是使用 MySQL 作为数据源。
  5. -p 8848:8848: 都映射了 Nacos 默认的 8848 端口。

不同点:

  1. --name nacos vs --name nacos-server:

    • 第二个命令将容器命名为 nacos,而第一个命令命名为 nacos-server,容器名称不同。
  2. --network 选项缺失:

    • 第一个命令中使用了 --network nacos_network 来指定 Docker 网络,而第二个命令没有这个配置,这意味着第二个命令默认使用 Docker 的桥接网络。
  3. -e MYSQL_SERVICE_HOST=192.168.150.101 vs -e MYSQL_SERVICE_HOST=nacos-mysql:

    • 第一个命令中,MYSQL_SERVICE_HOST 设置为 nacos-mysql,这是容器名或者服务名(假设在一个 Docker 网络中)。而第二个命令中,MYSQL_SERVICE_HOST 设置为 192.168.150.101,这是一个 IP 地址,表示 MySQL 服务在这个 IP 地址上。
  4. -e MYSQL_SERVICE_USER=nacos vs -e MYSQL_SERVICE_USER=root:

    • 第一个命令使用了 nacos 用户连接 MySQL,而第二个命令使用了 MySQL 的 root 用户。使用 root 用户通常具有更高的权限。
  5. -e NACOS_AUTH_* 设置:

    • 第一个命令中有多个与身份认证相关的环境变量(如 NACOS_AUTH_ENABLENACOS_AUTH_TOKEN_EXPIRE_SECONDS 等),这些变量控制 Nacos 的身份认证机制。而第二个命令没有包含这些设置,这意味着第二个命令的 Nacos 实例可能没有启用认证。
  6. -p 9848:9848 -p 9849:9849:

    • 第二个命令映射了两个额外的端口 98489849,这些端口通常用于 Nacos 的其他服务(如集群管理界面等)。第一个命令只映射了 8848 端口。
  7. --restart=always:

    • 第二个命令配置了容器的自动重启策略为 always,这意味着如果容器崩溃或 Docker 服务重启,容器会自动重新启动。而第一个命令没有指定重启策略,默认情况下,Docker 会根据容器的退出状态决定是否重启。
  8. nacos/nacos-server:v2.1.0-slim vs nacos/nacos-server:

    • 第二个命令指定了一个特定版本的镜像 nacos/nacos-server:v2.1.0-slim,而第一个命令没有指定版本,可能使用的是 nacos/nacos-server 的最新版本。

总结:

  • 网络:第一个命令明确指定了 Docker 网络,第二个命令没有指定。
  • MySQL 连接配置:第二个命令直接使用 IP 地址连接 MySQL,而第一个命令使用容器名作为服务名。
  • 认证:第一个命令启用了 Nacos 的认证功能,而第二个命令没有涉及认证设置。
  • 端口映射:第二个命令额外暴露了端口 98489849,可能用于其他 Nacos 功能。
  • 重启策略:第二个命令设置了自动重启策略,而第一个命令没有。
  • 镜像版本:第二个命令使用了指定版本的镜像,版本为 v2.1.0-slim,而第一个命令使用的是默认的最新版本。

如何设置 MySQL 容器的 IP:

MYSQL_SERVICE_HOST 是你要连接的 MySQL 容器的主机名或 IP 地址。在 Docker 容器化的应用中,容器之间可以通过网络互相访问。因此,MYSQL_SERVICE_HOST 的值应当是 MySQL 容器的网络主机名或 IP 地址。

如何设置 MySQL 容器的 IP:

在 Docker 中,容器之间的通信通常通过 Docker 网络来完成。如果你的 MySQL 容器和 Nacos 容器在同一个 Docker 网络下,你可以通过容器的名称来访问 MySQL 服务,而不是直接使用 IP 地址。Docker 会自动解析容器名称并将其解析为相应的 IP 地址。

1. 使用 Docker 自定义网络

首先,创建一个自定义的网络:

docker network create nacos_network

然后,启动 MySQL 容器并将其连接到自定义网络:

docker run -d --name nacos-mysql --network nacos_network -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 mysql:5.7

在这个例子中,MySQL 容器的名称是 nacos-mysql。然后,你可以通过容器名称 nacos-mysql 来在 Nacos 容器中访问 MySQL。

2. 在 Nacos 容器中使用 MySQL 容器名称

然后,你可以在 Nacos 启动命令中将 MYSQL_SERVICE_HOST 设置为 nacos-mysql,因为它们在同一个网络中,Docker 会自动解析这个名称为 MySQL 容器的 IP 地址:

docker run -d --name nacos-server \
    --network nacos_network \
    -p 8848:8848 \
    -e MODE=standalone \
    -e SPRING_DATASOURCE_PLATFORM=mysql \
    -e MYSQL_SERVICE_HOST=nacos-mysql \
    -e MYSQL_SERVICE_PORT=3306 \
    -e MYSQL_SERVICE_USER=nacos \
    -e MYSQL_SERVICE_PASSWORD=nacos \
    -e MYSQL_SERVICE_DB_NAME=nacos \
    nacos/nacos-server

在这种情况下,你不需要关心 MySQL 容器的实际 IP 地址,Docker 会在网络内部处理容器名称解析。

3. 如果你需要手动获取 MySQL 容器的 IP 地址:

如果你确实需要 MySQL 容器的 IP 地址,可以使用以下命令来查找:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nacos-mysql

这将返回 MySQL 容器的 IP 地址,然后你可以在 Nacos 配置中使用它:

docker run -d --name nacos-server \
    -e MYSQL_SERVICE_HOST=172.17.0.2 \  # 假设这是 MySQL 容器的 IP 地址
    ...

总结:

  • 最简单和推荐的方法是将 MYSQL_SERVICE_HOST 设置为 MySQL 容器的名称(如 nacos-mysql),前提是两个容器在同一个 Docker 网络下。这样,Docker 会自动解析容器名称为 IP 地址。
  • 如果你必须使用 IP 地址,可以通过 docker inspect 命令来查找 MySQL 容器的 IP 地址,但这种做法缺乏灵活性,尤其是在容器的 IP 地址可能会发生变化的情况下。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

smx6666668

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值