2025-09-08
实战设计
0

目录

Docker Desktop 安装
Docker 引擎配置
Mysql 安装
运行容器前的准备
运行容器
容器信息
配置远程访问
Redis 安装
运行容器前的准备
运行容器
Nacos 安装
运行容器前的准备
运行容器
RocketMQ 安装
运行容器前的准备
运行容器
Seata 安装
运行容器前的准备
运行容器

你是否遇到过在本地开发时,没有对应环境的烦恼?什么?你们公司有环境,那不在公司时呢,你在学习过程中需要某些环境呢?接下来,本文将讲述如何搭建环境,其中最安全快捷无残留的安装方式,莫过于 Docker。

Docker Desktop 安装

Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

打开官网,下载 Docker 的桌面客户端,常用的安装地址如下

Docker 引擎配置

安装完成后打开软件是登录页面,点击跳过

image.png

接下来需要配置 Docker 引擎,其内置的引擎已无法使用,在这我选择的是 毫秒镜像,镜像地址是 https://docker.1ms.run

image.png

点击右上角的配置按钮,选择 Docker Engine

image.png

registry-mirrors 数组中添加此镜像

json
{ "builder": { "gc": { "defaultKeepStorage": "20GB", "enabled": true } }, "experimental": false, "registry-mirrors": [ "https://docker.1ms.run" ] }

其他镜像

当上述配置完成以后,需要点击下方的更多,选择 Restart 进行重启服务配置才可生效

image.png

点击下方 Teminal 输入 docker -v 检查 Docker 安装

image.png

Mysql 安装

运行容器前的准备

下载镜像 docker pull mysql:8.0.25,此处我使用的是 8.0.25

运行容器

在控制台执行命令下载完镜像后,到客户端查看镜像,点击运行按钮,可对运行的容器进行属性配置

image.png

当然,也可以继续用脚本执行命令,是相同的,个人更推荐命令执行

sh
docker run -d \ --name mysql \ -p 3306:3306 -p 33060:3360 \ -v /Users/zhangni/liushiGong/docker/mysql/data:/var/lib/mysql \ -v /Users/zhangni/liushiGong/docker/mysql/logs:/var/log/mysql \ -v /Users/zhangni/liushiGong/docker/mysql/conf:/etc/mysql/conf.d \ -e TIME_ZONE=Asia/Shanghai \ -e MYSQL_ROOT_PASSWORD=123456 \ mysql:8.0.25

上述脚本中挂载的目录,需要我们自行配置 my.cnf 文件,首先我们来看下容器内部的 /etc/mysql 目录,包含了 my.cnf,其内部编写了这么一段话

sh
# Custom config should go here !includedir /etc/mysql/conf.d/

自定义配置应该放在 /etc/mysql/conf.d/ 目录下,所以此处我们挂载的目录则是 /Users/zhangni/liushiGong/docker/mysql/conf:/etc/mysql/conf.d, 容器中其目录已存在 docker.cnfmysql.cnf 两个文件,可以 copy 到我们挂载的 /Users/zhangni/liushiGong/docker/mysql/conf 目录下,打开 mysql.cnf 填充配置即可

image.png

编辑 copy 到本地的 mysql.cnf,添加日志文件的输出目录,需要与挂载目录保持一致

sh
[mysqld] # 绑定地址,指定 MySQL 服务器的监听地址。 bind-address = 0.0.0.0 # 错误日志,错误日志记录了 MySQL 服务器的启动、运行或停止时的信息。 log_error = /var/log/mysql/error.log # 查询日志,查询日志记录了所有执行的 SQL 语句,这在调试时非常有用。 general_log = 1 general_log_file = /var/log/mysql/query.log # 二进制日志,二进制日志记录了所有写入到数据库的 SQL 语句,可用于数据库恢复。 log_bin = /var/log/mysql/mysql-bin.log # 慢查询日志,慢查询日志记录了执行时间超过 long_query_time 的 SQL 语句。 slow_query_log = 1 slow_query_log_file = /var/log/mysql/slow-query.log long_query_time = 2

挂载以后需要配置日志目录文件可以让容器进行写入,然后重启容器即可

sh
cd /Users/zhangni/liushiGong/docker/mysql/logs sudo touch error.log query.log mysql-bin.log slow-query.log sudo chmod 666 error.log query.log mysql-bin.log slow-query.log

容器信息

容器启动成功后,可查看容器列表页面查看运行情况

image.png

