使用 Docker 部署 JxBrowser 应用程序
本教程演示了如何使用 Docker 在无头(headless)环境中部署 JxBrowser 应用程序。
前提条件
为完成本教程,您需要准备以下内容:
- 安装并运行 Docker Engine。
- 一个有效的 JxBrowser 许可证。它可以是评估版或商业版。关于许可证的更多信息,请参见许可证指南。
获取代码
您可以在我们的示例集合中找到完整的 Dockerfile
和示例应用程序:
$ git clone https://github.com/TeamDev-IP/JxBrowser-Examples
$ cd JxBrowser-Examples/tutorials/docker
JxBrowser 应用程序
创建应用程序
使用 Gradle 创建新的 JxBrowser 应用程序或使用实例库中的一个。接下来,创建一个新的目录,并将创建的项目复制到 project
子目录下。
添加许可证
要继续,请将许可证密钥添加到应用程序中。
为 Docker 配置 Chromium
如果遇到问题,并且您想使用 DevTools 检查 Web Browser 的状态,可以通过远程调试端口访问开发者工具。有关如何连接到它的说明在故障排除部分。
// 启用远程调试端口。
options.remoteDebuggingPort(9222);
创建 Dockerfile
选择基础镜像和基本环境配置
在上一步创建的目录中新建一个 Dockerfile
。我们首先选择 Ubuntu 20.04(LTS)作为我们的基础镜像。然后,我们对环境进行基本配置并更新软件包列表。
- 选择基础镜像:
FROM ubuntu:20.04
- 配置时区并为 debconf 设置非交互式前端,以避免用户交互并自动选择默认选项:
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=UTC
- 更新软件包列表:
RUN apt update
安装 OpenJDK 和 Gradle
在本教程中,我们将使用 OpenJDK 8。但你可以自由选择使用任何其他支持的 JDK。
RUN apt install -y openjdk-8-jdk
安装 Chromium 依赖项
安装 Chromium 所需的动态库。
如果您想使用不同的 Ubuntu 版本或其他 Linux 发行版作为基础镜像,请安装该系统所需的 Chromium 依赖项。您可以在此处找到各种 Linux 发行版的 Chromium 包列表。这些依赖项对于 JxBrowser 来说也应该是大致相同的。
RUN apt install -y \
libasound2 \
libatk-bridge2.0-0 \
libatk1.0-0 \
libatspi2.0-0 \
libc6 \
libcairo2 \
libcups2 \
libdbus-1-3 \
libdrm2 \
libexpat1 \
libfontconfig1 \
libgbm1 \
libgcc-s1 \
libglib2.0-0 \
libgtk-3-0 \
libnspr4 \
libnss3 \
libpango-1.0-0 \
libpulse0 \
libx11-6 \
libxcb1 \
libxcomposite1 \
libxdamage1 \
libxext6 \
libxfixes3 \
libxkbcommon0 \
libxrandr2 \
libxshmfence1 \
libxtst6 \
xdg-utils
Chromium 需要 X11 服务器才能运行。我们使用 Xvfb,它是一个轻量级的 X11 服务器实现。
RUN apt install -y xvfb
复制和构建项目
在 Dockerfile 的最后部分,我们需要将所有必需的文件复制到镜像中,并构建我们的项目。
- 复制启动脚本并使其可执行。我们稍后会查看它的内容。
- 复制 Java 应用程序并使用 Gradle 构建它。
- 设置镜像的入口点。
COPY startup.sh .
RUN chmod +x startup.sh
COPY project/ project
RUN cd project && ./gradlew build
WORKDIR /
ENTRYPOINT ["sh", "-c", "/startup.sh"]
在启动脚本中,我们启动 X11 服务器并使用 Gradle 启动我们的应用程序。
#!/bin/sh
Xvfb :0 -screen 0 1920x1080x24+32 &
cd project
DISPLAY=:0 ./gradlew run
构建和启动 Docker 容器
构建一个 Docker 镜像并将其命名为 jxbrowser
:
docker build -t jxbrowser .
使用此镜像启动一个容器:
docker run --shm-size=1gb -t jxbrowser
--shm-size=1gb
将共享内存量扩展到 1 GB。默认情况下,Docker 容器中的共享内存限制为 64MB,这并不足以让 Chromium 正常工作。
您应该在控制台输出中看到加载页面的标题。在我们的示例应用程序中,我们加载 Google,并打印出:
Title: Google
故障排除
通过远程调试端口访问 DevTools
没有简单的方法可以通过远程调试端口连接到 Chromium 的 DevTools,因为 Chromium 只允许来自 localhost
的连接。为了绕过它,我们使用 SSH 端口转发。
我们必须用暴露给主机系统的 SSH 端口启动 Docker 容器。为此,我们传递 -p 2222:22
参数。
docker run -p 2222:22 --shm-size=1gb -t jxbrowser
一旦我们的容器运行,我们就可以访问容器的 shell 来安装 SSH 服务器并启动它。
docker exec -it <container_id> /bin/bash
apt install -y openssh-server
service ssh start
我们还必须添加一个用于连接容器的新用户。
useradd --create-home --shell /bin/bash jxbrowser
passwd jxbrowser
有了它,我们就可以将容器的远程调试端口转发到主机上了。
ssh -L 9222:localhost:9222 -p 2222 jxbrowser@localhost
现在,您可以使用 Chrome 或 Chromium 打开 http://127.0.0.1:9222/
URL 以访问 DevTools。
Kubernetes
在 Kubernetes 中,无法直接传递所需的 --shm-size=1gb
标志。相反,你需要手动为 /dev/shm
创建一个卷:
spec:
volumes:
- name: chromium_shm
emptyDir:
sizeLimit: "1Gi"
medium: Memory
containers:
- image: jxbrowser
volumeMounts:
- mountPath: /dev/shm
name: chromium_shm
总结
在本教程中,我们演示了如何:
- 创建一个 Docker 镜像以运行 JxBrowser 应用程序。
- 配置您的应用程序以适应 Docker 环境。