Implantação de aplicativos JxBrowser com o Docker

Este tutorial demonstra como implantar um aplicativo JxBrowser no ambiente headless usando o Docker.

Pré-requisitos

Para este tutorial, você precisará do seguinte:

  • Um Docker Engine instalado e executando .
  • Uma licença válida do JxBrowser. Pode ser de avaliação ou comercial. Para mais informações sobre o licenciamento, consulte o guia Licenciamento.

Obtendo o código

Você pode encontrar um Dockerfile completo e uma aplicação de amostra na nossa coleção de exemplos:

$ git clone https://github.com/TeamDev-IP/JxBrowser-Examples
$ cd JxBrowser-Examples/tutorials/docker

Aplicação JxBrowser

Criando uma aplicação

Crie uma nova aplicação JxBrowser utilizando o Gradle ou utilize uma do repositório de exemplos. Em seguida, crie um novo diretório e copie o projeto criado para o sub-diretório project.

Adicionando a licença

Para avançar, coloque a chave de licença na aplicação.

Configurando o Chromium para o Docker

Se tiver um problema e se você quiser inspecionar o estado do navegador Web com o DevTools, é possível acessar as ferramentas de desenvolvimento através da porta de depuração remota. As instruções sobre como conectar-se à ele estão na seção de resolução de problemas.

// Ativar a porta de depuração remota.
options.remoteDebuggingPort(9222);

Criando um Dockerfile

Seleção de uma imagem de base e configuração básica do ambiente

Crie um novo Dockerfile no diretório que criamos no passo anterior. Iniciamos o nosso Dockerfile selecionando o Ubuntu 20.04 (LTS) como a nossa imagem de base. Em seguida, efetuamos a configuração básica para o nosso ambiente e atualizamos as listas de pacotes.

  1. Selecione uma imagem de base:
FROM ubuntu:20.04
  1. Configure o fuso horário e defina um frontend não-interativo para o debconf, para que não espere uma interação do usuário e selecione escolhas padrões:
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=UTC
  1. Atualize a lista de pacotes:
RUN apt update

Instalando o OpenJDK e o Gradle

Usamos o OpenJDK 8 neste tutorial. Mas você é livre para utilizar qualquer outro Java suportado.

RUN apt install -y openjdk-8-jdk

Instalando as dependências do Chromium

Instale as bibliotecas dinâmicas que o Chromium requer.

Se deseja utilizar uma versão diferente do Ubuntu ou outra distribuição Linux como imagem de base, instale as dependências exigidas pelo pacote Chromium fornecido para esse sistema. Você pode encontrar a lista de pacotes Chromium para várias distribuições Linux aqui. A sua lista de dependências também deve ser quase a mesma para o 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

O Chromium necessita de um servidor X11 para funcionar. Usamos o Xvfb que é uma implementação leve do servidor X11.

RUN apt install -y xvfb

Copiando e construindo o projeto

Na parte final do nosso Dockerfile, temos que copiar todos os arquivos necessários para a imagem e construir o nosso projeto.

  1. Copie o script de início e torne-o executável. Iremos rever o seu conteúdo em breve.
  2. Copie a aplicação Java e construa-a com o Gradle.
  3. Defina o ponto de entrada para a imagem.
COPY startup.sh .
RUN chmod +x startup.sh

COPY project/ project
RUN cd project && ./gradlew build

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

No script de início, lançamos o servidor X11 e iniciamos a nossa aplicação com o Gradle.

#!/bin/sh
Xvfb :0 -screen 0 1920x1080x24+32 &
cd project
DISPLAY=:0 ./gradlew run

Criação e lançamento de um container Docker

Construa uma imagem Docker e nomeie-a jxbrowser:

docker build -t jxbrowser .

Inicie um container com esta imagem:

docker run --shm-size=1gb -t jxbrowser

O --shm-size=1gb estende a quantidade de memória compartilhada para 1 GB. Por padrão, a memória compartilhada nos containers Docker está limitada a 64 MB, o que não é suficiente para o Chromium funcionar.

Você deverá ver o título da página carregada na saída do console. Na nossa aplicação de exemplo, carregamos o Google e ele é impresso:

Títle: Google

Resolução de problemas

Acessando o DevTools através da porta de depuração remota

Não existe uma maneira fácil de se conectar ao DevTools do Chromium através da Porta de Depuração Remota porque o Chromium só permite conexões a partir do localhost. Para contornar, utilizamos o reencaminhamento de portas SSH.

Temos de iniciar o container Docker com a porta SSH exposta ao sistema anfitrião. Para isso, passamos o parâmetro -p 2222:22.

docker run -p 2222:22 --shm-size=1gb -t jxbrowser

Quando o nosso container estiver rodando, podemos acessar a shell do container para instalar um servidor SSH e iniciá-lo.

docker exec -it <container_id> /bin/bash
apt install -y openssh-server
service ssh start

Também temos que adicionar um novo usuário que possamos utilizar para nos ligarmos ao nosso container.

useradd --create-home --shell /bin/bash jxbrowser
passwd jxbrowser

Com ele, está tudo pronto para encaminhar a porta de depuração remota do container para a nossa máquina anfitriã.

ssh -L 9222:localhost:9222 -p 2222 jxbrowser@localhost

Agora você pode abrir o URL http://127.0.0.1:9222/ com o Chrome ou Chromium para acessar o DevTools.

Kubernetes

É impossível passar a flag --shm-size=1gb necessária para o Kubernetes e, em vez disso, é necessário criar um volume para /dev/shm manualmente:

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

Resumo

Neste tutorial, demonstramos como você pode:

  1. Criar uma imagem Docker para ser executada com uma aplicação JxBrowser.
  2. Configurar a sua aplicação para o ambiente Docker.
Go Top