技術的な話

Ubuntu GUI環境をDocker上に作成する

スクレイピング機能を開発する時やseleniumを回すときに良く使用する環境です。

環境

普段はVirtualBoxで動作させている仮想マシン(Ubuntu 20.04)を使用しています。そこにDockerをインストールして、VSCodeでSSH接続して開発している感じです。

  • Docker 20.10.11
  • Ubuntu 18.04 + GUI
  • Google Chrome + Google Chrome Driver

VirtualBoxで作成した開発環境は下記をご参照ください。

Dockerの設定

日本語環境のイメージを公開されている方がいらっしゃいます。ありがたや。

https://hub.docker.com/r/uphy/ubuntu-desktop-jp

本記事では18.04を使用します。

何故20.04を使用しないかって?実際に使用したのですが、放置して一定時間経過するとスクリーンセーバーが動作するのですが、その後きちんと画面が復旧しないんですよね。

画面系のプロセスを再起動(強制kill)させると元に戻るのですが、ちょっと面倒だったので一旦18.04で進めます。

この辺もう少し調査して原因を究明したいです。

フォルダ構成

$ tree -a
.
├── app
│   └── main.py
├── .env
├── docker-compose.yml
├── Dockerfile
└── requirements.txt

Dockerfile

まずはDockerfileの設定です。

ベースのイメージにGoogleChrome等の必要なソフトウェアを入れています。

ざっくり実施していることは下記4点になります。

  • Google Chromeのインストール
  • Google Chrome Driverのインストール
  • Python3.9のインストール
    デフォルトで入っているのは3.6なので開発用に3.9を別途インストールしています
  • 開発で必要になるPythonライブラリのインストール

Pythonのインストールはかなり時間が掛かるのでデフォルトの3.6でも問題無い方は飛ばしても良いかもしれません。

なお、下記の例ではPython3.9に対してシンボリックリンクの貼り換えはしていません。

個人的にはPython3.6に依存している他のソフトウェアがあるかもしれないので、貼り換えはしない方が良い気がしています。

FROM uphy/ubuntu-desktop-jp:18.04

RUN set -ex && \
    apt-get update && \
    apt-get install -y --no-install-recommends curl cron unar

# version info
ARG GOOGLE_CHROME_DRIVER_VERSION
ARG PYTHON_VERSION

# google chrome install
RUN echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list && \
    wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \
    apt-get update && \
    apt-get install -y google-chrome-stable

# google chrome driver install
RUN wget https://chromedriver.storage.googleapis.com/${GOOGLE_CHROME_DRIVER_VERSION}/chromedriver_linux64.zip && \
    unar chromedriver_linux64.zip -o /usr/local/bin/ && \
    rm -f chromedriver_linux64.zip

# python requirements install
RUN apt install -y build-essential libbz2-dev libdb-dev \
    libreadline-dev libffi-dev libgdbm-dev liblzma-dev \
    libncursesw5-dev libsqlite3-dev libssl-dev \
    zlib1g-dev uuid-dev tk-dev

# python 3.9.xx install
RUN wget https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tar.xz && \
    tar xJf Python-${PYTHON_VERSION}.tar.xz && \
    rm -f Python-${PYTHON_VERSION}.tar.xz && \
    cd Python-${PYTHON_VERSION} && \
    ./configure && \
    make && \
    make install

# python modules install
COPY requirements.txt .
RUN pip install -r requirements.txt

# clean
RUN apt-get clean && \
    rm -rf /var/lib/apt/lists/*

WORKDIR /app

docker-compose.yml

同じ階層に.envファイルを配置しておく前提になってます。

  • GOOGLE_CHROME_DRIVER_VERSION:ドライバーのバージョン
  • PYTHON_VERSION:別途インストールするPythonのバージョン
  • VPC_PORT:Webブラウザでアクセスするポート番号

Google Chrome Driverのバージョンは下記を参考にバージョンを指定してください。

https://chromedriver.chromium.org/downloads

他に特筆する部分があるとすれば、shm_sizeぐらいですかね。これを指定しないとメモリが足りずにGoogle Chromeがクラッシュします。1GBでも不足しているようであれば調整してください。

version: '3.7'
services:
    gui-ubuntu:
        container_name: gui-ubuntu
        build:
            context: .
            dockerfile: ./Dockerfile
            args:
                - GOOGLE_CHROME_DRIVER_VERSION=${GOOGLE_CHROME_DRIVER_VERSION}
                - PYTHON_VERSION=${PYTHON_VERSION}
        volumes:
        - ./app:/app
        ports:
            - ${VPC_PORT}:8080
        shm_size: 1g
        restart: always
        tty: true

起動と確認

ビルド、起動

composeコマンドにてビルド、起動させます。

# build
$ sudo docker-compose build

# up
$ sudo docker-compose up -d

動作確認

実際のGUI画面にアクセスするにはWebブラウザ経由で行います。

環境にもよりますが、WindowsやMacに直接Dockerをインストールして実行している方はブラウザ開いて「http://localhost:{VPC_PORT}」を叩けばGUI画面を参照できるかも。

私の環境だとVSCodeでVPC_PORTをポートフォワードしないと接続出来ないので別途しています。

以下のような感じ。ちょっと面倒なのですが。

無事にアクセス出来ると下記のような画面が表示されるので接続ボタンをクリックします。

この辺はデフォルト設定で問題無いです。

これで接続できたので、とりあえずターミナルを起動してPythonのインストール状況等を確認します。

こんな感じであとはスクレイピングやらseleniumのコードをガシガシ書いていきます。

-技術的な話
-, , ,