使用 Docker 部署 JxBrowser 应用程序

本教程演示如何使用 Docker 在无头环境中部署 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 检查网页浏览器的状态,可以通过远程调试端口访问开发人员工具。 有关如何连接到它的说明在故障排除部分。

// Enable the remote debugging port.
options.remoteDebuggingPort(9222);

创建一个 Dockerfile

选择一个基底影像和基本环境配置

在上一步中创建的目录中创建一个新的 Dockerfile 。 我们通过选择 Ubuntu 20.04 (LTS) 作为我们的基底影像来启动我们的 Dockerfile。 然后我们为我们的环境执行基本配置并更新包列表。

  1. 选择一个基底影像:
    FROM ubuntu:20.04
    
  2. 配置时区并为 debconf 设置非交互式前端,这样它就不会期望用户交互并选择默认选项:
    ENV DEBIAN_FRONTEND=noninteractive
    ENV TZ=UTC
    
  3. 更新包列表:
    RUN apt update
    

安装 OpenJDK 和 Gradle

我们在本教程中使用 OpenJDK 8。 但您可以自由使用任何其他受支持的 JDK

RUN apt install -y openjdk-8-jdk
RUN apt install -y gradle

安装 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. 设置影像的入口点。
WORKDIR /root

ADD startup.sh .
RUN chmod +x startup.sh

ADD project/ .
RUN gradle build

ENTRYPOINT ["sh", "-c", "/root/startup.sh"]

在启动脚本中,我们启动 X11 服务器并使用 Gradle 启动我们的应用程序。

#!/bin/sh
Xvfb :0 -screen 0 1920x1080x24+32 &
DISPLAY=:0 gradle 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

将所需的 --shm-size=1gb 标志传递给 Kubernetes 是不可能的,相反,您必须手动为 /dev/shm 创建一个卷:

spec:
  volumes:
  - name: chromium_shm
    emptyDir:
      sizeLimit: "1Gi"
      medium: Memory
  containers:
  - image: jxbrowser
    volumeMounts:
      - mountPath: /dev/shm
        name: chromium_shm

总结

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

  1. 创建一个与 JxBrowser 应用程序一起运行的 Docker 影像。
  2. 为 Docker 环境配置应用程序。
Go Top