在Windows下使用Docker部署Nacos注册中心(基于MySQL容器)
需要两个容器Nacos容器和MySQL容器,MySQL容器专注数据存储,Nacos容器专注服务发现/配置管理
准备工作
- 确保已安装Docker Desktop for Windows
- 确保已启用WSL 2(推荐)或Hyper-V
- 确保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秒),执行以下步骤:
-
下载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
-
执行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
各个参数含义
docker run -d --name nacos-server
docker run
: 启动一个新的 Docker 容器。-d
: 在后台运行容器,即“分离模式”。--name nacos-server
: 给这个容器命名为nacos-server
。
--network nacos_network
- 将容器连接到名为
nacos_network
的 Docker 网络上。这有助于容器间的通信,特别是容器需要访问数据库或其他服务时。
-p 8848:8848
-p 8848:8848
表示将主机的 8848 端口映射到容器的 8848 端口。通常 Nacos 的默认 HTTP 服务运行在 8848 端口,因此这个设置允许从主机访问容器中的 Nacos 服务。
-e MODE=standalone
-e MODE=standalone
设置 Nacos 启动模式为“单机模式”。这种模式下,Nacos 不使用集群部署,而是运行在单个实例上。
-e SPRING_DATASOURCE_PLATFORM=mysql
-e SPRING_DATASOURCE_PLATFORM=mysql
表示 Nacos 使用 MySQL 数据库作为数据源。
- 与 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
。
-e NACOS_AUTH_ENABLE=true
-e NACOS_AUTH_ENABLE=true
启用 Nacos 的身份认证功能,要求用户在访问 Nacos 时进行认证。
-e NACOS_AUTH_TOKEN_EXPIRE_SECONDS=18000
-e NACOS_AUTH_TOKEN_EXPIRE_SECONDS=18000
设置 Nacos 身份认证 token 的过期时间为 18000 秒(即 5 小时)。
-e NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789
-e NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789
设置一个 secret key,用于身份认证。
-e NACOS_AUTH_CACHE_ENABLE=true
-e NACOS_AUTH_CACHE_ENABLE=true
启用认证缓存,这可以提高性能,减少每次请求时的认证开销。
-e JVM_XMS=512m
-e JVM_XMS=512m
设置 Java 虚拟机(JVM)的最小内存为 512MB。
-e JVM_XMX=512m
-e JVM_XMX=512m
设置 Java 虚拟机(JVM)的最大内存为 512MB。
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. 验证部署
- 等待约30秒让服务启动
- 打开浏览器访问: http://localhost:8848/nacos
- 使用默认账号登录:
- 用户名: 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
注意事项
-
生产环境建议:
- 使用更高版本的MySQL(如8.0)
- 修改默认密码
- 配置集群模式而非单机模式
- 配置持久化卷存储数据
-
如果需要持久化存储:
# 为MySQL添加数据卷 -v mysql_data:/var/lib/mysql# 为Nacos添加配置卷 -v nacos_config:/home/nacos/conf
-
如果遇到端口冲突,可以修改映射端口,如:
-p 8849:8848 # 将主机端口改为8849
-
在Windows防火墙中确保放行了8848和3306端口
-
如需更高性能,可以调整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 命令与之前的命令比较,主要有一些不同的配置。下面是详细的对比:
相同点:
docker run -d
: 都是以后台模式运行容器。--name nacos
: 容器名为nacos
,但与第一个命令的nacos-server
略有不同。-e MODE=standalone
: 都是设置 Nacos 为单机模式。-e SPRING_DATASOURCE_PLATFORM=mysql
: 都是使用 MySQL 作为数据源。-p 8848:8848
: 都映射了 Nacos 默认的 8848 端口。
不同点:
-
--name nacos
vs--name nacos-server
:- 第二个命令将容器命名为
nacos
,而第一个命令命名为nacos-server
,容器名称不同。
- 第二个命令将容器命名为
-
--network
选项缺失:- 第一个命令中使用了
--network nacos_network
来指定 Docker 网络,而第二个命令没有这个配置,这意味着第二个命令默认使用 Docker 的桥接网络。
- 第一个命令中使用了
-
-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 地址上。
- 第一个命令中,
-
-e MYSQL_SERVICE_USER=nacos
vs-e MYSQL_SERVICE_USER=root
:- 第一个命令使用了
nacos
用户连接 MySQL,而第二个命令使用了 MySQL 的 root 用户。使用 root 用户通常具有更高的权限。
- 第一个命令使用了
-
-e NACOS_AUTH_*
设置:- 第一个命令中有多个与身份认证相关的环境变量(如
NACOS_AUTH_ENABLE
,NACOS_AUTH_TOKEN_EXPIRE_SECONDS
等),这些变量控制 Nacos 的身份认证机制。而第二个命令没有包含这些设置,这意味着第二个命令的 Nacos 实例可能没有启用认证。
- 第一个命令中有多个与身份认证相关的环境变量(如
-
-p 9848:9848 -p 9849:9849
:- 第二个命令映射了两个额外的端口
9848
和9849
,这些端口通常用于 Nacos 的其他服务(如集群管理界面等)。第一个命令只映射了 8848 端口。
- 第二个命令映射了两个额外的端口
-
--restart=always
:- 第二个命令配置了容器的自动重启策略为
always
,这意味着如果容器崩溃或 Docker 服务重启,容器会自动重新启动。而第一个命令没有指定重启策略,默认情况下,Docker 会根据容器的退出状态决定是否重启。
- 第二个命令配置了容器的自动重启策略为
-
nacos/nacos-server:v2.1.0-slim
vsnacos/nacos-server
:- 第二个命令指定了一个特定版本的镜像
nacos/nacos-server:v2.1.0-slim
,而第一个命令没有指定版本,可能使用的是nacos/nacos-server
的最新版本。
- 第二个命令指定了一个特定版本的镜像
总结:
- 网络:第一个命令明确指定了 Docker 网络,第二个命令没有指定。
- MySQL 连接配置:第二个命令直接使用 IP 地址连接 MySQL,而第一个命令使用容器名作为服务名。
- 认证:第一个命令启用了 Nacos 的认证功能,而第二个命令没有涉及认证设置。
- 端口映射:第二个命令额外暴露了端口
9848
和9849
,可能用于其他 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 地址可能会发生变化的情况下。