List icon 目录

使用 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)作为我们的基础镜像。然后,我们对环境进行基本配置并更新软件包列表。

  1. 选择基础镜像:
FROM ubuntu:20.04
  1. 配置时区并为 debconf 设置非交互式前端,以避免用户交互并自动选择默认选项:
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=UTC
  1. 更新软件包列表:
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 的最后部分,我们需要将所有必需的文件复制到镜像中,并构建我们的项目。

  1. 复制启动脚本并使其可执行。我们稍后会查看它的内容。
  2. 复制 Java 应用程序并使用 Gradle 构建它。
  3. 设置镜像的入口点。
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

总结

在本教程中,我们演示了如何:

  1. 创建一个 Docker 镜像以运行 JxBrowser 应用程序。
  2. 配置您的应用程序以适应 Docker 环境。