Docker コンテナ内のGUIアプリを起動してホスト側に表示する
Docker
のコンテナ内のGUIのアプリを起動してホスト側に表示する方法を紹介します。
ホスト側のOSはLinux Mint
で確認しました。
Dockerファイルの作成
ベースイメージはUbuntu
で動作確認用のアプリはシンプルなメモ帳のleafpad
とします。
また、Docker コンテナ内に一般ユーザーを作成するで紹介した方法で、ホスト側の現在のユーザーと同じユーザーID(UID
)のユーザーを作成し、そのユーザーでGUI
アプリを実行するようにします。
そのようにしないと、GUIアプリを起動時に以下のエラーが発生してしまいます。
エラー
$ leafpad: Cannot open display:
xhost
の設定などで対処できるようですが、ここではホストユーザーと同じユーザーIDを作成する方法で確認します。
Dockerfile
FROM ubuntu
# 動作確認用のGUIアプリをインストール
RUN apt-get update \
&& apt-get install -y leafpad
# ユーザーを作成
ARG DOCKER_UID=1000
ARG DOCKER_USER=docker
ARG DOCKER_PASSWORD=docker
RUN useradd -m \
--uid ${DOCKER_UID} --groups sudo ${DOCKER_USER} \
&& echo ${DOCKER_USER}:${DOCKER_PASSWORD} | chpasswd
USER ${DOCKER_USER}
WORKDIR /home/${DOCKER_USER}/app
docker-composeの設定
環境変数とボリュームに以下を追加します。
また、Docker ubuntuコンテナが終了してしまうのを防ぐ方法で紹介したように、コンテナを起動し続けるためtty
をtrue
に設定しています。
docker-compose.yml
version: '3'
services:
app:
build: ./docker/app
tty: true
environment:
- DISPLAY=${DISPLAY}
volumes:
- /tmp/.X11-unix:/tmp/.X11-unix
設定内容の詳細な説明はX Window System
やX11
などで検索するといろいろ出てきます。
X Window Systemのサーバーの指定
コンテナのDISPLAY
という名前の環境変数に、ホスト側の同名の値を設定しています。
実際の値は以下のコマンドで確認できます。
$ printenv DISPLAY
:0
ホスト:ディスプレイ.スクリーン
の形式で設定されています。ホスト
がlocalhost
の場合は省略でき、スクリーン
が1番目のディスプレイの場合も省略できます。
そのため、:0
というのは実際はlocalhost:0.0
を意味します。
X Windows SystemのUNIXドメインソケットの共有
tmp/.X11-unix
をvolumes
でホスト側とコンテナ側で共有することにより、ドメインソケットを共有します。
動作確認
まず、以下のコマンドでコンテナを起動します。
$ docker-compose up -d
次に、以下のコマンドでコンテナ内に入ります。
$ docker-compose exec app bash
コンテナ内のbash
で以下のコマンドを実行し、leafpad
を起動します。
$ leafpad
leafpad
のアプリが画面に表示されればOKです。