Docker 安装单机版的 Nacos 与 MySQL 8

前言

本文将通过 Docker 安装单机版的 Nacos 和 MySQL 8,并让 Nacos 将数据存储在 MySQL 8 中。

版本说明

中间件版本
Docker24.0.5
Docker Compose2.20.2
MySQL8.4.2
Nacos2.4.3

Nacos 项目

下载 Nacos 项目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 拉取 Nacos 项目的源码
$ git clone https://github.com/alibaba/nacos.git

# 进入源码目录
$ cd nacos

# 目录结构,后面会使用 mysql-schema.sql 来初始化 MySQL 数据库
$ tree distribution/conf/
├── 1.4.0-ipv6_support-update.sql
├── announcement_en-US.conf
├── announcement_zh-CN.conf
├── application.properties
├── application.properties.example
├── cluster.conf.example
├── console-guide.conf
├── derby-schema.sql
├── mysql-schema.sql
└── nacos-logback.xml

Nacos 项目的地址

Nacos 项目的 GitHub 仓库地址在 这里

下载 Nacos Docker 项目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# 拉取 Nacos Docker 项目的源码
$ git clone https://github.com/nacos-group/nacos-docker.git

# 进入源码目录
$ cd nacos-docker

# 目录结构,其中包含了 Docker 各种使用示例的配置文件,比如 standalone-mysql-8.yaml
$ tree .
├── build
│   ├── bin
│   │   └── docker-startup.sh
│   ├── conf
│   │   └── application.properties
│   ├── Dockerfile
│   └── Dockerfile.Slim
├── changlog
├── env
│   ├── custom-application-config.env
│   ├── mysql.env
│   ├── nacos-embedded.env
│   ├── nacos-hostname.env
│   ├── nacos-ip.env
│   └── nacos-standlone-mysql.env
├── example
│   ├── cluster-embedded.yaml
│   ├── cluster-hostname.yaml
│   ├── cluster-ip.yaml
│   ├── custom-application-config.yaml
│   ├── image
│   │   └── mysql
│   │   ├── 5.7
│   │   │   └── Dockerfile
│   │   └── 8
│   │   └── Dockerfile
│   ├── init.d
│   │   └── application.properties
│   ├── prometheus
│   │   ├── prometheus-cluster.yaml
│   │   └── prometheus-standalone.yaml
│   ├── standalone-derby.yaml
│   ├── standalone-mysql-5.7.yaml
│   └── standalone-mysql-8.yaml
├── README.md
└── README_ZH.md

Nacos Docker 项目的地址

Nacos Docker 项目的 GitHub 仓库地址在 这里

Docker 安装 MySQL 8

创建 YML 配置文件

  • 创建 docker-compose.yml 配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
version: '3.5'

services:
mysql:
image: mysql:8.4.2
container_name: mysql-server
command: ["mysqld", "--mysql-native-password=ON"]
restart: always
ports:
- 3306:3306
environment:
- TZ=Asia/Shanghai
- MYSQL_ROOT_PASSWORD=123456
volumes:
- '/usr/local/mysql/data:/var/lib/mysql'
healthcheck:
test: ["CMD-SHELL", "mysqladmin ping -h localhost"]
interval: 5s
timeout: 10s
retries: 10
networks:
- nacos-network

networks:
nacos-network:
driver: bridge

创建 MySQL 8 容器

  • 使用 Docker Compose 创建并启动 MySQL 容器
1
docker compose up -d

初始化 MySQL 8 数据库

  • 拷贝数据库初始化脚本到 MySQL 容器内部,这里的初始化脚本可以从 Nacos 项目 中获取得到
1
docker cp nacos/distribution/conf/mysql-schema.sql mysql-server:/
  • 登录 MySQL 数据库
1
2
3
4
5
# 连接进 MySQL 容器的内部
docker exec -it mysql-server /bin/bash

# 登录 MySQL 数据库
mysql -h localhost -u root -p
  • 初始化 MySQL 数据库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 创建用户