点击容器,可查看其容器内部信息,功能分别是

  • Logs 当前容器的运行日志
  • Inspect 容器的检查信息,也包含所有的所有属性信息
  • Bind mounts 挂载的目录
  • Exec 容器内部,与 docker -it exec 命令一致
  • Files 容器内部文件目录
  • Stats 监控信息,像CPU、内存使用情况、读写IO、网络

具体玩法自行探索即可

image.png

配置远程访问

打开 Exec 进入 mysql 主机,输入 mysql -u root -p,填写密码(为容器运行时配置的环境变量 MYSQL_ROOT_PASSWORD 的值,此处我们配置的是 123456),

image.png

允许 root 用户从任何主机连接,你可以使用以下 SQL 命令

sql
UPDATE mysql.user SET Host = '%' WHERE User = 'root' AND Host = 'localhost'; FLUSH PRIVILEGES;

Redis 安装

下载镜像 docker pull redis:7.2.4,先做准备工作,创建要挂载的文件夹

sh
sudo mkdir -p /Users/zhangni/liushiGong/docker/redis/data /Users/zhangni/liushiGong/docker/redis/conf /Users/zhangni/liushiGong/docker/redis/logs

切换到配置文件夹下,下载配置文件 redis.conf

sh
cd /Users/zhangni/liushiGong/docker/redis/conf sudo wget http://download.redis.io/redis-stable/redis.conf

创建日志文件并授权:为了让容器有权限写入日志,最好预先创建日志文件并改变其所有者或权限。

sh
sudo touch /Users/zhangni/liushiGong/docker/redis/logs/redis.log sudo chmod 666 /Users/zhangni/liushiGong/docker/redis/logs/redis.log

运行容器前的准备

编辑刚下载的配置文件 /Users/zhangni/liushiGong/docker/redis/conf/redis.conf,修改以下几项关键设置以适应 Docker 环境:

  • bind 0.0.0.0 - 允许所有 IP 连接 Redis,便于远程访问
  • protected-mode no - 关闭保护模式。如果设置了密码且需要远程访问,通常建议关闭
  • daemonize no - 必须设为 no。因为 Redis 在 Docker 容器中应以前台方式运行,这与 Docker 的运行机制有关
  • requirepass 你的密码 - 设置 Redis 访问密码,增强安全性,可以不设置
  • appendonly yes - 开启 AOF 持久化,确保数据在容器重启后不丢失
  • logfile "/logs/redis.log" - 指定日志文件路径(容器内的路径)。注意:在配置文件中设置的是容器内的路径,我们之后会通过挂载将容器内的日志文件映射到宿主机上
  • dir /data - 指定 AOF 文件等持久化数据的存储目录(容器内的路径)。我们也会通过挂载映射到宿主机

注意

我配置 logfile 以后控制台不在输出日志,但是在 redis.log 会输出,所以为了开发的快捷,logfile 配置属性我继续采取了默认方式,同时在 /Users/zhangni/liushiGong/docker/redis/data 目录下创建 redis.log 文件,根据挂载目录其日志会自动写入到日志文件中,同时保证了控制台的日志输出

运行容器

容器运行可使用 Docker 客户端配置,也可以使用 docker run 命令启动容器并挂载目录:

sh
docker run -d \ --name redis \ -p 6379:6379 \ -v /Users/zhangni/liushiGong/docker/redis/conf/redis.conf:/etc/redis/redis.conf \ -v /Users/zhangni/liushiGong/docker/redis/data:/data \ -v /Users/zhangni/liushiGong/docker/redis/logs:/logs \ -e TIME_ZONE=Asia/Shanghai \ --restart unless-stopped \ redis:7.2.4 \ redis-server /etc/redis/redis.conf

参数解释:

  • -d: 后台运行容器。
  • --name redis-server: 为容器指定一个名字。
  • -p 6379:6379: 将宿主机的 6379 端口映射到容器的 6379 端口(前者可根据情况更改)。
  • -v: 挂载目录或文件。
    • -v /path/to/your/redis/conf/redis.conf:/etc/redis/redis.conf: 将宿主机的配置文件挂载到容器内,使得容器使用自定义配置。
    • -v /path/to/your/redis/data:/data: 将宿主机的数据目录挂载到容器内的 /data 目录,持久化 Redis 数据。
    • -v /path/to/your/redis/log:/logs: 将宿主机的日志目录挂载到容器内的 /logs 目录(注意:此处的挂载点需要与 redis.conf 中 logfile 配置的路径对应。如果 logfile 设置为 /var/log/redis.log,则挂载应为 -v /path/to/your/redis/log/redis.log:/var/log/redis.log)。
  • --restart unless-stopped: 设置容器随 Docker 服务自动重启(除非手动停止)。
  • redis:7.2.4: 指定使用的镜像和版本。
  • redis-server /etc/redis/redis.conf: 指定容器启动时运行的命令,即使用挂载的配置文件启动 Redis 服务器

