使用 Docker 安装 Seata 通常有两种主流方式:
1. 使用官方镜像(推荐,最简单):直接拉取 Seata-Server 镜像运行,并通过环境变量或挂载文件配置注册中心、配置中心。
2. 使用 Docker Compose(最常用,适合演示和开发):编写 docker-compose.yml 文件,一键部署 Seata-Server 及其依赖(如 Nacos)。
由于 Seata 需要依赖**注册中心**(如 Nacos, Eureka)和**配置中心**(如 Nacos, Apollo)才能正常工作,下面我将提供两种最常用的方案:**使用 Docker Compose 部署 Seata 与 Nacos** 和 单独使用 Docker 运行 Seata 并连接到现有中间件。
方案一:使用 Docker Compose 一键部署 Seata + Nacos (推荐用于开发测试)
这种方式最适合初学者和开发环境,它能一键拉起所有依赖。
步骤 1:创建目录并下载配置文件
-
创建一个工作目录,例如
seata-docker:mkdir seata-docker && cd seata-docker -
下载 Seata 的配置文件包(关键步骤!):
你需要从 Seata 的 GitHub Release 页面下载配置文件,并将其挂载到容器中。
```bash以 v1.8.0 版本为例,下载配置文件压缩包
wget https://github.com/seata/seata/releases/download/v1.8.0/seata-server-1.8.0.zip解压
unzip seata-server-1.8.0.zip
解压后你会得到一个
seata文件夹,里面包含conf目录。重命名或复制一份配置文件以备修改(可选但推荐)
cp -r seata/conf seata/conf-backup
```
步骤 2:修改 Seata 配置文件
Seata 需要知道如何连接 Nacos。我们需要修改 seata/conf/application.yml 文件。
-
编辑
application.yml:vim seata/conf/application.yml -
修改关键配置:找到
registry和config部分,将其类型改为nacos,并填写 Nacos 服务器的地址(因为我们将使用 Compose 在同一网络内启动 Nacos,所以可以用服务名nacos作为主机名)。seata: registry: type: nacos nacos: application: seata-server server-addr: nacos:8848 # 使用 Docker Compose 的服务名 namespace: "" group: SEATA_GROUP username: "nacos" password: "nacos" config: type: nacos nacos: server-addr: nacos:8848 # 使用 Docker Compose 的服务名 namespace: "" group: SEATA_GROUP username: "nacos" password: "nacos" data-id: seataServer.properties注意:
server-addr从localhost改为了nacos,这是 Docker Compose 的网络特性,容器间可以通过服务名通信。
步骤 3:编写 docker-compose.yml 文件
在工作目录 seata-docker 下创建 docker-compose.yml 文件。
version: "3.8"
services:
nacos:
image: nacos/nacos-server:v2.2.3 # 使用稳定版本
container_name: nacos-server
environment:
- MODE=standalone # 单机模式
- JVM_XMS=512m
- JVM_XMX=512m
ports:
- "8848:8848" # Nacos 控制台端口
- "9848:9848" # Nacos 2.0 新增的gRPC端口,必须暴露
volumes:
- nacos_data:/home/nacos/data
networks:
- seata-net
seata-server:
image: seataio/seata-server:1.8.0 # 使用与配置文件对应的版本
container_name: seata-server
ports:
- "8091:8091" # Seata 控制台端口
- "7091:7091" # Seata 服务端口
environment:
- SEATA_IP=你的宿主机IP # 重要!用于注册到Nacos的IP,如果是本地开发填192.168.x.x或宿主机IP,不能是127.0.0.1
- STORE_MODE=file # 存储模式,file为本地文件(仅测试用),生产需用db或redis
# 其他环境变量可根据需要添加
volumes:
- ./seata/conf:/seata-server/resources # 挂载上一步修改好的配置文件
- ./seata/logs:/root/logs/seata # 挂载日志
depends_on:
- nacos
networks:
- seata-net
volumes:
nacos_data:
networks:
seata-net:
driver: bridge
重要:请将 SEATA_IP 环境变量的值替换为你的**宿主机真实IP地址**(如 192.168.1.100),不能是 127.0.0.1。这是因为 Seata 需要将自己的服务地址(IP:Port)注册到 Nacos,其他微服务需要能通过这个地址访问到它。在 Docker 容器内,127.0.0.1 指向容器自身,外部无法访问。
步骤 4:启动服务
在 docker-compose.yml 所在目录执行:
docker-compose up -d
步骤 5:验证安装
- 访问 Nacos 控制台:
http://你的服务器IP:8848/nacos,默认账号/密码为nacos/nacos。- 在「服务管理」->「服务列表」中应能看到
seata-server服务,表示 Seata 已成功注册。
- 在「服务管理」->「服务列表」中应能看到
- 访问 Seata 控制台:
http://你的服务器IP:8091,默认账号/密码为seata/seata。 - 查看日志:
docker logs -f seata-server检查是否有错误日志。
方案二:单独使用 Docker 命令运行 Seata(连接现有中间件)
如果你已经有一个在运行的 Nacos(或其他注册/配置中心),可以单独启动 Seata 容器并连接它。
步骤 1:拉取镜像
docker pull seataio/seata-server:1.8.0
步骤 2:运行容器(以 Nacos 为例)
通过环境变量覆盖默认配置,指向你现有的 Nacos 服务器。
docker run -d --name seata-server \
-p 8091:8091 \
-p 7091:7091 \
-e SEATA_IP=你的宿主机IP \
-e SEATA_PORT=7091 \
-e SEATA_CONFIG_NAME=file:/root/seata-config/registry \
-e REGISTRY_TYPE=nacos \
-e REGISTRY_NACOS_APPLICATION=seata-server \
-e REGISTRY_NACOS_SERVER_ADDR=你的Nacos服务器IP:8848 \ # 例如 192.168.1.200:8848
-e REGISTRY_NACOS_NAMESPACE= \
-e REGISTRY_NACOS_GROUP=SEATA_GROUP \
-e REGISTRY_NACOS_USERNAME=nacos \
-e REGISTRY_NACOS_PASSWORD=nacos \
seataio/seata-server:1.8.0
说明:这种方式通过大量环境变量来配置 Seata,省去了挂载配置文件的麻烦,但灵活性不如方案一。你需要确保所有参数(如 Nacos 地址、命名空间、Group)都正确。
总结与注意事项
| 特性 | 方案一 (Docker Compose) | 方案二 (Docker Run) |
|---|---|---|
| 难度 | 中等 | 简单 |
| 依赖管理 | 自动(包含Nacos) | 手动(需已有中间件) |
| 配置灵活性 | 高(可挂载自定义配置文件) | 低(依赖环境变量) |
| 适用场景 | 开发、测试、演示 | 生产或已有环境 |
- 版本对齐:确保 Seata-Server 镜像版本、配置文件版本与你业务中使用的
seata-all或seata-spring-boot-starter客户端版本**一致**,这是避免很多奇怪问题的关键。 - 存储模式:上述示例使用的是
file模式,**数据不持久化,重启即丢失**。生产环境一定要配置db或redis模式,并修改相应配置(如数据库连接串)。 - 网络与IP:在 Docker 环境中,**IP地址**是最常见的坑。务必保证 Seata 注册到注册中心的IP是其他微服务**能够访问到**的地址。
- 端口:Seata 默认服务端口是
7091,用于 TC 与 TM/RM 的通信;控制台端口是8091。
对于大多数学习和开发场景,**强烈推荐使用方案一(Docker Compose)**,它更能帮助你理解 Seata 的完整工作流程。