整体结构:
 

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

更多推荐