容器运行以后,可用 Reids 客户端进行连接测试。

Nacos 安装

第一步,拉取镜像 docker pull nacos:2.5.1,选择对应版本即可,接下来为运行容器做准备

运行容器前的准备

首选需要下载配置,此处我找的是 2.5.1 版本中源码的配置文件进行下载,下载的文件如下所示,从当前源码地址中 https://gitee.com/mirrors/Nacos/tree/2.5.1/distribution/conf 进行下载,其他版本自行查找对应目录即可

  • application.properties nacos server 启动的配置文件
  • application.properties.example 配置文件的 demo
  • mysql-schema.sql mysql 存储方式的 sql 脚本
  • cluster.conf.example 集群配置的 demo,当前是淡季模式,如有需要则编辑一份 cluster.conf 配置
  • nacos-logback.xml nacos 的日志xml配置,不可缺少

image.png

注意

如果没有 nacos-logback.xml 文件,会遇到 java.io.FileNotFoundException: home nacos conf nacos-logback.xml (No such file or directory) 异常问题,官方中给出了解决方案,那就是从源码配置中 copy 一份文件存放到挂载的配置目录中,官方解答如下: https://nacos.io/en/blog/faq/nacos-user-question-history15618/

接下来我们将以 mysql 的方式进行启动,在 application.properties 文件中找到以下属性,并进行配置

sh
#*************** Config Module Related Configurations ***************# ### If use MySQL as datasource: ### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced. spring.datasource.platform=mysql spring.sql.init.platform=mysql ### Count of DB: db.num=1 ### Connect URL of DB: db.url.0=jdbc:mysql://172.17.0.3:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai db.user.0=root db.password.0=123456

此处配置的 IP 需要查看容器中 mysql 的IP地址,查看方式如下,点击 mysql 容器 -> Inspect -> Networks -> 查看网络配置中的 IPAddress 字段

image.png

配置完数据库以后,需要自行创建数据库,并执行脚本 mysql-schema.sql

