Apache OpenMeetings 9.1.0 Docker Compose 部署指南

Apache OpenMeetings 9.1.0 Docker Compose 部署指南,含自建镜像 Dockerfile、compose 编排、H2 数据持久化、初始化安装与等价 docker run 方式,实测通过(admin/Q1w2e3r4!)。

Apache OpenMeetingsApache OpenMeetings2026/10/12

Apache OpenMeetings 9.1.0 Docker Compose 部署指南

目标:用 Docker Compose 在 Ubuntu 22.04 上部署 Apache OpenMeetings 9.1.0(Web 会议与实时协作平台),实现数据持久化、一键启停与初始化验证。全文命令与回显在 Docker 29.8.1 + Compose v5.5.1 环境实测通过。

一、环境信息

  • 操作系统:Ubuntu 22.04.5 LTS(x86_64)
  • Docker:29.8.1;Docker Compose:v5.5.1(docker compose 子命令)
  • 镜像:openmeetings:9.1.0(基于 ubuntu:22.04 自建,内含 JDK 21.0.12.1 + OpenMeetings 9.1.0 + 内嵌 Tomcat 11.0.23)
  • 容器名:openmeetings
  • 端口映射:5080(HTTP)、5443(HTTPS)
  • 数据目录(宿主机):/opt/om-compose/{conf,data,db}
  • 管理账号:admin(本文统一示例口令 Q1w2e3r4!)

二、镜像选型说明

镜像来源说明
openmeetings:9.1.0(自建)本文 Dockerfile 构建ubuntu:22.04 + JDK 21 + 官方发行包,可完全掌控版本与 JVM 参数
apache/openmeetings社区/镜像站非 Apache 官方发布(官方只发布二进制包),版本与安全更新滞后,不推荐生产使用
  • 选择建议:官方不提供 Docker 镜像,本文给出自建方案,镜像内容与官方 9.1.0 二进制发行包一一对应,便于审计与安全升级。

三、前置条件

  • 已安装 Docker 与 Compose 插件:
docker --version
docker compose version

回显(实测):

Docker version 29.8.1, build 15a6125d
Docker Compose version v5.5.1
  • 宿主机预留 1GB 以上磁盘(镜像约 1.5GB + 数据目录)与 2GB 以上内存。
  • 可访问 Apache 官方镜像站 dlcdn.apache.org(构建时需要下载发行包;也可把 tar.gz 预置到构建目录离线构建)。

四、部署步骤

4.1 准备项目目录与发行包

mkdir -p /opt/om-compose/conf /opt/om-compose/data /opt/om-compose/db
cd /opt/om-compose
wget -O apache-openmeetings-9.1.0.tar.gz https://dlcdn.apache.org/openmeetings/9.1.0/bin/apache-openmeetings-9.1.0.tar.gz

4.2 编写 Dockerfile

文件 /opt/om-compose/Dockerfile:

FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update -qq && apt-get install -y -qq openjdk-21-jdk-headless wget unzip net-tools procps && rm -rf /var/lib/apt/lists/*
ADD apache-openmeetings-9.1.0.tar.gz /opt/
RUN sed -i "s|Url=jdbc:h2:./omdb|Url=jdbc:h2:./db/omdb|" /opt/apache-openmeetings-9.1.0/webapps/openmeetings/WEB-INF/classes/META-INF/persistence.xml && grep -o "Url=jdbc:h2:[^\"]*" /opt/apache-openmeetings-9.1.0/webapps/openmeetings/WEB-INF/classes/META-INF/persistence.xml
ENV OM_HOME=/opt/apache-openmeetings-9.1.0
RUN printf "export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64\nexport CATALINA_PID=/var/run/openmeetings.pid\nexport CATALINA_OPTS=\"-Xms256m -Xmx512m -server -XX:+UseParallelGC\"\nexport JAVA_OPTS=\"-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom\"\n" > /opt/apache-openmeetings-9.1.0/bin/setenv.sh
WORKDIR /opt/apache-openmeetings-9.1.0
EXPOSE 5080 5443
CMD ["/opt/apache-openmeetings-9.1.0/bin/catalina.sh", "run"]

💡 说明:镜像内把内嵌 H2 数据库路径从 jdbc:h2:./omdb 改到 jdbc:h2:./db/omdb,配合 4.4 节 ./db 挂载实现数据库持久化(原路径 omdb 文件位于安装根目录,无法单独挂载)。 ⚠️ 关键坑:CMD 必须用 catalina.sh run 前台运行。若用 bin/startup.sh(后台 fork 方式),容器主进程立即退出,容器会反复 Restarting。

4.3 编写 docker-compose.yml

文件 /opt/om-compose/docker-compose.yml:

services:
  openmeetings:
    build: .
    image: openmeetings:9.1.0
    container_name: openmeetings
    ports:
      - "5080:5080"
      - "5443:5443"
    volumes:
      - ./conf:/opt/apache-openmeetings-9.1.0/conf
      - ./data:/opt/apache-openmeetings-9.1.0/webapps/openmeetings/data
      - ./db:/opt/apache-openmeetings-9.1.0/db
    restart: unless-stopped

4.4 构建并首次启动

cd /opt/om-compose
docker compose build
docker compose up -d

回显:

 Image openmeetings:9.1.0 Built

 Network om-compose_default Created
 Container openmeetings Created
 Container openmeetings Starting
 Container openmeetings Started

⚠️ 首次启动前 conf 目录必须是完整配置:空目录挂载到 conf 会盖掉镜像内自带配置,报错 Unable to load server configuration from [/opt/apache-openmeetings-9.1.0/conf/server.xml]。首次先按如下方式导出镜像内配置再重启(后续直接复用 ./conf 即可):

docker compose down
docker compose up -d
docker cp openmeetings:/opt/apache-openmeetings-9.1.0/conf /opt/om-compose/conf
docker compose restart

4.5 初始化安装(admin.sh -i)

与裸机部署一致,需在服务停止状态下初始化数据库并创建管理员:

docker compose stop
docker compose run --rm openmeetings ./admin.sh -i -user admin -email admin@example.com -tz "Asia/Shanghai" -group "admin" --password "Q1w2e3r4!"
docker compose up -d
  • docker compose run --rm 以同一镜像临时起一个一次性容器执行初始化,数据经 ./db 挂载写入宿主机,之后正常启动即复用该库。
  • 回显关键行(exit=0):Initialized JPA EntityManagerFactory for persistence unit 'openmeetings'、... Done。

⚠️ 密码强度硬性要求:--password 须同时含大写、小写、数字与特殊符号且不少于 8 位,否则提示 Please enter password for the user 'admin': 阻塞等待输入。本文统一示例 Q1w2e3r4!。

4.6 验证部署

docker compose ps

回显:

NAME           IMAGE                COMMAND                  SERVICE        CREATED          STATUS        PORTS
openmeetings   openmeetings:9.1.0   "/opt/apache-openmee…"   openmeetings   16 seconds ago   Up 1 second   0.0.0.0:5080->5080/tcp, [::]:5080->5080/tcp, 0.0.0.0:5443->5443/tcp, [::]:5443->5443/tcp

首页可达:

curl -s -o /dev/null -w "%{http_code}\n" -L http://127.0.0.1:5080/openmeetings/

回显:

200

REST 登录验证:

curl -s -X POST -H 'Content-Type: application/x-www-form-urlencoded' \
  --data 'user=admin&pass=Q1w2e3r4%21' \
  http://127.0.0.1:5080/openmeetings/services/user/login

回显:

{"serviceResult":{"message":"93dd1f97-7362-4056-8e3c-418d8080ea0e","type":"SUCCESS"}}

浏览器访问 http://<服务器IP>:5080/openmeetings/ 自动跳转登录页 signin 即部署成功。

五、数据持久化说明

挂载项容器内路径持久化内容
./conf/opt/apache-openmeetings-9.1.0/confTomcat 配置(server.xml、localhost.jks 等)
./data/opt/apache-openmeetings-9.1.0/webapps/openmeetings/data上传文件、录制、配置数据等
./db/opt/apache-openmeetings-9.1.0/db内嵌 H2 数据库文件(omdb.mv.db)

持久化验证(重启后登录仍 SUCCESS、数据库文件落盘):

docker compose restart
curl -s -X POST -H 'Content-Type: application/x-www-form-urlencoded' \
  --data 'user=admin&pass=Q1w2e3r4%21' \
  http://127.0.0.1:5080/openmeetings/services/user/login
ls -la /opt/om-compose/db/

回显:

{"serviceResult":{"message":"41c93036-1582-408f-ab5f-a25c8e7490f9","type":"SUCCESS"}}
total 216
drwxr-xr-x 2 root root   4096 Oct 11 20:06 .
drwxr-xr-x 5 root root   4096 Oct 11 20:01 ..
-rw-r----- 1 root root 212992 Oct 11 20:06 omdb.mv.db

💡 说明:数据库文件、配置、上传数据均落在宿主机目录,docker compose down 后数据仍在,重新 up 即可恢复。

六、常用环境变量表

镜像内默认通过 bin/setenv.sh 与 Dockerfile 固化,如需临时覆盖可在 compose 的 environment: 注入:

环境变量默认值说明
JAVA_HOME/usr/lib/jvm/java-21-openjdk-amd64JDK 21 路径
CATALINA_HOME/opt/apache-openmeetings-9.1.0Tomcat 安装根
CATALINA_BASE/opt/apache-openmeetings-9.1.0Tomcat 实例根
CATALINA_PID/var/run/openmeetings.pidPID 文件
CATALINA_OPTS-Xms256m -Xmx512m -server -XX:+UseParallelGCJVM 堆与 GC(256–512MB)
JAVA_OPTS-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandomJVM 系统属性

七、常用配置参数说明(command)

  • 镜像固定启动命令:/opt/apache-openmeetings-9.1.0/bin/catalina.sh run(前台运行,容器主进程)。
  • 应用级参数(数据库、端口、邮件、Kurento 等)不通过 command 传递,统一改配置文件:
    • 端口/TLS:conf/server.xml(HTTP 5080、HTTPS 5443,见八节 conf 挂载);
    • 数据库连接:webapp 内 META-INF/persistence.xml(镜像内已改 H2 路径到 ./db);
    • 应用参数:WEB-INF/classes/openmeetings.properties 与后台「配置」页,详见《Apache OpenMeetings 9.1.0 配置参数详解》。

八、配置文件持久化(conf 挂载)

  • ./conf 挂载容器内 conf 目录,修改宿主机 server.xml 端口/证书后重启生效:
docker compose restart
  • 生产替换 HTTPS 证书:将正式证书与密钥导入 ./conf(参照 server.xml 中 HTTPS Connector 的 keystoreFile/keystorePass 配置)。

九、等价 docker run 运行方式

不使用 Compose 时,构建与启动等价命令如下:

cd /opt/om-compose
docker build -t openmeetings:9.1.0 .
docker run -d --name openmeetings \
  -p 5080:5080 -p 5443:5443 \
  -v /opt/om-compose/conf:/opt/apache-openmeetings-9.1.0/conf \
  -v /opt/om-compose/data:/opt/apache-openmeetings-9.1.0/webapps/openmeetings/data \
  -v /opt/om-compose/db:/opt/apache-openmeetings-9.1.0/db \
  --restart unless-stopped \
  openmeetings:9.1.0

回显(容器 ID):

e3665f6eff9490587fe3bc09e05084d154c598c6d0549d76f825501b31e0390b

验证(登录 SUCCESS):

{"serviceResult":{"message":"fb8e01e2-f72b-4da0-8e94-785df740ff76","type":"SUCCESS"}}

停止并删除该容器:

docker stop openmeetings && docker rm openmeetings

十、常用运维命令

# 查看状态与日志
docker compose ps
docker compose logs -f openmeetings

# 进入容器(查看进程/配置)
docker compose exec openmeetings bash

# 确认 JVM 堆生效
docker compose exec openmeetings ps -ef | grep [j]ava

# 重启 / 停止 / 启动
docker compose restart
docker compose stop
docker compose start

# 临时执行管理命令(安装/备份/恢复,先 stop)
docker compose stop
docker compose run --rm openmeetings ./admin.sh -b
docker compose run --rm openmeetings ./admin.sh -r -file backup_2026_10_11_19_46_34.zip
docker compose up -d

# 彻底移除(保留数据卷目录数据)
docker compose down

十一、常见问题(FAQ)

11.1 容器反复 Restarting,日志只有 Tomcat started

原因:CMD 使用了 bin/startup.sh(后台 fork 后主进程退出),容器随即退出。

处理:Dockerfile 的 CMD 改用 catalina.sh run 前台运行(见 4.2 节),重新构建:

docker compose build --no-cache
docker compose up -d

11.2 启动报 Unable to load server configuration from conf/server.xml

原因:空目录挂载 ./conf 盖掉了镜像内自带配置。

处理:先按 4.4 节 docker cp 导出镜像内 conf 到宿主机目录,再 restart。

11.3 登录返回 error.bad.credentials

原因:未执行初始化安装,数据库无管理员账号。

处理:按 4.5 节执行 docker compose run --rm openmeetings ./admin.sh -i ... 后 docker compose up -d。

11.4 容器删除后数据丢失

原因:仅挂载了 ./conf/./data,未挂载 ./db,H2 库文件留在容器层。

处理:确认 compose 含 ./db:/opt/apache-openmeetings-9.1.0/db 挂载(见 4.3/五节)。

11.5 宿主机 5080/5443 端口被占用

处理:修改 compose ports: 映射为宿主机其他端口(如 "18080:5080"),或停掉占用进程后重启:

docker compose down
sed -i 's/5080:5080/18080:5080/' docker-compose.yml
docker compose up -d

十二、参考链接