最新版本组件的docker下载-Seata

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • [7. Seata](#7. Seata)
    • [7.1 修改配置](#7.1 修改配置)
    • [7.2 mysql和nacos容器ip问题](#7.2 mysql和nacos容器ip问题)
    • [7.3 nacos上seata的ip为容器ip问题](#7.3 nacos上seata的ip为容器ip问题)
    • [7.4 绑定数据库问题](#7.4 绑定数据库问题)
      • [7.4.1 nacos配置优先性](#7.4.1 nacos配置优先性)
      • [7.4.2 数据库驱动问题](#7.4.2 数据库驱动问题)
      • [7.4.3 无线局域网适配器 WLAN的ip一直变化问题](#7.4.3 无线局域网适配器 WLAN的ip一直变化问题)
      • [7.4.4 总结](#7.4.4 总结)
  • 总结

前言

7. Seata

7.1 修改配置

hub.docker中的apache/seata版本查询

seata的docker部署

java 复制代码
docker pull apache/seata-server:2.2.0
java 复制代码
docker run -d --name my-seata -p 8091:8091 -p 7091:7091 apache/seata-server:2.2.0

找到/seata-server/resources

下的application.yml

然后仿照我的博客springcloud2-seata2来修改配置文件

java 复制代码
seata:
  config:
    # support: nacos, consul, apollo, zk, etcd3
    type: file
  registry:
    # support: nacos, eureka, redis, zk, consul, etcd3, sofa
    type: file
  store:
    # support: file 、 db 、 redis 、 raft
    mode: file

修改为

java 复制代码
seata:
  config:
    # support: nacos, consul, apollo, zk, etcd3
    type: nacos
    nacos:
      server-addr: 127.0.0.1:8848
      namespace:
      group: SEATA_GROUP
  registry:
    # support: nacos, eureka, redis, zk, consul, etcd3, sofa
    type: nacos
    nacos:
      application: seata-server
      server-addr: 127.0.0.1:8848
      group: SEATA_GROUP
  store:
    # support: file 、 db 、 redis 、 raft
    mode: db
    db:
      datasource: druid
      db-type: mysql
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://127.0.0.1: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
      vgroup-table: vgroup_table
      query-limit: 1000
      max-wait: 5000

7.2 mysql和nacos容器ip问题

这样就绑定好了本地的nacos的注册中心配置中心和mysql了

但是这样还是不行

为什么呢

因为

你配置127.0.0.1 是容器 的ip 容器是网络隔离的 ,访问127.0.0.1访问的是myseata这个容器,你访问mysql 要用mysql容器的ip地址,所以配置nacos的ip也是同样的道理

怎么查找mysql容器的ip呢

java 复制代码
docker inspect mysql8.0

可以使用这个命令

IPAddress就是内网地址ip

也可以进入容器,查看Inspect

然后找到IPAddress

java 复制代码
seata:
  config:
    # support: nacos, consul, apollo, zk, etcd3
    type: nacos
    nacos:
      server-addr: 172.17.0.3:8848
      namespace:
      group: SEATA_GROUP
  registry:
    # support: nacos, eureka, redis, zk, consul, etcd3, sofa
    type: nacos
    nacos:
      application: seata-server
      server-addr: 172.17.0.3:8848
      group: SEATA_GROUP
  store:
    # support: file 、 db 、 redis 、 raft
    mode: db
    db:
      datasource: druid
      db-type: mysql
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://172.17.0.2: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
      vgroup-table: vgroup_table
      query-limit: 1000
      max-wait: 5000

修改为这样就可以了

但是这样还是不好

为什么呢

因为这个172.17.0.2这个ip是根据容器的启动顺序来决定的

你是第一个启动的容器,那么你这个容器的内网ip就是172.17.0.2,然后依次内推

你是第二个启动的容器,那么你这个容器的内网ip就是172.17.0.3

那么172.17.0.1是什么呢

172.17.0.1 确实是 Docker 默认桥接网络(docker0)中容器的默认网关,同时也是宿主机在该桥接网络中的 IP 地址

所以说172.17.0.1 既是容器的网关,也是宿主机的内网ip地址,也就是我们WIndows的ip地址

所以我们可以直接配置172.17.0.1 :8848,就是访问的WIndows的8848,由于WIndows的8848映射到了容器nacos的8848,所以配置172.17.0.1 :8848,就是配置的WIndows的172.17.0.1 :8848,就是配置的nacos容器的8848,就是配置的172.17.0.3:8848

java 复制代码
seata:
  config:
    # support: nacos, consul, apollo, zk, etcd3
    type: nacos
    nacos:
      server-addr: 172.17.0.1:8848
      namespace:
      group: SEATA_GROUP
  registry:
    # support: nacos, eureka, redis, zk, consul, etcd3, sofa
    type: nacos
    nacos:
      application: seata-server
      server-addr: 172.17.0.1:8848
      group: SEATA_GROUP
  store:
    # support: file 、 db 、 redis 、 raft
    mode: db
    db:
      datasource: druid
      db-type: mysql
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://172.17.0.1: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
      vgroup-table: vgroup_table
      query-limit: 1000
      max-wait: 5000
java 复制代码
seata:
  transport:
    max-frame-size: 16777216

可以配置一下防止可能得报错

seata.transport.max-frame-size: 16777216 用于设置 Seata 通信传输时的最大帧大小

访问http://127.0.0.1:7091/的登录页面

有显示就成功


7.3 nacos上seata的ip为容器ip问题

但是我们这样还有一个问题,问题就是

seata注册到nacos上的ip是172.17.0.4,这个是容器的ip

在 Windows 上默认情况下无法直接访问 Docker 容器的 172.17.0.4 这类内网 IP

意思就是172.17.0.4是受网关172.17.0.1保护的ip,正常的我们宿主机WIndows上的程序都是无法访问172.17.0.4的,连172.17.0.1这个网关都不能访问,只能通过127.0.0.1的端口映射(172.17.0.4经过了端口映射)

Docker 在 Windows 上采用 NAT 桥接网络,容器的 172.17.0.0/16 网段是 Docker 内部的虚拟网络,Windows 宿主机无法直接路由到该网段

怎么办呢

可以在一开始的启动命令docker run中指定

java 复制代码
-e SEATA_IP=10.252.115.15

指定这个就可以了,10.252.115.15这个就是WIndows宿主机的地址,怎么获取呢,可以通过ipconfig来获取

可以选择无线局域网适配器 WLAN:的ipv4

java 复制代码
docker run -d --name my-seata3 -p 8091:8091 -p 7091:7091 -e SEATA_IP=10.252.115.15 apache/seata-server:2.2.0

这个的运行结果我们后面来展示

7.4 绑定数据库问题

可以看到,虽然我们设置了store:model:db

但是截屏最后两行日志显示的还是file模式

为什么呢

7.4.1 nacos配置优先性

因为我们的配置中心是nacos

当 Seata 的配置中心设置为 Nacos 时,store.mode=db 这类核心配置必须放在 Nacos 上,否则 Seata 服务端无法正确加载该配置。

具体原因:

配置中心的优先级当 Seata 配置中心指定为 Nacos(即 config.type=nacos)时,Seata 服务端会优先从 Nacos 拉取所有配置,本地配置文件(如 application.yml、file.conf)中的对应配置会被 Nacos 中的配置覆盖(除非特别指定了本地配置的优先级,但这不符合常规用法)。

store.mode 的核心性store.mode 是 Seata 服务端运行的核心配置(决定事务日志的存储方式),如果仅在本地配置文件中设置而不在 Nacos 中配置,Seata 启动时会读取 Nacos 中默认的 store.mode(可能为 file 等非预期值),导致配置不生效。

所以就会读取nacos中的默认值store.mode:file,虽然我们没有配置nacos配置

所以还是要配置nacos啊

nacos中的配置

java 复制代码
store:
  mode: db
  db:
    datasource: druid
    db-type: mysql
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://172.17.0.1: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
    vgroup-table: vgroup_table
    query-limit: 1000
    max-wait: 5000

为什么是这样呢,为什么本地配置有一个seata前缀,但是nacos上面却没有

本质:配置解析的 "上下文" 不同

本地配置中,seata: 是外部上下文(用于告诉解析器 "这部分属于 Seata")。

Nacos 配置中,由于配置集本身已通过 Data ID 和 Group 绑定到 Seata,因此 seata: 这个外部上下文变得多余,解析器会直接将配置内容作为 Seata 的内部上下文处理。

因为本地上面不止是seata的配置,还有console,spring,等等的配置,而在nacos上就只能配置seata的配置,意思就是说seataServer.yaml里面的东西都是属于seata配置的

dataId为seataServer.yaml

java 复制代码
seata:
  config:
    # support: nacos, consul, apollo, zk, etcd3
    type: nacos
    nacos:
      server-addr: 172.17.0.1:8848
      namespace: public
      group: SEATA_GROUP
      data-id: seataServer.yaml
  registry:
    # support: nacos, eureka, redis, zk, consul, etcd3, sofa
    type: nacos
    nacos:
      application: seata-server
      server-addr: 172.17.0.1:8848
      group: SEATA_GROUP

然后是本地的配置,这里就要配置data-id了,不然找不到

然后报错了

看报错

报错说明我们nacos上面的配置生效了

明明配置了db-type,但是却找不到dbType,

  1. 本地配置(如 application.yml)的 "兼容处理"
    在本地配置文件(尤其是 Spring Boot 环境下的 application.yml)中,Seata 可能借助借助 Spring Boot 的配置解析机制,自动兼容 "短横线命名"(kebab-case)和 "驼峰命名"(camelCase)。
    Spring Boot 会自动将配置文件中的 db-type 转换为 dbType(因为 Spring 的 @ConfigurationProperties 注解默认支持这种转换)。
    例如,你在本地配置写 db-type: mysql,Spring 会将其映射到代码中的 dbType 属性,因此 Seata 能正确识别。
  2. Nacos 配置的 "严格解析"
    当使用 Nacos 作为配置中心时,Seata 读取配置的逻辑与本地配置不同:
    Seata 会直接从 Nacos 拉取原始配置内容(字符串),并按自身的解析逻辑处理键名,而不经过 Spring Boot 的 @ConfigurationProperties 转换。
    Seata 内部代码中,获取数据库类型的逻辑是直接查找 store.db.dbType 这个键(硬编码的驼峰命名),不会自动转换短横线命名的 db-type。

所以说nacos上面不认识-的配置形式,还要改一下,该的话很简单,只需要去掉-,然后把-后面的字母改为大写就可以了

java 复制代码
store:
  mode: db
  db:
    datasource: druid
    dbType: mysql
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://172.17.0.1:3306/seata?rewriteBatchedStatements=true
    user: root
    password: 123456
    minConn: 10
    maxConn: 100
    globalTable: global_table
    branchTable: branch_table
    lockTable: lock_table
    distributedLockTable: distributed_lock
    vgroupTable: vgroup_table
    queryLimit: 1000
    maxWait: 5000

7.4.2 数据库驱动问题

然后又报错了

看报错应该是找不到数据库的驱动了

看报错,在/lib/jdbc找不到数据库的驱动

怎么搞一个mysql驱动呢

用everything软件来寻找

搜素mysql-connector

比如这些就是mysql的驱动

怎么把WIndows上面的文件移动到容器里面呢

可以使用docker cp命令

java 复制代码
docker cp ./mysql-connector-j-8.2.0.jar my-seata:/lib/jdbc/mysql-connector-j-8.2.0.jar

显示Successfully 就可以了

记得创建jdbc文件夹

但是它还是说找不到驱动

我们去查看一下启动脚本

/seata-server-entrypoint.sh这通常是容器化部署中 Seata 的入口启动脚本(类似 Docker 镜像中的启动入口),负责初始化环境并启动 Seata Server。

就在根目录下

我们查看一下启动脚本

最终的启动命令是那个java -cp

seata-server-entrypoint.sh 的内容来看,这确实是 Seata 的启动入口脚本,主要作用是:

先执行 /seata-setup.sh 脚本(通常用于初始化环境变量、配置参数等前置操作)。

处理 JVM 参数(JAVA_OPT),替换其中的路径分隔符。

最终通过 exec java 命令启动 Seata 服务,其中:

$(cat /seata-server/jib-classpath-file) 读取类路径配置。

$(cat /seata-server/jib-main-class-file) 读取主类(Seata 服务的入口类)。

数据库驱动的存放位置需要满足 Seata 启动时的类路径(classpath)配置

所以我们数据库的驱动应该放在/seata-server/jib-classpath-file指定的位置

/seata-server/jib-classpath-file是类路径配置

可以读取一下

java 复制代码
# cat  /seata-server/jib-classpath-file
/seata-server/resources:/seata-server/classes:/seata-server/libs/*# 

所以说类路径就是这三个路径

那么数据库驱动也是只放在这三个位置了,日志可能是有错误的,日志不对,被日志误导了

java 复制代码
docker cp ./mysql-connector-j-8.2.0.jar my-seata3:/seata-server/libs/mysql-connector-j-8.2.0.jar

所以说这样就可以了

为什么说被日志误导了呢

第一点就是因为显示的日志/lib/jdbc这个路径根本不存在

第二就是放入驱动到这个里面还是不行

然后我们点入/seata-server/libs/,发现这里才是真正放入mysql驱动等jar包的地方

这个就是我们刚刚放入的,我们发现seata根本就没有mysql驱动

所以需要我们手动放入

/seata-server/resources:/seata-server/classes:/seata-server/libs/*# 为什么这三个偏偏选择/seata-server/libs/呢,因为可以自己去看一下,另外两个路径下面根本就没有放jar包,所以放在那些地方不合适,只有/seata-server/libs/才存着很多驱动,比如nacos的

但是又报错了

发现password为null

说明没有读取到

但是我们nacos明明配置了的

  1. 配置文件的语法规则(YAML/Properties 格式)
    你提供的配置是 YAML 格式(从缩进和 key: value 结构可判断),而 YAML 对字符串的解析有特定规则:
    当值中包含特殊字符(如空格、冒号、数字开头等)时,必须用双引号或单引号包裹,否则可能被解析为非字符串类型(如数字、布尔值等)。
    即使值是纯数字(如 123456),在某些解析器中可能被默认当作数字类型处理,但数据库密码本质是字符串(可能包含字母、符号等),强制用引号包裹可明确指定为字符串类型,避免解析歧义。
  2. 为什么不加引号会失败?
    若密码是纯数字(如 123456),YAML 解析器可能将其识别为 整数类型,而 Seata 在读取配置时,若期望的是字符串类型的密码,整数类型可能导致解析异常(例如被忽略、截断或格式错误),最终导致 Seata 实际使用空密码(using password: NO)。
    加上双引号后,明确告诉解析器:"123456" 是字符串类型,Seata 能正确读取并传递给数据库连接,因此密码生效。

所以说纯数字的密码,在yaml中一定要加上引号

不然可能会出错

java 复制代码
store:
  mode: db
  db:
    datasource: druid
    dbType: mysql
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://172.17.0.1:3306/seata?useUnicode=true&characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&rewriteBatchedStatements=true
    user: root
    password: "123456"
    minConn: 10
    maxConn: 100
    globalTable: global_table
    branchTable: branch_table
    lockTable: lock_table
    distributedLockTable: distributed_lock
    vgroupTable: vgroup_table
    queryLimit: 1000
    maxWait: 5000

这样就成功了

然后注册服务的额ip也是修改为宿主机的ip了

7.4.3 无线局域网适配器 WLAN的ip一直变化问题

我们使用ipconfig的时候,会显示出无线局域网适配器 WLAN:的ipv4,我们就可以使用这个注册到nacos

但是呢

这个每次机器启动都会换一个ip

无线局域网(WLAN)的 IP 地址频繁变化,通常是因为开启了 DHCP 自动获取(路由器自动分配 IP),导致每次联网时 IP 可能变动,确实不方便用于固定服务访问

所以为 WLAN 配置 静态 IP 地址(推荐)

搜索设置

网络和Internet---》高级网络设置--》WLAN--->更多适配器选项---》双击「Internet 协议版本 4 (TCP/IPv4)」--->选择「使用下面的 IP 地址」

IP 地址:选择一个与当前网段(你的 WLAN 网段是 10.252.120.x)不冲突的地址(例如 10.252.120.131,确保该 IP 未被其他设备占用)。

子网掩码:与当前一致(255.255.224.0)。

默认网关:与当前一致(10.252.96.1)。

选择「使用下面的 DNS 服务器地址」,可填写公共 DNS(如 114.114.114.114 或 8.8.8.8)。

但是我这里不改,我怕搞坏了

还有一种方法就是使用其他的ip

比如使用ipconfig后的

以太网适配器 VMware Network Adapter VMnet8:中的ipv4

因为即使与 VMware 完全无关,仍然可以将 192.168.26.4 配置到 Nacos 中作为宿主机的 IP,且宿主机上的服务也能通过这个 IP 访问本地资源。

192.168.26.4 是宿主机的有效 IP,与 VMware 是否使用无关

即使与 VMware 无关,192.168.26.4 仍可作为宿主机 IP 配置到 Nacos,且宿主机上的服务能通过该 IP 正常通信。核心是确保该网卡启用、服务监听正确的接口,无需依赖 VMware 的实际使用。如果仅用于宿主机内部服务交互,这是完全可行的。

所以我们可以使用192.168.26.4

7.4.4 总结

nacos配置

java 复制代码
store:
  mode: db
  db:
    datasource: druid
    dbType: mysql
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://172.17.0.1:3306/seata?useUnicode=true&characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&rewriteBatchedStatements=true
    user: root
    password: "123456"
    minConn: 10
    maxConn: 100
    globalTable: global_table
    branchTable: branch_table
    lockTable: lock_table
    distributedLockTable: distributed_lock
    vgroupTable: vgroup_table
    queryLimit: 1000
    maxWait: 5000

seataServer.yaml的

java 复制代码
store.mode=db
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.jdbc.Driver
store.db.url=jdbc:mysql://172.17.0.1:3306/seata?useUnicode=true&characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&rewriteBatchedStatements=true
store.db.user=root
store.db.password=123456
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

seataServer.properties的

java 复制代码
docker run  -itd --name my-seata -e SEATA_IP=192.168.26.4 -p 7091:7091 -p 8091:8091 -v ./application.yml:/seata-server/resources/application.yml -v ./mysql-connector-j-8.2.0.jar:/seata-server/libs/mysql-connector-j-8.2.0.jar apache/seata-server:2.2.0

这里指定SEATA_IP=192.168.26.4,那么注册到nacos,因为我在本地启动的客户端,在nacos上获取到seata的ip是192.168.26.4.也是正确的,因为进行了端口映射的

然后是docker启动命令

不能配置SEATA_IP=127.0.0.1,因为对于这个容器来说,如果这样配置,其实就会转换为172.17.0.4这种容器内网ip了,所以不能这样

我们使用挂载卷的方式,本地映射到容器中

使用 -v ./application.yml:/seata-server/resources/application.yml 挂载本地配置文件后,本地文件修改会同步到容器内,但是要重启容器才会生效

这是本地弄好的配置和mysql驱动

java 复制代码
seata:
  config:
    # support: nacos, consul, apollo, zk, etcd3
    type: nacos
    nacos:
      server-addr: 172.17.0.1:8848
      namespace: public
      group: SEATA_GROUP
      data-id: seataServer.yaml
  registry:
    # support: nacos, eureka, redis, zk, consul, etcd3, sofa
    type: nacos
    nacos:
      application: seata-server
      server-addr: 172.17.0.1:8848
      group: SEATA_GROUP

这是application.yaml的


这样便是成功了

总结

相关推荐
不爱笑的良田9 小时前
从零开始的云原生之旅(十一):压测实战:验证弹性伸缩效果
云原生·容器·kubernetes·go·压力测试·k6
梁正雄9 小时前
15、Docker swarm-2-安装与存储
运维·docker·容器
fyakm10 小时前
Linux文件搜索:grep、find命令实战应用(附案例)
linux·运维·服务器
wanhengidc11 小时前
云手机存在的意义是什么
运维·服务器·arm开发·安全·智能手机
snow@li12 小时前
运维:部署Jenkins
运维·jenkins
Wang's Blog14 小时前
Nestjs框架: 微服务容器化部署与网络通信解决方案
docker·微服务·云原生·架构·nestjs
脚踏实地的大梦想家14 小时前
【Docker】P2 Docker 命令:从Nginx部署到镜像分享的全流程指南
java·nginx·docker
大海绵啤酒肚14 小时前
OpenStack虚拟化平台之T版搭建部署
linux·运维·云计算·openstack
极限实验室15 小时前
使用 Docker Compose 轻松实现 INFINI Console 离线部署与持久化管理
docker·devops