Dockerを用いたGUIアプリケーションの実行

私はこのところしばらく仕事でVMやコンテナを扱っていましたが、大学のいくつかのプロジェクトでJavaのコードを書かなければならないときは未だにvimを使用せず、新たに本格的なIDEをインストールしなければなりませんでした。これにはいつもイライラさせられていましたが、ついに今週、Dockerコンテナ内でNetBeansを実行できるようになったのです。それによって普段使用しないJavaのコードを書くための膨大な環境をパソコンにインストールしなくて済むようになりました。

Dockerコンテナ内でGUIアプリケーションを実行する場合には、いくつかの方法があり、X11転送を行うSSHVNCを使用します。しかし私が発見した最もシンプルな方法は、X11のソケットをコンテナと共有して、直接使用するというものでした。

このアイデアはとてもシンプルで、以下のDockerfileを開始点として使用するFirefoxコンテナを実行することで、簡単に試すことができます。

FROM ubuntu:14.04

RUN apt-get update && apt-get install -y firefox

# Replace 1000 with your user / group id
RUN export uid=1000 gid=1000 && \
    mkdir -p /home/developer && \
    echo "developer:x:${uid}:${gid}:Developer,,,:/home/developer:/bin/bash" >> /etc/passwd && \
    echo "developer:x:${uid}:" >> /etc/group && \
    echo "developer ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/developer && \
    chmod 0440 /etc/sudoers.d/developer && \
    chown ${uid}:${gid} -R /home/developer

USER developer
ENV HOME /home/developer
CMD /usr/bin/firefox

docker build -t firefox . を実行し、次に以下のコードでコンテナを実行します。

docker run -ti --rm \
       -e DISPLAY=$DISPLAY \
       -v /tmp/.X11-unix:/tmp/.X11-unix \
       firefox

すべてうまくいけば、FirefoxがDockerコンテナ内から実行されていることが確認できるはずです。


NetBeansコンテナの準備と実行

NetBeansのベースイメージを準備するのは容易ではありませんでした。X11のソケットに正しく接続できるようにするために、さらにいくつかの依存パッケージ(具体的にはlibxext-devlibxrender-devlibxtst-devパッケージです)をインストールする必要があるからです。また、Oracle Javaを動かすにはOpenJDKを使用する必要があり、この扱いにも苦労しました。

そして試行錯誤の末、ようやく問題なく動作するようになり、ベースイメージが出来上がりました。このベースイメージはDocker Hubから入手でき、ソースはGitHubにあります。

では、簡単なデモをお見せしましょう。


今後の展望

これから数カ月間はPlayのアプリケーションを構築しようと思います。どんなワークフローを使ったかについて、ブログに書ければいいなと思っています。お楽しみに!

追伸:ここに書いたX11のソケットの共有方法はvagrant-lxcコンテナにも適用されます。機会があれば、プロジェクトのWikiにこれについて詳しく書こうと思っています。