当前位置: 首页 > news >正文

在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.7container_name: nacos-mysqlenvironment:MYSQL_ROOT_PASSWORD: rootMYSQL_DATABASE: nacosMYSQL_USER: nacosMYSQL_PASSWORD: nacosvolumes:- mysql_data:/var/lib/mysqlnetworks:- nacos_netnacos:image: nacos/nacos-servercontainer_name: nacos-serverdepends_on:- mysqlenvironment:MODE: standaloneSPRING_DATASOURCE_PLATFORM: mysqlMYSQL_SERVICE_HOST: mysql  # 使用service名作为hostMYSQL_SERVICE_PORT: 3306MYSQL_SERVICE_USER: nacosMYSQL_SERVICE_PASSWORD: nacosMYSQL_SERVICE_DB_NAME: nacosports:- "8848:8848"networks:- nacos_netvolumes: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 地址可能会发生变化的情况下。

http://www.mrgr.cn/news/96801.html

相关文章:

  • 华为交换综合实验——VRRP、MSTP、Eth-trunk、NAT、DHCP等技术应用
  • MySQL数据库学习笔记1.SQL(1)
  • 使用 GitHub Pages 快速部署静态网页
  • Mysql之事务(下)
  • Linux安装Ubuntu24.04系统 并安装配置Nvidia 4090 显卡驱动
  • 论文阅读笔记:Denoising Diffusion Implicit Models (2)
  • STM32_HAL之程序编写、编译、烧写、上板测试初体验
  • 使用SpringBoot + Thymeleaf + iText实现动态PDF导出
  • git 按行切割 csv文件
  • echarts+HTML 绘制3d地图,加载散点+散点点击事件
  • C#:第一性原理拆解属性(property)
  • Anaconda和Pycharm的区别,以及如何选择两者
  • k8s 1.30 安装ingress-nginx
  • 为什么 Three.js 里 Cannon.js 物体堆叠时会有空隙?
  • 【C语言】深入理解指针(三):C语言中的高级指针应用
  • Prompt攻击是什么
  • Anolis系统下安装Jenkins
  • 检查是否存在占用内存过大的SQL
  • Unity中 粒子系统使用整理(一)
  • Vue3.5 企业级管理系统实战(十二):组件尺寸及多语言实现