以CentOS7.6为例
前期准备
安装Docker
1、运行以下命令,下载docker-ce的yum源
sudo wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2、运行以下命令,安装Docker
sudo yum -y install docker-ce
3、执行以下命令,检查Docker是否安装成功
sudo docker -v
4、执行以下命令,启动Docker服务,并设置开机自启动
sudo systemctl start docker
sudo systemctl enable docker
5、执行以下命令,查看Docker是否启动。
sudo systemctl status docker
设置镜像加速器
# 执行如下命令:
mkdir /etc/docker 表示创建一个文件夹
#如果有该文件则进入编辑状态,如果没有,则创建该文件然后进入编辑状态
vi /etc/docker/daemon.json
#编写以下内容
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com"
]
}安装Docker-Compose
1、运行以下命令,安装setuptools。
sudo pip3 install -U pip setuptools
2、运行以下命令,安装docker-compose。
sudo pip3 install docker-compose
3、运行以下命令,验证docker-compose是否安装成功。
docker-compose --versionGit安装
以CentOS7.6 为例子
1、执行安装命令
sudo yum install -y git
2、查看 是否 安装成功
git --version安装Mysql
1、执行 mkdir mysql
2、cd mysql 进入文件夹
3、执行命令 vi docker-compose.yml 如果有文件编辑此文件,如果没有文件创建并编辑此文件,将以下内容复制粘贴
version: '3'
services:
mysql:
container_name: mysql
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} # 从环境变量读取密码
image: "mysql:8.0"
restart: always
volumes:
- "./data:/var/lib/mysql"
ports:
- "3306:3306"在docker-compose.yml文件同级 执行命令 vi .env 命令创建一个env文件
填写内容
MYSQL_ROOT_PASSWORD=root # 这里填写你的实际密码
执行命令 docker-compose.yml up -d 拉取镜像执行
安装Nacos(Git拉取方式)
1、下载最新版nacos源码 git clone https://github.com/nacos-group/nacos-docker.git
2、进入对应目录修改配置文件 修改 nacos-docker/env/nacos-standlone-mysql.env,将其中Mysql连接信息修改成自己数据库连接信息
主要修改:MYSQL_SERVICE_HOST、MYSQL_SERVICE_DB_NAME、MYSQL_SERVICE_USER、MYSQL_SERVICE_PASSWORD等几个为你自己的数据链接信息
之后修改目录 example 中的 .env文件 需要执行命令 ll -a显示全部才能看见,vi .env,修改nacos版本号为2.5.0,再修改standalone-mysql.yaml文件,如果你已设置外部数据库,文件内只需保留nacos信息。从 depends_on: 从这行命令往下,全部注释掉
3、创建数据库及建表
创建名称为nacos_config的数据库,并且初始化表结构,建表语句在下面(请找你自己安装的版本对应的SQL文件)
https://github.com/alibaba/nacos/blob/2.3.0/distribution/conf/mysql-schema.sql (如果你安装的是大于等于2.5.0的建表语句:https://github.com/alibaba/nacos/blob/2.5.0/distribution/conf/mysql-schema.sql
如果是更新的版本,请找你对应的版本的SQL执行)
4、启动nacos
在nacos-docker-2.3.0/example目录下执行:
docker-compose -f standalone-mysql.yaml up
安装Redis
1、创建redis文件夹
mkdir redis
2、进入此文件夹 执行vi docker-compose.yml 编辑文件
version: '3.8'
services:
redis:
container_name: redis
image: redis:5.0.7 # 镜像版本(可以根据自己需求修改)
restart: always
ports:
- "6379:6379" # 端口映射(宿主机:容器内)
volumes:
- ./conf/redis.conf:/etc/redis/redis.conf:rw
- ./data:/data:rw
# 启动命令(数组格式,避免YAML解析错误)
command:
- redis-server
- /etc/redis/redis.conf # 加载挂载的配置文件
- --requirepass # 密码参数(从.env读取)
- ${REDIS_PASSWORD}
environment:
- TZ=Asia/Shanghai # 时区配置(与宿主机保持一致)
# 资源限制(可选,根据服务器配置调整)
deploy:
resources:
limits:
cpus: '0.5' # 最大使用0.5个CPU核心
memory: 1G # 最大使用1GB内存ESC退出编辑模式,按:号 wq保存退出
3、执行vi .env文件 创建并编辑
输入 REDIS_PASSWORD=root # Redis 访问密码(建议替换为复杂密码)
保存并退出
4、执行 mkdir conf 创建conf目录
cd conf 进入目录 执行 vi redis.conf命令 配置持久化
输入
# -------------------------- RDB 持久化配置 --------------------------
# 900秒内有1次修改则触发RDB快照
save 900 1
# 300秒内有10次修改则触发RDB快照
save 300 10
# 60秒内有10000次修改则触发RDB快照
save 60 10000
# RDB文件压缩(yes启用,节省空间但消耗CPU)
rdbcompression yes
# RDB文件校验(yes启用,确保文件完整性)
rdbchecksum yes
# RDB文件名(默认即可)
dbfilename dump.rdb
# -------------------------- AOF 持久化配置 --------------------------
# 启用AOF持久化(与命令行无冲突,配置文件优先级低于命令行,但建议保持一致)
appendonly yes
# AOF文件名(默认即可)
appendfilename "appendonly.aof"
# AOF刷盘策略:每秒一次(平衡性能与安全性)
appendfsync everysec
# AOF重写时是否暂停同步(no:不暂停,保证数据不丢失)
no-appendfsync-on-rewrite no
# AOF文件大小增长比例达到100%时触发重写
auto-aof-rewrite-percentage 100
# AOF文件最小重写大小(64MB)
auto-aof-rewrite-min-size 64mb
# -------------------------- 混合持久化配置 --------------------------
# 开启混合持久化(AOF重写时包含RDB前缀,Redis 4.0+支持,5.0.7兼容)
aof-use-rdb-preamble yes
# -------------------------- 数据目录配置 --------------------------
# 数据文件(RDB/AOF)存储目录(需与挂载的/data目录一致)
dir /data
# -------------------------- 内存配置 --------------------------
# 最大使用内存(根据服务器实际情况调整,这里设为512MB)
maxmemory 512mb
# 内存满时的淘汰策略:删除最少使用的key(适用于缓存场景)
maxmemory-policy allkeys-lru
# -------------------------- 网络配置 --------------------------
# 绑定IP(0.0.0.0表示允许所有IP访问,生产环境建议指定具体IP)
bind 0.0.0.0
# 连接超时时间(300秒)
timeout 300
# -------------------------- 其他安全配置 --------------------------
# 关闭保护模式(允许远程连接,配合密码使用更安全)
protected-mode no
# 客户端最大连接数(默认10000,根据需求调整)
maxclients 10000保存退出
在docker-compose.yml文件同级执行命令
docker-compose up -d测试持久化是否生效
127.0.0.1替换为运行redis的服务器的ip
# 测试数据持久化
127.0.0.1:6379> set test "hello redis"
OK
127.0.0.1:6379> get test
"hello redis"
127.0.0.1:6379> exit
# 重启容器后验证数据是否保留
docker-compose restart redis
docker exec -it redis redis-cli
127.0.0.1:6379> auth Redis@2024_secure
OK
127.0.0.1:6379> get test # 仍能获取到值,说明持久化生效
"hello redis"ElasticSearch安装
1、创建一个文件夹
mkdir es2、进入es文件夹中创建一个docker-compose.yml文件
vi docker-compose.yml3、在docker-compose.yml中加入以下内容
version: '3'
services:
elasticsearch:
image: elasticsearch:8.13.0
container_name: elasticsearch
restart: always
environment:
- bootstrap.memory_lock=true
- http.cors.enabled=true
- http.cors.allow-origin=*
- "discovery.type=single-node"
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- /root/es/plugins:/usr/share/elasticsearch/plugins
ports:
- 9200:9200
- 9300:9300
kibana:
image: kibana:8.13.0
container_name: kibana
environment:
- SERVER_NAME=kibana
- ELASTICSEARCH_URL=http://127.0.0.1:9200 #这里要替换为你运行es容器的服务器的ip
- XPACK_MONITORING_ENABLED=true
ports:
- 5601:5601
depends_on:
- elasticsearch
external_links:
- elasticsearch4、es文件夹下执行脚本
docker-compose up -dseata安装
1、下载安装包
https://seata.apache.org/zh-cn/unversioned/release-history/seata-server
我下载的是2.0.0的版本
下载后解压,unzip unzip seata-server-2.0.0.zip ,解压后的目录结构如下:

