Docker搭建:Nacos
参考:
Docker搭建:Nacos
Docker 方式
环境依赖
软件/系统 | 版本 | 架构 | 包名 | 备注 |
---|---|---|---|---|
Docker |
安装搭建
mkdir -p /data/nacos/{conf,logs,data}
docker run --name nacos \
-p 8848:8848 \
-e MODE=standalone \
-d nacos/nacos-server:1.2.1
docker cp nacos:/home/nacos/conf /data/nacos/
docker cp nacos:/home/nacos/logs /data/nacos/
docker cp nacos:/home/nacos/data /data/nacos/
docker stop nacos
docker rm nacos
docker run --name nacos \
-p 8848:8848 \
-v /data/nacos/conf:/home/nacos/conf \
-v /data/nacos/logs:/home/nacos/logs \
-v /data/nacos/data:/home/nacos/data \
-e MODE=standalone \
-d nacos/nacos-server:1.2.1
docker restart nacos
Docker Compose 方式
环境依赖
软件/系统 | 版本 | 架构 | 包名 | 备注 |
---|---|---|---|---|
Docker Compose |
安装搭建
创建数据文件夹
# nacos
sudo mkdir -p /data/docker_nacos/{data,conf,logs}
# mysql
sudo mkdir -p /data/docker_nacos_mysql/{sock,data,mysql-files,conf,logs,init}
sudo mkdir -p /data/docker_nacos_mysql/conf/{my.cnf.d,conf.d,mysql.conf.d}
复制MySQL配置
# 启动一个退出后自动删除的临时容器
sudo docker run --rm --name temp-mysql -d mysql:5.7.44 tail -f /dev/null
--rm
:容器停止后自动删除,避免残留容器占用资源。tail -f /dev/null
:保持容器活跃但不启动MySQL服务,避免因配置缺失导致服务崩溃。
# 将容器内的配置文件复制到宿主机目录
sudo docker cp temp-mysql:/etc/my.cnf /data/docker_nacos_mysql/conf/
temp-mysql
:容器名称(需与上一步的--name
一致)。/etc/mysql/my.cnf
:容器内配置文件路径。MySQL 5.7官方镜像的默认配置文件通常位于以下路径:
/etc/mysql/my.cnf
(主配置文件)/etc/mysql/conf.d/
(包含额外配置文件的目录)
也可进入容器查找路径:
docker exec -it temp-mysql bash find / -name my.cnf
/data/docker_nacos_mysql/conf/my.cnf
:宿主机目标路径,根据需要自定义。
# 检查宿主机目标路径下是否生成 `my.cnf` 文件:
cat /data/docker_nacos_mysql/conf/my.cnf
#停止并清理容器
sudo docker stop temp-mysql
复制Nacos配置
# 启动一个退出后自动删除的临时容器
sudo docker run --rm --name temp-nacos -e MODE=standalone -d nacos/nacos-server:v2.4.3 tail -f /dev/null
# 复制
sudo docker cp temp-nacos:/home/nacos/conf /data/docker_nacos/
sudo docker cp temp-nacos:/home/nacos/logs /data/docker_nacos/
sudo docker cp temp-nacos:/home/nacos/data /data/docker_nacos/
#停止并清理容器
sudo docker stop temp-nacos
#复制Nacos建表脚本
sudo cp /data/docker_nacos/conf/mysql-schema.sql /data/docker_nacos_mysql/init/
编辑Docker Compose文件
sudo vi docker-compose.yaml
# 版本
#version: "3"
# 网络
networks:
# 数据库隔离
db_internal:
# 网络类型
driver: bridge
# 网络策略:仅内网访问
internal: true
# 应用网络
app_network:
# 网络类型
driver: bridge
# 服务
services:
# nacos服务
nacos:
# 容器名称
container_name: nacos_2.4.3
# 镜像及版本
image: nacos/nacos-server:v2.4.3
# 自动重启
restart: always
# 网络环境
networks:
- app_network
- db_internal
# 主机名
hostname: nacos_2.4.3
# 端口映射
ports:
- "8848:8848"
- "9848:9848"
- "9849:9849"
# 环境变量
environment:
# 部署模式:单机模式
- MODE=standalone
# 服务实例标识模式:主机名模式(默认IP模式)
- PREFER_HOST_MODE=hostname
# 时区:亚洲/上海
- TZ=Asia/Shanghai
# 总开关:启用鉴权
- NACOS_AUTH_ENABLE=true
# JWT的加密密钥,用于生成和验证访问令牌:自定义Base64密钥(需≥32字符),生成方式:openssl rand -hex 32 | base64
- NACOS_AUTH_TOKEN=MmRiZGU5ZjFhMzJmODM0MzlmZDE3NjkzMmYxMjNjM2EzNjYwY2M2NDYyNTk4YTY4NTkyNzRkMmZiNTQ1MDAxZQo=
# 服务端身份标识的键值对,用于区分合法请求来源
- NACOS_AUTH_IDENTITY_KEY=serverAuthKey # 服务端身份标识键
- NACOS_AUTH_IDENTITY_VALUE=serverAuthValue # 服务端身份标识值
# 数据库类型:mysql
- NACOS_DATASOURCE_PLATFORM=mysql
# MySQL数据库连接信息
# 主机
- MYSQL_SERVICE_HOST=mysql
# 端口
- MYSQL_SERVICE_PORT=3306
# 账户
- MYSQL_SERVICE_USER=nacos
# 密码
- MYSQL_SERVICE_PASSWORD=ns@at3721
# 库名
- MYSQL_SERVICE_DB_NAME=nacos_config
# 连接参数
- MYSQL_SERVICE_DB_PARAM='characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai'
# 数据持久卷
volumes:
# 数据文件
- "/data/docker_nacos/data:/home/nacos/data"
# 配置文件
- "/data/docker_nacos/conf:/home/nacos/conf"
# 日志文件
- "/data/docker_nacos/logs:/home/nacos/logs"
# 依赖条件
depends_on:
mysql:
condition: service_healthy
# MySQL服务
mysql:
# 容器名称
container_name: nacos_2.4.3_mysql_5.7.44
# 镜像及版本
image: mysql:5.7.44
# 自动重启
restart: always
# 高级权限
privileged: true
# 网络环境
networks:
- db_internal
# 主机名
hostname: nacos_2.4.3_mysql_5.7.44
# 端口映射
#ports:
# - "3306:3306"
# 数据持久卷
volumes:
- "/data/docker_nacos_mysql/sock:/var/run/mysqld"
- "/data/docker_nacos_mysql/data:/var/lib/mysql"
- "/data/docker_nacos_mysql/mysql-files:/var/lib/mysql-files"
- "/data/docker_nacos_mysql/conf/my.cnf:/etc/my.cnf"
- "/data/docker_nacos_mysql/conf/my.cnf.d:/etc/my.cnf.d"
- "/data/docker_nacos_mysql/conf/conf.d:/etc/mysql/conf.d"
- "/data/docker_nacos_mysql/conf/mysql.conf.d:/etc/mysql/mysql.conf.d"
- "/data/docker_nacos_mysql/logs:/var/log/mysql"
- "/data/docker_nacos_mysql/init:/docker-entrypoint-initdb.d"
# 环境变量
environment:
# 时区:亚洲/上海
- TZ=Asia/Shanghai
# 账户root密码
- MYSQL_ROOT_PASSWORD=rt@at3721
# 允许root通过所有IP访问
- MYSQL_ROOT_HOST=%
# 数据库名称
- MYSQL_DATABASE=nacos_config
# 数据库账户
- MYSQL_USER=nacos
# 数据库账号密码
- MYSQL_PASSWORD=ns@at3721
# 中文编码
- LANG=C.UTF-8
# 健康检测
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "-uroot", "-prt@at3721"]
# 间隔时间
interval: 5s
# 超时时间
timeout: 10s
# 重试次数
retries: 5
PREFER_HOST_MODE
是 Nacos 中用于控制服务实例注册时优先使用主机名(hostname)还是 IP 地址的关键配置参数。以下是其核心作用与典型场景:作用说明
- hostname 模式: 当设置为
hostname
时,Nacos 会优先使用主机名作为服务实例的标识。这在动态网络环境(如 Kubernetes)中尤为重要,因为容器 IP 可能频繁变化,而主机名通常更稳定。
- hostname 模式: 当设置为
ip 模式: 默认使用 IP 地址注册服务实例,适用于静态 IP 环境或需要直接通过 IP 访问的场景。
典型场景
Kubernetes 环境 :在 K8s 集群中,Pod 的 IP 会随重启或扩缩容变化,而主机名(如
nacos-0.nacos-headless.default.svc.cluster.local
)是固定的。通过PREFER_HOST_MODE=hostname
可确保服务发现不受 IP 变动影响。多网卡环境 :若服务器有多个网卡(如内网+公网),指定主机名可避免 Nacos 误选不期望的 IP 地址。
配置方式
1. Docker 启动时配置
docker run -d \ --name nacos \ -e PREFER_HOST_MODE=hostname \ # 强制使用主机名 -e MODE=standalone \ # 单机模式 -p 8848:8848 \ nacos/nacos-server
2. 配置文件修改
在
application.properties
中添加:nacos.inetutils.prefer-hostname-over-ip=true
注意事项
主机名解析:需确保网络环境中主机名能被正确解析(如通过 DNS 或
/etc/hosts
配置)。鉴权配置:若需安全访问,建议同时启用鉴权(如
NACOS_AUTH_ENABLE=true
)。
启动Docker Compose文件
# 启动
sudo docker compose up -d
# 关闭
sudo docker compose down
访问验证
部署完成后访问http://ip:8848/nacos
,使用默认账号nacos/nacos
登录,建议首次登录后立即修改密码。
常见问题
默认localhost身份验证问题:
[Note] Access denied for user 'root'@'localhost' (using password: YES)
解决方式:确保root用户权限覆盖localhost
# 进入容器 docker exec -it nacos_2.4.3_mysql_5.7.44 mysql -uroot -prt@at3721
添加
root@localhost
权限,注意:确保root@localhost
的密码与配置一致。ALTER USER 'root'@'localhost' IDENTIFIED BY 'rt@at3721'; FLUSH PRIVILEGES;
待学习如何实现多容器互联?