mysql> CREATE USER 'nacos'@'%' IDENTIFIED WITH mysql_native_password BY 'nacos';

# 创建数据库
mysql> create database nacos_devtest default character set utf8;

# 用户授权访问
mysql> GRANT ALL ON nacos_devtest.* TO 'nacos'@'%';

# 刷新权限
mysql> flush privileges;

# 切换数据库
mysql> use nacos_devtest;

# 执行数据库初始化脚本
mysql> source /mysql-schema.sql;

# 查看数据库表
mysql> show tables;
+------------------------+
| Tables_in_nacos_devtest |
+------------------------+
| config_info |
| config_info_aggr |
| config_info_beta |
| config_info_tag |
| config_tags_relation |
| group_capacity |
| his_config_info |
| permissions |
| roles |
| tenant_capacity |
| tenant_info |
| users |
+------------------------+

Docker 安装 Nacos

编辑 YML 配置文件

在上面创建的 docker-compose.yml 配置文件的基础上,添加 Nacos 的配置信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
version: '3.5'

services:
mysql:
image: mysql:8.4.2
container_name: mysql-server
command: ["mysqld", "--mysql-native-password=ON"]
restart: always
ports:
- 3306:3306
environment:
- TZ=Asia/Shanghai
- MYSQL_ROOT_PASSWORD=123456
volumes:
- '/usr/local/mysql/data:/var/lib/mysql'
healthcheck:
test: ["CMD-SHELL", "mysqladmin ping -h localhost"]
interval: 5s
timeout: 10s
retries: 10
networks:
- nacos-network

nacos:
image: nacos/nacos-server:v2.4.3
container_name: nacos-standalone
restart: always
environment:
- PREFER_HOST_MODE=hostname
- MODE=standalone
- SPRING_DATASOURCE_PLATFORM=mysql
- MYSQL_SERVICE_HOST=mysql
- MYSQL_SERVICE_DB_NAME=nacos_devtest
- MYSQL_SERVICE_PORT=3306
- MYSQL_SERVICE_USER=nacos
- MYSQL_SERVICE_PASSWORD=nacos
- MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
- NACOS_AUTH_IDENTITY_KEY=2222
- NACOS_AUTH_IDENTITY_VALUE=2xxx
- NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789
volumes:
- /var/log/nacos/logs/:/home/nacos/logs
ports:
- "8848:8848"
- "9848:9848"
depends_on:
mysql:
condition: service_healthy
networks:
- nacos-network

networks:
nacos-network:
driver: bridge
  • 重要参数说明:
    • SPRING_DATASOURCE_PLATFORM=mysql:使用 MySQL 作为存储。
    • MYSQL_SERVICE_PORT=3306:指定 MySQL 的端口。
    • MYSQL_SERVICE_USER=nacos:指定连接 MySQL 时使用的用户名。
    • MYSQL_SERVICE_PASSWORD=nacos:指定连接 MySQL 时使用的密码。
    • MYSQL_SERVICE_HOST=mysql:这里的 mysql 是在 Docker Compose 中定义的 MySQL 服务的名称,用作其他服务(如 Nacos)访问 MySQL 的主机名,Docker Compose 会自动将这个名称解析为 MySQL 容器的 IP 地址。

提示

在上面的 YML 配置文件中,Nacos 容器的环境变量参考自 Nacos Docker 项目里的 YML 配置文件,即 nacos-docker/example/standalone-mysql-8.yaml

创建 Nacos 容器

  • 使用 Docker Compose 创建并启动 Nacos 容器
1
docker compose up -d

测试 Nacos 容器

  • 查看 Nacos 容器的日志信息
1
docker logs -f --tail 50 nacos-standalone
  • 或者直接查看宿主机内的 Nacos 日志文件
1
tail -f -n 50 /usr/local/docker/docker-volumes/nacos/logs/nacos.log
  • 浏览器通过 http://xxx.xxx.xxx.xxx:8848/nacos 访问 Nacos 的控制台页面,若是可以正常访问,则说明 Nacos 正常运行

参考资料