2、配置文件修改
进入conf目录,找到application.yml,修改其中的配置:
seata:
config:
type: nacos
nacos:
server-addr: 127.0.0.1:8848
group: 'seata'
namespace: '32d418dd-ff3b-45a3-8699-dd66bb540e86'
registry:
type: nacos
nacos:
application: seata-server
server-addr: 127.0.0.1:8848
group : "seata"
namespace: "32d418dd-ff3b-45a3-8699-dd66bb540e86"对应的nacos上的namespace配置如下:

注意这里的命名空间ID、和配置文件中的namespace要一致。
3、在nacos上增加配置信息
在nacos上增加配置,namespace选择刚刚创建好的,和seata的配置对应上,创建一个data_id为seataServer.properties的文件
文件内容来自:https://github.com/apache/incubator-seata/blob/develop/script/config-center/config.txt
把这里面的内容复制过来,修改其中的部分内容,并配置到seataServer.properties中:
#For details about configuration items, see https://seata.io/zh-cn/docs/user/configurations.html
#Transport configuration, for client and server
transport.type=TCP
transport.server=NIO
transport.heartbeat=true
transport.enableTmClientBatchSendRequest=false
transport.enableRmClientBatchSendRequest=true
transport.enableTcServerBatchSendResponse=false
transport.rpcRmRequestTimeout=30000
transport.rpcTmRequestTimeout=30000
transport.rpcTcRequestTimeout=30000
transport.threadFactory.bossThreadPrefix=NettyBoss
transport.threadFactory.workerThreadPrefix=NettyServerNIOWorker
transport.threadFactory.serverExecutorThreadPrefix=NettyServerBizHandler
transport.threadFactory.shareBossWorker=false
transport.threadFactory.clientSelectorThreadPrefix=NettyClientSelector
transport.threadFactory.clientSelectorThreadSize=1
transport.threadFactory.clientWorkerThreadPrefix=NettyClientWorkerThread
transport.threadFactory.bossThreadSize=1
transport.threadFactory.workerThreadSize=default
transport.shutdown.wait=3
transport.serialization=seata
transport.compressor=none
#Transaction routing rules configuration, only for the client
service.vgroupMapping.default_tx_group=default
#If you use a registry, you can ignore it
service.default.grouplist=127.0.0.1:8091
service.enableDegrade=false
service.disableGlobalTransaction=false
#Transaction rule configuration, only for the client
client.rm.asyncCommitBufferLimit=10000
client.rm.lock.retryInterval=10
client.rm.lock.retryTimes=30
client.rm.lock.retryPolicyBranchRollbackOnConflict=true
client.rm.reportRetryCount=5
client.rm.tableMetaCheckEnable=true
client.rm.tableMetaCheckerInterval=60000
client.rm.sqlParserType=druid
client.rm.reportSuccessEnable=false
client.rm.sagaBranchRegisterEnable=false
client.rm.sagaJsonParser=fastjson
client.rm.tccActionInterceptorOrder=-2147482648
client.tm.commitRetryCount=5
client.tm.rollbackRetryCount=5
client.tm.defaultGlobalTransactionTimeout=60000
client.tm.degradeCheck=false
client.tm.degradeCheckAllowTimes=10
client.tm.degradeCheckPeriod=2000
client.tm.interceptorOrder=-2147482648
client.undo.dataValidation=true
client.undo.logSerialization=jackson
client.undo.onlyCareUpdateColumns=true
server.undo.logSaveDays=7
server.undo.logDeletePeriod=86400000
client.undo.logTable=undo_log
client.undo.compress.enable=true
client.undo.compress.type=zip
client.undo.compress.threshold=64k
#For TCC transaction mode
tcc.fence.logTableName=tcc_fence_log
tcc.fence.cleanPeriod=1h
#Log rule configuration, for client and server
log.exceptionRate=100
#Transaction storage configuration, only for the server. The file, db, and redis configuration values are optional.
store.mode=db
store.lock.mode=db
store.session.mode=db
#Used for password encryption
store.publicKey=
#These configurations are required if the `store mode` is `db`. If `store.mode,store.lock.mode,store.session.mode` are not equal to `db`, you can remove the configuration block.
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.jdbc.Driver
store.db.url=jdbc:mysql://rm-xxxxx:3306/seata?useUnicode=true&rewriteBatchedStatements=true
store.db.user=nfturbo
store.db.password=NFTurbo666
store.db.minConn=5
store.db.maxConn=30
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.distributedLockTable=distributed_lock
store.db.queryLimit=100
store.db.lockTable=lock_table
store.db.maxWait=5000
#Transaction rule configuration, only for the server
server.recovery.committingRetryPeriod=1000
server.recovery.asynCommittingRetryPeriod=1000
server.recovery.rollbackingRetryPeriod=1000
server.recovery.timeoutRetryPeriod=1000
server.maxCommitRetryTimeout=-1
server.maxRollbackRetryTimeout=-1
server.rollbackRetryTimeoutUnlockEnable=false
server.distributedLockExpireTime=10000
server.xaerNotaRetryTimeout=60000
server.session.branchAsyncQueueSize=5000
server.session.enableBranchAsyncRemove=false
server.enableParallelRequestHandle=false
#Metrics configuration, only for the server
metrics.enabled=false
metrics.registryType=compact
metrics.exporterList=prometheus
metrics.exporterPrometheusPort=9898其中需要修改的部分如下,然后保存即可。
store.db.url=jdbc:mysql://rm-xxxxx:3306/seata?useUnicode=true&rewriteBatchedStatements=true
store.db.user=nfturbo
store.db.password=NFTurbo666
# 修改为你自己的配置4、创建数据库及表结构
在你第三步中指定的那个数据库实例中创建一个库名为seata的数据库,然后执行https://github.com/apache/incubator-seata/blob/develop/script/server/db/mysql.sql 文件中的SQL内容:
-- -------------------------------- 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);5、启动Seata服务端
到机器上,先手动创建一个目录:/root/logs/seata/,然后到seata/bin目录下,执行:sh seata-server.sh -h 111.11.11.11 命令。通过-h指定本地的ip, 111.11.11.11记得换成你自己的ip
然后创建一个目录:/root/logs/seata/ 用于打印日志。
接下来,打开你的机器的7091和8091端口,通过7091端口可以访问你的seata的管理控制台,输入用户名(默认seata)、密码(默认seata),即可进入控制台
同时在nacos上能看到有一个seata的服务注册上去了:

xxl-job安装
1、创建xxl-job文件夹
mkdir xxl-job2、进入xxljob文件夹中创建一个docker-compose.yml文件
cd xxljob
vi docker-compose.yml3、在docker-compose.yml中加入以下内容
version: '3'
services:
xxl-job:
image: xuxueli/xxl-job-admin:3.2.0
container_name: xxl-job
environment:
PARAMS: "--spring.datasource.url=jdbc:mysql://192.168.200.104:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai --spring.datasource.username=root --spring.datasource.password=root"
ports:
- 8888:8080 #(宿主机端口:容器端口)
volumes:
- /data/docker/xxl-job/logs/:/data/applogs/xxl-job/ip换成你自己的ip,同时需要在数据库新建一个名为xxl-job名称的数据库,字符集为utf8mb4;
tables_xxl_job.sql 执行这个sql文件;
路径为 ip:端口/xxl-job-admin/ 如:127.0.0.1:8080/xxl-job-admin
我这里端口改成8888是因为我还运行了jenkins。
进入页面 默认账号:admin 密码:123456
