2014年12月24日
Dockerを用いたGUIアプリケーションの実行
(2014-9-11)by Fábio Rehm
本記事は、原著者の許諾のもとに翻訳・掲載しております。
私はこのところしばらく仕事でVMやコンテナを扱っていましたが、大学のいくつかのプロジェクトでJavaのコードを書かなければならないときは未だにvimを使用せず、新たに本格的なIDEをインストールしなければなりませんでした。これにはいつもイライラさせられていましたが、ついに今週、Dockerコンテナ内でNetBeansを実行できるようになったのです。それによって普段使用しないJavaのコードを書くための膨大な環境をパソコンにインストールしなくて済むようになりました。
Dockerコンテナ内でGUIアプリケーションを実行する場合には、いくつかの方法があり、 X11転送を行うSSH や VNC を使用します。しかし私が発見した最もシンプルな方法は、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-dev
、 libxrender-dev
、 libxtst-dev
パッケージです)をインストールする必要があるからです。また、Oracle Javaを動かすにはOpenJDKを使用する必要があり、この扱いにも苦労しました。
そして試行錯誤の末、ようやく問題なく動作するようになり、ベースイメージが出来上がりました。このベースイメージは Docker Hub から入手でき、ソースは GitHub にあります。
では、簡単なデモをお見せしましょう。
今後の展望
これから数カ月間は Play のアプリケーションを構築しようと思います。どんなワークフローを使ったかについて、ブログに書ければいいなと思っています。お楽しみに!
追伸:ここに書いたX11のソケットの共有方法は vagrant-lxc コンテナにも適用されます。機会があれば、プロジェクトのWikiにこれについて詳しく書こうと思っています。
株式会社リクルート プロダクト統括本部 プロダクト開発統括室 グループマネジャー 株式会社ニジボックス デベロップメント室 室長 Node.js 日本ユーザーグループ代表
- Twitter: @yosuke_furukawa
- Github: yosuke-furukawa