sql
/* * Copyright 1999-2018 Alibaba Group Holding Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /******************************************/ /* 表名称 = config_info */ /******************************************/ CREATE TABLE `config_info` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `data_id` varchar(255) NOT NULL COMMENT 'data_id', `group_id` varchar(128) DEFAULT NULL COMMENT 'group_id', `content` longtext NOT NULL COMMENT 'content', `md5` varchar(32) DEFAULT NULL COMMENT 'md5', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', `src_user` text COMMENT 'source user', `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip', `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name', `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段', `c_desc` varchar(256) DEFAULT NULL COMMENT 'configuration description', `c_use` varchar(64) DEFAULT NULL COMMENT 'configuration usage', `effect` varchar(64) DEFAULT NULL COMMENT '配置生效的描述', `type` varchar(64) DEFAULT NULL COMMENT '配置的类型', `c_schema` text COMMENT '配置的模式', `encrypted_data_key` varchar(1024) NOT NULL DEFAULT '' COMMENT '密钥', PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info'; /******************************************/ /* 表名称 = config_info since 2.5.0 */ /******************************************/ CREATE TABLE `config_info_gray` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', `data_id` varchar(255) NOT NULL COMMENT 'data_id', `group_id` varchar(128) NOT NULL COMMENT 'group_id', `content` longtext NOT NULL COMMENT 'content', `md5` varchar(32) DEFAULT NULL COMMENT 'md5', `src_user` text COMMENT 'src_user', `src_ip` varchar(100) DEFAULT NULL COMMENT 'src_ip', `gmt_create` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'gmt_create', `gmt_modified` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'gmt_modified', `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name', `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id', `gray_name` varchar(128) NOT NULL COMMENT 'gray_name', `gray_rule` text NOT NULL COMMENT 'gray_rule', `encrypted_data_key` varchar(256) NOT NULL DEFAULT '' COMMENT 'encrypted_data_key', PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfogray_datagrouptenantgray` (`data_id`,`group_id`,`tenant_id`,`gray_name`), KEY `idx_dataid_gmt_modified` (`data_id`,`gmt_modified`), KEY `idx_gmt_modified` (`gmt_modified`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='config_info_gray'; /******************************************/ /* 表名称 = config_tags_relation */ /******************************************/ CREATE TABLE `config_tags_relation` ( `id` bigint(20) NOT NULL COMMENT 'id', `tag_name` varchar(128) NOT NULL COMMENT 'tag_name', `tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type', `data_id` varchar(255) NOT NULL COMMENT 'data_id', `group_id` varchar(128) NOT NULL COMMENT 'group_id', `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id', `nid` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'nid, 自增长标识', PRIMARY KEY (`nid`), UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`), KEY `idx_tenant_id` (`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation'; /******************************************/ /* 表名称 = group_capacity */ /******************************************/ CREATE TABLE `group_capacity` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', `group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群', `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值', `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量', `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值', `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值', `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值', `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_group_id` (`group_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表'; /******************************************/ /* 表名称 = his_config_info */ /******************************************/ CREATE TABLE `his_config_info` ( `id` bigint(20) unsigned NOT NULL COMMENT 'id', `nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'nid, 自增标识', `data_id` varchar(255) NOT NULL COMMENT 'data_id', `group_id` varchar(128) NOT NULL COMMENT 'group_id', `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name', `content` longtext NOT NULL COMMENT 'content', `md5` varchar(32) DEFAULT NULL COMMENT 'md5', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', `src_user` text COMMENT 'source user', `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip', `op_type` char(10) DEFAULT NULL COMMENT 'operation type', `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段', `encrypted_data_key` varchar(1024) NOT NULL DEFAULT '' COMMENT '密钥', `publish_type` varchar(50) DEFAULT 'formal' COMMENT 'publish type gray or formal', `gray_name` varchar(50) DEFAULT NULL COMMENT 'gray name', `ext_info` longtext DEFAULT NULL COMMENT 'ext info', PRIMARY KEY (`nid`), KEY `idx_gmt_create` (`gmt_create`), KEY `idx_gmt_modified` (`gmt_modified`), KEY `idx_did` (`data_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造'; /******************************************/ /* 表名称 = tenant_capacity */ /******************************************/ CREATE TABLE `tenant_capacity` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', `tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID', `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值', `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量', `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值', `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数', `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值', `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_tenant_id` (`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表'; CREATE TABLE `tenant_info` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `kp` varchar(128) NOT NULL COMMENT 'kp', `tenant_id` varchar(128) default '' COMMENT 'tenant_id', `tenant_name` varchar(128) default '' COMMENT 'tenant_name', `tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc', `create_source` varchar(32) DEFAULT NULL COMMENT 'create_source', `gmt_create` bigint(20) NOT NULL COMMENT '创建时间', `gmt_modified` bigint(20) NOT NULL COMMENT '修改时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`), KEY `idx_tenant_id` (`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info'; CREATE TABLE `users` ( `username` varchar(50) NOT NULL PRIMARY KEY COMMENT 'username', `password` varchar(500) NOT NULL COMMENT 'password', `enabled` boolean NOT NULL COMMENT 'enabled' ); CREATE TABLE `roles` ( `username` varchar(50) NOT NULL COMMENT 'username', `role` varchar(50) NOT NULL COMMENT 'role', UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE ); CREATE TABLE `permissions` ( `role` varchar(50) NOT NULL COMMENT 'role', `resource` varchar(128) NOT NULL COMMENT 'resource', `action` varchar(8) NOT NULL COMMENT 'action', UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE );

创建容器的挂载目录

sh
mkdir -p /Users/zhangni/liushiGong/docker/nacos/conf /Users/zhangni/liushiGong/docker/nacos/logs /Users/zhangni/liushiGong/docker/nacos/data

运行容器

上述准备工作完成后,开始执行容器运行的脚本

sh
docker run \ --name nacos \ -p 8848:8848 -d -p 9848:9848 \ -e MODE=standalone \ -v /Users/zhangni/liushiGong/docker/nacos/conf:/home/nacos/conf \ -v /Users/zhangni/liushiGong/docker/nacos/logs:/home/nacos/logs \ -v /Users/zhangni/liushiGong/docker/nacos/data:/home/nacos/data \ -e TIME_ZONE=Asia/Shanghai \ -d nacos/nacos-server:v2.5.1

容器运行成功,访问 http://127.0.0.1:8848/nacos/ 查看控制台页面,也可以服务注册进行验证

sh
curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'

image.png

RocketMQ 安装

RocketMQ 的安装略微复杂一些,需要下载2个镜像,启动3个容器

sh
docker pull apache/rocketmq:5.3.2 docker pull apacherocketmq/rocketmq-dashboard:latest

运行容器前的准备

先启动 RocketMQ 的服务端容器

sh
docker run -d --name rmqnamesrv -p 9876:9876 apache/rocketmq:5.3.2 sh mqnamesrv

添加 Broker 的配置目录与文件

sh
mkdir -p /Users/zhangni/liushiGong/docker/rocketmq/broker touch /Users/zhangni/liushiGong/docker/rocketmq/broker/broker.conf chmod 666 /Users/zhangni/liushiGong/docker/rocketmq/broker/broker.conf echo "brokerIP1=127.0.0.1" > /Users/zhangni/liushiGong/docker/rocketmq/broker/broker.conf

运行容器

第一步先运行 Broker 容器,在执行命令之前要确认 rmqnamesrv 服务端的IP

image.png

此处服务端的IP为 172.17.0.4, 配置环境变量 NAMESRV_ADDR=172.17.0.4:9876, 运行容器

sh
docker run -d \ --name rmqbroker \ -p 10912:10912 -p 10911:10911 -p 10909:10909 \ -p 8080:8080 -p 8081:8081 \ -e "NAMESRV_ADDR=172.17.0.4:9876" \ -v /Users/zhangni/liushiGong/docker/rocketmq/broker/broker.conf:/home/rocketmq/rocketmq-5.3.2/conf/broker.conf \ apache/rocketmq:5.3.2 sh mqbroker --enable-proxy \ -c /home/rocketmq/rocketmq-5.3.2/conf/broker.conf

启动容器后,查看 Broker 的容器IP,可以确认为 172.17.0.5

image.png

调整 broker.conf 文件,然后重启容器。 如果不调整其IP,控制台在启动后会无法访问到 Broker 服务

sh
echo "brokerIP1=172.17.0.5" > /Users/zhangni/liushiGong/docker/rocketmq/broker/broker.conf

接着启动控制台容器,同理,需要调整服务端的IP,为 172.17.0.4

sh
docker run -d --name rocketmq-dashboard -e "JAVA_OPTS=-Drocketmq.namesrv.addr=172.17.0.4:9876" -p 8282:8082 -t apacherocketmq/rocketmq-dashboard:latest

提示

在这被官网坑了一把,其客户端端口已经被调整成了 8082,查看运行日志可得知端口号 image.png

但是其官网还是 8080 端口,怪不得怎么着都访问不到期控制台 😭

image.png

到这就结束了,验证一波,访问其控制台 http://127.0.0:8282/ ,能看到其页面,完美!

Seata 安装

运行容器前的准备

先运行默认容器,然后从默认容器中copy出配置信息,进入本地挂载目录中

docker run -d -p 8091:8091 -p 7091:7091 --name seata-serve seataio/seata-server:latest docker cp seata-server:/seata-server/resources /Users/zhangni/liushiGong/docker/seata/config cd /Users/zhangni/liushiGong/docker/seata/config

修改 application.yml 文件,把默认 file 类型的配置、注册、存储调整为 nacos、mysql 对应的配置,注意配置对应容器的 IP 地址。

yaml
# Copyright 1999-2019 Seata.io Group. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. server: port: 7091 spring: application: name: seata-server logging: config: classpath:logback-spring.xml file: path: ${log.home:${user.home}/logs/seata} extend: logstash-appender: destination: 127.0.0.1:4560 kafka-appender: bootstrap-servers: 127.0.0.1:9092 topic: logback_to_logstash console: user: username: seata password: seata seata: config: # support: nacos 、 consul 、 apollo 、 zk 、 etcd3 type: nacos nacos: server-addr: 172.17.0.2:8848 namespace: seata group: transaction data-id: seata-server.properties registry: # support: nacos 、 eureka 、 redis 、 zk 、 consul 、 etcd3 、 sofa type: nacos nacos: application: seata-server server-addr: 172.17.0.2:8848 namespace: seata group: transaction security: secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017 tokenValidityInMilliseconds: 1800000 ignore: urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.jpeg,/**/*.ico,/api/v1/auth/login,/health,/error

此处我是使用 nacos 注册中心进行管理,打开 nacos 客户端,添加 seata 的配置信息,先创建命名空间,以上我是使用 seata 作为ID

image.png

创建 seata-server.properties 配置

yaml
seata: store: # support: file 、 db 、 redis mode: db db: datasource: druid db-type: mysql driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://172.17.0.3:3306/seata?rewriteBatchedStatements=true user: root password: 123456 min-conn: 10 max-conn: 100 global-table: global_table branch-table: branch_table lock-table: lock_table distributed-lock-table: distributed_lock query-limit: 1000 max-wait: 5000

image.png

初始化数据库表,脚本地址 https://gitee.com/mirrors/Seata/tree/2.x/script/server/db

sql
-- -- Licensed to the Apache Software Foundation (ASF) under one or more -- contributor license agreements. See the NOTICE file distributed with -- this work for additional information regarding copyright ownership. -- The ASF licenses this file to You under the Apache License, Version 2.0 -- (the "License"); you may not use this file except in compliance with -- the License. You may obtain a copy of the License at -- -- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, -- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- See the License for the specific language governing permissions and -- limitations under the License. -- -- -------------------------------- The script used when storeMode is 'db' -------------------------------- -- the table to store GlobalSession data CREATE TABLE IF NOT EXISTS `global_table` ( `xid` VARCHAR(128) NOT NULL, `transaction_id` BIGINT, `status` TINYINT NOT NULL, `application_id` VARCHAR(32), `transaction_service_group` VARCHAR(32), `transaction_name` VARCHAR(128), `timeout` INT, `begin_time` BIGINT, `application_data` VARCHAR(2000), `gmt_create` DATETIME, `gmt_modified` DATETIME, PRIMARY KEY (`xid`), KEY `idx_status_gmt_modified` (`status` , `gmt_modified`), KEY `idx_transaction_id` (`transaction_id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4; -- the table to store BranchSession data CREATE TABLE IF NOT EXISTS `branch_table` ( `branch_id` BIGINT NOT NULL, `xid` VARCHAR(128) NOT NULL, `transaction_id` BIGINT, `resource_group_id` VARCHAR(32), `resource_id` VARCHAR(256), `branch_type` VARCHAR(8), `status` TINYINT, `client_id` VARCHAR(64), `application_data` VARCHAR(2000), `gmt_create` DATETIME(6), `gmt_modified` DATETIME(6), PRIMARY KEY (`branch_id`), KEY `idx_xid` (`xid`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4; -- the table to store lock data CREATE TABLE IF NOT EXISTS `lock_table` ( `row_key` VARCHAR(128) NOT NULL, `xid` VARCHAR(128), `transaction_id` BIGINT, `branch_id` BIGINT NOT NULL, `resource_id` VARCHAR(256), `table_name` VARCHAR(32), `pk` VARCHAR(36), `status` TINYINT NOT NULL DEFAULT '0' COMMENT '0:locked ,1:rollbacking', `gmt_create` DATETIME, `gmt_modified` DATETIME, PRIMARY KEY (`row_key`), KEY `idx_status` (`status`), KEY `idx_branch_id` (`branch_id`), KEY `idx_xid` (`xid`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4; CREATE TABLE IF NOT EXISTS `distributed_lock` ( `lock_key` CHAR(20) NOT NULL, `lock_value` VARCHAR(20) NOT NULL, `expire` BIGINT, primary key (`lock_key`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4; INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('AsyncCommitting', ' ', 0); INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryCommitting', ' ', 0); INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryRollbacking', ' ', 0); INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('TxTimeoutCheck', ' ', 0); CREATE TABLE IF NOT EXISTS `vgroup_table` ( `vGroup` VARCHAR(255), `namespace` VARCHAR(255), `cluster` VARCHAR(255), UNIQUE KEY `idx_vgroup_namespace_cluster` (`vGroup`,`namespace`,`cluster`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

运行容器

删除已经运行的容器,重新运行,进行挂载目录

sh
docker run \ --name seata-server \ -p 8091:8091 -p 7091:7091 \ -v /Users/zhangni/liushiGong/docker/seata/data:/seata-server/resources \ -e TIME_ZONE=Asia/Shanghai \ -d seataio/seata-server:latest

访问其控制台,查看效果 http://127.0.0.1:7091 账号密码默认是 seata/seata ,可在 nacos 自行配置

image.png

本文作者:柳始恭

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!