前提条件と環境確認
本構成では、以下のミドルウェアが稼働している環境を前提とします。
- MySQL: 8.0以上
- Nacos: 2.2.3
最初に、ネットワーク設定を確認し、各コンテナおよびホストマシンのIPアドレスを特定します。場合によってはdocker network inspect bridgeですべてのコンテナ(MySQLなど)のIPが確認できないことがあるため、必要に応じてdocker inspect <container_id>を使用して詳細情報を取得してください。
# ネットワークブリッジの確認
docker network inspect bridge
# 特定コンテナのIP確認例
docker inspect <mysql_container_name> | grep IPAddress
確認が必要なIPアドレスは以下の通りです(以下は例です)。
- ホストマシンIP:
192.168.246.128 - NacosコンテナIP:
172.17.0.6 - MySQLコンテナIP:
172.17.0.3
これらのアドレスは後の手順で設定ファイルに記載するため、控えておいてください。
Dockerイメージの取得
Seata 2.0.0の公式イメージをプルします。
docker pull seataio/seata-server:2.0.0
データベースの初期化
MySQL内にseataという名前のデータベースを作成し、Seataが分散トランザクションを管理するためのテーブル定義を実行します。ストレージモードをデータベース('db')にする場合に必要なスキーマです。
-- グローバルセッションデータ用テーブル
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;
-- ブランチセッションデータ用テーブル
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;
-- ロックデータ用テーブル
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);
設定ファイル application.yml の作成
ホストマシンの任意のディレクトリ(例: /mydata/seata-server/resources)に設定ファイルを作成します。コンテナ起動時にこのディレクトリをボリュームマウントします。以下の内容は、Nacosを設定センター・レジストリとして、MySQLをストレージとして利用する場合の構成です。
ポイント: nacos.server-addr および db.url は、事前に確認したIPアドレス(172.17.0.x)に書き換えてください。
server:
port: 7091
spring:
application:
name: seata-server
console:
user:
username: seata
password: seata
seata:
config:
type: nacos
nacos:
server-addr: 172.17.0.6:8848
namespace:
group: DEFAULT_GROUP
username: nacos
password: nacos
registry:
type: nacos
nacos:
application: seata-server
server-addr: 172.17.0.6:8848
group: DEFAULT_GROUP
namespace:
cluster: default
username: nacos
password: nacos
store:
mode: db
db:
datasource: druid
db-type: mysql
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://172.17.0.3:3306/seata?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
user: root
password: root
min-conn: 10
max-conn: 100
global-table: global_table
branch-table: branch_table
lock-table: lock_table
distributed-lock-table: distributed_lock
query-limit: 1000
max-wait: 5000
security:
secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017
tokenValidityInMilliseconds: 1800000
ignore:
urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.jpeg,/**/*.ico,/api/v1/auth/login,/metadata/v1/**
コンテナの起動
設定ファイルをマウントし、環境変数SEATA_IPにホストマシンのIPアドレスを指定してコンテナを起動します。これにより、NacosやクライアントアプリケーションがSeataサーバーに正しく接続できるようになります。
docker run --name seata-server \
-itd \
-p 8091:8091 \
-p 7091:7091 \
-e SEATA_IP="192.168.246.128" \
-e SEATA_PORT=8091 \
-v "/mydata/seata-server/resources/application.yml:/seata-server/resources/application.yml" \
seataio/seata-server:2.0.0
※ SEATA_IPには、冒頭で確認したホストのIP(例: 192.168.246.128)を指定してください。Docker内部のIPではなく、外部からアクセス可能なIPである必要があります。
動作確認
- Seataコンソールへのアクセス
ブラウザでhttp://192.168.246.128:7091にアクセスします(デフォルトのユーザー名/パスワードは共にseata)。ログインできればコンテナ自体は正常に動作しています。 - Nacosへの登録確認
Nacosの管理コンソールにアクセスし、サービスリストを確認します。seata-serverが登録されており、そのIPアドレスがホストマシンのIP(192.168.246.128)になっていれば、設定およびネットワーク構成は成功です。