docker-compose安装seata

docker-compose安装seata

整体结构:

seata-docker/ ├── Dockerfile # Seata服务镜像构建 ├── application.yml # Seata服务配置(注册nacos、db存储) ├── docker-compose.yml └── sql/ └── seata_init.sql # TC全局事务表初始化SQL

1. 编写 Dockerfile(seata 服务镜像)

# 基础镜像 seata 1.6.1 FROM seataio/seata-server:1.6.1 # 复制自定义配置文件到容器配置目录 COPY application.yml /seata/conf/application.yml # 暴露Seata默认端口 EXPOSE 8091

2. 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: 30

3. 初始化 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: bridge

5. 启动与验证步骤

5.1 目录结构确认

seata-docker/ ├── Dockerfile ├── application.yml ├── docker-compose.yml └── sql/ └── seata_init.sql

5.2 一键启动

# 后台启动 docker-compose up -d # 查看日志(观察seata是否成功注册nacos、连接mysql) docker-compose logs -f seata-server

5.3 验证成功标志

  1. 打开 Nacos 控制台http://localhost:8848/nacos,服务列表出现seata-server
  2. MySQL 数据库自动创建seata_server库,包含 global_table /branch_table/lock_table;
  3. 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:8848

7. 常用操作命令

# 停止服务 docker-compose down # 停止并清空数据卷(重置所有数据) docker-compose down -v # 重新构建seata镜像并启动 docker-compose up -d --build

补充说明

  1. 版本可替换:seataio/seata-server:1.7.1nacos 2.3.2
  2. 密码、端口、nacos namespace、mysql 库名可自行修改;
  3. 业务库必须手动执行undo_log建表语句(仅 TC 库由 docker 自动初始化);
  4. 容器内部服务互通使用服务名nacos/mysql,宿主机客户端使用127.0.0.1