整体结构:
seata-docker/ ├── Dockerfile # Seata服务镜像构建 ├── application.yml # Seata服务配置(注册nacos、db存储) ├── docker-compose.yml └── sql/ └── seata_init.sql # TC全局事务表初始化SQL1. 编写 Dockerfile(seata 服务镜像)
# 基础镜像 seata 1.6.1 FROM seataio/seata-server:1.6.1 # 复制自定义配置文件到容器配置目录 COPY application.yml /seata/conf/application.yml # 暴露Seata默认端口 EXPOSE 80912. Seata 服务配置文件 application.yml
server: port: 8091 seata: # 注册中心 nacos registry: type: nacos nacos: server-addr: nacos:8848 namespace: public group: SEATA_GROUP application: seata-server # 配置中心 nacos config: type: nacos nacos: server-addr: nacos:8848 namespace: public group: SEATA_GROUP # 存储模式 db(mysql) store: mode: db db: datasource: druid db-type: mysql driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://mysql:3306/seata_server?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false user: root password: root123456 min-conn: 5 max-conn: 303. 初始化 SQL seata_init.sql
CREATE DATABASE IF NOT EXISTS seata_server DEFAULT CHARACTER SET utf8mb4; USE seata_server; -- 全局事务表 CREATE TABLE IF NOT EXISTS `global_table` ( `xid` varchar(128) NOT NULL COMMENT '全局事务ID', `transaction_id` bigint DEFAULT NULL, `status` tinyint NOT NULL COMMENT '事务状态', `application_id` varchar(32) DEFAULT NULL, `transaction_service_group` varchar(32) DEFAULT NULL, `transaction_name` varchar(128) DEFAULT NULL, `timeout` int DEFAULT NULL, `begin_time` bigint DEFAULT NULL, `commit_time` bigint DEFAULT NULL, `rollback_time` bigint DEFAULT NULL, PRIMARY KEY (`xid`), KEY `idx_status` (`status`), KEY `idx_transaction_service_group` (`transaction_service_group`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 分支事务表 CREATE TABLE IF NOT EXISTS `branch_table` ( `branch_id` bigint NOT NULL, `xid` varchar(128) NOT NULL, `transaction_id` bigint DEFAULT NULL, `resource_group_id` varchar(32) DEFAULT NULL, `resource_id` varchar(256) DEFAULT NULL, `branch_type` varchar(8) DEFAULT NULL, `status` tinyint DEFAULT NULL, `client_id` varchar(64) DEFAULT NULL, `application_data` varchar(2000) DEFAULT NULL, `create_time` bigint DEFAULT NULL, `update_time` bigint DEFAULT NULL, PRIMARY KEY (`branch_id`), KEY `idx_xid` (`xid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 锁表 CREATE TABLE IF NOT EXISTS `lock_table` ( `row_key` varchar(128) NOT NULL, `xid` varchar(96) DEFAULT NULL, `transaction_id` bigint DEFAULT NULL, `branch_id` bigint NOT NULL, `resource_id` varchar(256) DEFAULT NULL, `table_name` varchar(32) DEFAULT NULL, `pk` varchar(36) DEFAULT NULL, `gmt_create` datetime DEFAULT NULL, `gmt_modified` datetime DEFAULT NULL, PRIMARY KEY (`row_key`), KEY `idx_xid` (`xid`), KEY `idx_branch_id` (`branch_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;4. docker-compose.yml(整合 mysql + nacos + seata)
version: '3.8' services: # Mysql 存储seata事务表 mysql: image: mysql:8.0 container_name: seata-mysql restart: always environment: MYSQL_ROOT_PASSWORD: root123456 volumes: - ./sql/seata_init.sql:/docker-entrypoint-initdb.d/seata_init.sql - mysql-data:/var/lib/mysql ports: - "3306:3306" networks: seata-net: aliases: - mysql # Nacos 注册配置中心 nacos: image: nacos/nacos-server:2.2.3 container_name: seata-nacos restart: always environment: MODE: standalone ports: - "8848:8848" - "9848:9848" volumes: - nacos-data:/home/nacos/data networks: seata-net: aliases: - nacos # Seata TC 协调服务(基于本地Dockerfile构建) seata-server: build: context: ./ dockerfile: Dockerfile container_name: seata-server restart: always ports: - "8091:8091" depends_on: - mysql - nacos networks: seata-net: aliases: - seata-server volumes: mysql-data: nacos-data: networks: seata-net: driver: bridge5. 启动与验证步骤
5.1 目录结构确认
seata-docker/ ├── Dockerfile ├── application.yml ├── docker-compose.yml └── sql/ └── seata_init.sql5.2 一键启动
# 后台启动 docker-compose up -d # 查看日志(观察seata是否成功注册nacos、连接mysql) docker-compose logs -f seata-server5.3 验证成功标志
- 打开 Nacos 控制台
http://localhost:8848/nacos,服务列表出现seata-server; - MySQL 数据库自动创建
seata_server库,包含 global_table /branch_table/lock_table; - seata 日志无报错,正常监听 8091 端口。
6. 微服务客户端配置(SpringCloud Alibaba)
业务项目application.yml连接容器内 Seata
spring: cloud: alibaba: seata: tx-service-group: my_tx_group seata: registry: type: nacos nacos: server-addr: 127.0.0.1:8848 config: type: nacos nacos: server-addr: 127.0.0.1:88487. 常用操作命令
# 停止服务 docker-compose down # 停止并清空数据卷(重置所有数据) docker-compose down -v # 重新构建seata镜像并启动 docker-compose up -d --build补充说明
- 版本可替换:
seataio/seata-server:1.7.1、nacos 2.3.2; - 密码、端口、nacos namespace、mysql 库名可自行修改;
- 业务库必须手动执行
undo_log建表语句(仅 TC 库由 docker 自动初始化); - 容器内部服务互通使用服务名
nacos/mysql,宿主机客户端使用127.0.0.1。