Apache Synapse 3.0.2 Docker Compose 部署指南
使用 Docker Compose 部署 Apache Synapse 3.0.2 的实测指南,提供自建镜像 Dockerfile 与编排文件样例,覆盖构建启动、端口映射、配置与日志持久化、JVM 堆固化、等价运行命令及运维排障。
Apache Synapse 3.0.2 Docker Compose 部署指南
一、环境信息
| 项目 | 值 |
|---|---|
| Docker Engine | 29.8.0(实测版本) |
| Docker Compose | v5.5.1(实测版本) |
| 组件版本 | Apache Synapse 3.0.2 |
| 基座镜像 | eclipse-temurin:8-jdk(OpenJDK 8,Synapse 3.0.x 仅完整支持 Java 1.8) |
| 端口 | 8280(HTTP)、8243(HTTPS)、1099(JMX) |
| 项目目录 | /opt/synapse-compose |
本文全部构建与运行步骤均在 Docker 29.8.0 环境实测通过。
二、镜像选型说明
- Docker Hub 上没有 Apache 官方发布的 Synapse 镜像,可靠方案是基于官方发行包自建镜像。
- 基座选用 eclipse-temurin:8-jdk:Synapse 3.0.2 的启动脚本携带
-Djava.endorsed.dirs参数,JDK 9 及以上版本会直接导致 JVM 创建失败,必须使用 JDK 8。 - 构建时内置官方 MD5 校验(652b62cede3439cbde9fd71fea66ad4e),并完成三件标准化处理:禁用无法在纯 64 位运行库环境执行的 32 位 wrapper 二进制、将 JVM 堆从脚本默认的 512M 固化为 -Xms256M -Xmx512M、预创建 logs 与 work 目录。
- 镜像内 Synapse 安装路径为 /opt/synapse-3.0.2,与物理机部署保持一致,便于配置复用。
三、前置条件
- Docker Engine 20.10+ 与 Docker Compose v2+ 已安装且可用:
docker version与docker compose version均正常返回。 - 主机可访问外网下载官方发行包(或已准备离线包与内部源)。
- 磁盘剩余空间不低于 3GB(基座镜像约 460MB,构建后总占用约 1GB)。
- 主机端口 8280、8243 未被占用:
ss -tlnp | grep -E '8280|8243'应无输出。
四、部署步骤
4.1 创建项目目录
mkdir -p /opt/synapse-compose/synapse-config
mkdir -p /opt/synapse-compose/synapse-logs
cd /opt/synapse-compose
4.2 编写 Dockerfile
cat > /opt/synapse-compose/Dockerfile <<'EOF'
FROM eclipse-temurin:8-jdk
RUN curl -SL --retry 3 -o /tmp/synapse.tar.gz https://downloads.apache.org/synapse/3.0.2/synapse-distribution-3.0.2-bin.tar.gz \
&& echo '652b62cede3439cbde9fd71fea66ad4e /tmp/synapse.tar.gz' | md5sum -c - \
&& tar -xzf /tmp/synapse.tar.gz -C /opt/ \
&& rm -f /tmp/synapse.tar.gz \
&& mv /opt/synapse-3.0.2/bin/native/wrapper-linux-x86-32 /opt/synapse-3.0.2/bin/native/wrapper-linux-x86-32.disabled \
&& sed -i 's/-Xms512M -Xmx512M/-Xms256M -Xmx512M/' /opt/synapse-3.0.2/bin/synapse.sh \
&& mkdir -p /opt/synapse-3.0.2/logs /opt/synapse-3.0.2/work/temp/synapse
ENV SYNAPSE_HOME=/opt/synapse-3.0.2 \
JAVA_HOME=/opt/java/openjdk
EXPOSE 8280 8243 1099
WORKDIR /opt/synapse-3.0.2
CMD ["/opt/synapse-3.0.2/bin/synapse.sh"]
EOF
构建层说明:MD5 校验保证发行包完整性;mv 禁用 32 位 wrapper(否则容器内同样报 wrapper-linux-x86-32 not found);sed 将 synapse.sh 硬编码的堆参数固化为 256-512MB(该脚本不读取 JAVA_OPTS 环境变量,只能在构建期修改)。
4.3 编写 docker-compose.yml
cat > /opt/synapse-compose/docker-compose.yml <<'EOF'
services:
synapse:
build: .
image: apache-synapse:3.0.2
container_name: synapse-esb
ports:
- '8280:8280'
- '8243:8243'
volumes:
- ./synapse-config:/opt/synapse-3.0.2/repository/conf/synapse-config
- ./synapse-logs:/opt/synapse-3.0.2/logs
restart: unless-stopped
EOF
4.4 准备中介配置
挂载目录会覆盖镜像内的默认配置,必须放入有效配置。最小可用回显代理(实测返回 HTTP 200):
cat > /opt/synapse-compose/synapse-config/synapse.xml <<'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://ws.apache.org/ns/synapse">
<proxy name="HelloProxy" transports="http https" startOnLoad="true">
<target>
<inSequence>
<log level="custom">
<property name="msg" value="HelloProxy received request"/>
</log>
<payloadFactory media-type="xml">
<format>
<ns:response xmlns:ns="http://example.org">ok-from-synapse</ns:response>
</format>
<args/>
</payloadFactory>
<property name="RESPONSE" value="true"/>
<header name="To" action="remove"/>
<send/>
</inSequence>
</target>
</proxy>
</definitions>
EOF
同时从镜像补齐默认的序列文件(避免 main/fault 序列缺失影响代理部署):
cd /opt/synapse-compose
docker build -t apache-synapse:3.0.2 .
docker create --name synapse-tmp apache-synapse:3.0.2
docker cp synapse-tmp:/opt/synapse-3.0.2/repository/conf/synapse-config/sequences synapse-config/
docker rm synapse-tmp
注意 synapse.xml 与 sequences/main.xml、sequences/fault.xml 不能重复定义同名序列,否则启动报 Duplicate sequence definition 后退出。
4.5 构建并启动
cd /opt/synapse-compose
docker compose up -d --build
实测回显:
Container synapse-esb Creating
Container synapse-esb Created
Container synapse-esb Starting
Container synapse-esb Started
4.6 验证部署
确认运行状态与端口映射:
docker compose ps
实测回显:
NAME IMAGE STATUS PORTS
synapse-esb apache-synapse:3.0.2 Up 37 seconds 0.0.0.0:8280->8280/tcp, 0.0.0.0:8243->8243/tcp, 1099/tcp
业务验证(回显代理):
curl -s -X POST -H 'Content-Type: text/xml; charset=UTF-8' \
-d '<?xml version="1.0"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><hi>hello</hi></soapenv:Body></soapenv:Envelope>' \
http://127.0.0.1:8280/services/HelloProxy
实测回显:
<ns:response xmlns:ns="http://example.org">ok-from-synapse</ns:response>
JVM 堆验证:
docker exec synapse-esb ps -ef | grep [j]ava | grep -o '\-Xms\S* \-Xmx\S*'
实测回显:
-Xms256M -Xmx512M
启动日志验证:
docker logs synapse-esb 2>&1 | grep -E 'started successfully|listener started'
实测回显:
INFO PassThroughHttpListener Pass-through HTTP listener started on port: 8280
INFO PassThroughHttpSSLListener Pass-through HTTPS listener started on port: 8243
INFO SynapseServer Apache Synapse started successfully
五、数据持久化说明
| 宿主目录 | 容器内路径 | 内容 |
|---|---|---|
| /opt/synapse-compose/synapse-config | /opt/synapse-3.0.2/repository/conf/synapse-config | 中介配置(代理、序列、端点) |
| /opt/synapse-compose/synapse-logs | /opt/synapse-3.0.2/logs | synapse.log、service.log、trace.log、http_access_日期.log |
实测挂载后日志文件正常落盘宿主目录;重建容器(down 后 up)不丢失日志与配置。axis2.xml、wrapper.conf 等其余配置仍在镜像内,如需持久化可按同样方式增加挂载行。需要备份时归档两个宿主目录即可。
六、常用环境变量表
| 环境变量 | 默认值 | 说明 |
|---|---|---|
| SYNAPSE_HOME | /opt/synapse-3.0.2 | Synapse 安装目录(镜像 ENV 已固化) |
| JAVA_HOME | /opt/java/openjdk | JDK 路径(基座镜像自带) |
| JAVA_OPTS | 不生效 | synapse.sh 不读取该变量,JVM 参数需改脚本,勿在 compose 中设置 |
注意:Synapse 启动脚本将 JVM 参数硬编码在脚本内,不消费任何 JAVA_OPTS 环境变量,调整堆大小必须修改 synapse.sh(本文通过 Dockerfile 构建期 sed 固化为 -Xms256M -Xmx512M)。
七、常用配置参数说明
| 参数 | 所在位置 | 默认值 | 说明 |
|---|---|---|---|
| HTTP 监听端口 | repository/conf/axis2.xml | 8280 | transportReceiver http port |
| HTTPS 监听端口 | repository/conf/axis2.xml | 8243 | transportReceiver https port |
| 服务路径前缀 | repository/conf/axis2.xml | /services | 代理访问 URL 必须带此前缀 |
| 堆参数(前台模式) | bin/synapse.sh | -Xms512M -Xmx512M(本文镜像固化为 256/512) | JVM 堆 |
| HTTP 超时 | repository/conf/passthru-http.properties | http.socket.timeout=180000 | 毫秒 |
| 传输线程池 | repository/conf/passthru-http.properties | core=400 / max=500 | 高并发可上调 |
| 日志级别 | lib/log4j.properties | org.apache.synapse=INFO | 排障可临时 DEBUG |
修改镜像内配置的推荐流程:改 Dockerfile(追加 RUN sed 或 COPY 覆盖文件)后 docker compose up -d --build 重建。
八、配置文件持久化
中介配置持久化(compose 已含):
volumes:
- ./synapse-config:/opt/synapse-3.0.2/repository/conf/synapse-config
如需持久化传输配置,在 volumes 中追加:
- ./conf/axis2.xml:/opt/synapse-3.0.2/repository/conf/axis2.xml
- ./conf/passthru-http.properties:/opt/synapse-3.0.2/repository/conf/passthru-http.properties
先将镜像内原始文件拷出再挂载,避免权限与格式问题:
docker cp synapse-esb:/opt/synapse-3.0.2/repository/conf/axis2.xml ./conf/
修改挂载的配置后执行 docker compose restart 生效(Synapse 无热加载)。
九、等价 docker run 运行方式
不使用 Compose 时等价命令:
docker run -d \
--name synapse-esb \
-p 8280:8280 \
-p 8243:8243 \
-v /opt/synapse-compose/synapse-config:/opt/synapse-3.0.2/repository/conf/synapse-config \
-v /opt/synapse-compose/synapse-logs:/opt/synapse-3.0.2/logs \
--restart unless-stopped \
apache-synapse:3.0.2
构建镜像(与 compose build 等价):
cd /opt/synapse-compose
docker build -t apache-synapse:3.0.2 .
十、常用运维命令
docker compose ps # 查看服务状态
docker compose logs -f synapse # 跟踪容器日志(启动输出)
docker compose restart # 重启(配置变更后生效)
docker compose down # 停止并移除(数据卷保留)
docker compose up -d # 再次启动
docker compose up -d --build # 配置或 Dockerfile 变更后重建
docker exec synapse-esb ps -ef | grep [j]ava # 查看进程与 JVM 参数
实测 down 再 up 循环后服务正常、回显代理仍返回 200。停止时优先用 docker compose stop(保留容器便于快速拉起),down 会删除容器与网络但保留宿主挂载数据。
十一、常见问题
Q1:构建时报 failed to resolve source metadata for docker.io/library/eclipse-temurin:8-jdk?
主机无法直连 Docker Hub。配置镜像加速地址或代理后重试;离线环境可在可达机器 docker pull eclipse-temurin:8-jdk && docker save -o temurin8.tar eclipse-temurin:8-jdk,目标机 docker load -i temurin8.tar 后再构建。
Q2:容器反复重启,日志报 Could not create the Java Virtual Machine?
基座镜像被换成了 JDK 9+。Synapse 3.0.2 脚本携带 -Djava.endorsed.dirs,必须使用 JDK 8 基座(eclipse-temurin:8-jdk),确认 Dockerfile FROM 行未被改动。
Q3:请求 8280 返回 202 空响应?
路径缺少 /services/ 前缀。正确地址 http://<host>:8280/services/<代理名>;同时确认挂载的 synapse-config 内有该代理定义且 compose 已 restart。
Q4:启动报 Duplicate sequence definition?
挂载目录中的 synapse.xml 与 sequences/main.xml、sequences/fault.xml 重复定义了同名序列。删除 synapse.xml 内的 main/fault 定义或将自定义序列改名。
Q5:修改了 compose 中的环境变量 JAVA_OPTS 但堆没变?
synapse.sh 不读取 JAVA_OPTS。堆参数在脚本内硬编码,需通过 Dockerfile 的 sed 修改(本文镜像已固化为 -Xms256M -Xmx512M),重建后用 docker exec synapse-esb ps -ef | grep [j]ava 验证。
Q6:日志目录为空?
启动前容器内需存在 logs 目录(本文 Dockerfile 已预创建);确认 compose 的 synapse-logs 挂载行未被注释,且宿主目录属主与容器内运行用户一致。
十二、参考链接
- 官方主页:https://synapse.apache.org/
- 官方下载页:https://synapse.apache.org/download.html
- 发行包归档:https://archive.apache.org/dist/synapse/
- Docker Compose 文档:https://docs.docker.com/compose/
- eclipse-temurin 镜像:https://hub.docker.com/_/eclipse-temurin