2023年7月31日月曜日

DockerでGUIプログラムを動かす


背景

興味があるライブラリをDocker環境でテストしていたところGUI(画面表示、x window)が必須なプログラムが含まれていて困りましたが、調べて試行錯誤したらDockerのコンテナでGUIが必要なプログラムを動かせました。
備忘録として設定方法を記事に残します。

動かす対象 ubuntuコンテナ上のgedit

下記のDockerfileでgedit(文章編集プログラム、テキストエディタ)をインストールしたubuntuコンテナを作成し、geditを起動してホストOSに表示します
Dockerfile
FROM ubuntu:22.04
WORKDIR /app
RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
RUN apt update
RUN apt install -y gedit

hostがubuntuのときにtimezoneの設定でコンテナのbuildが止まってしまったので、/etc/localtimeに地域情報を入れています。

参考
Docker Build中に Configuring tzdataでハング
Ubuntu 20.04のdocker build時にタイムゾーン選択を求められた時の対処メモ

hostがubuntuの場合

環境

Dockerfileを配置したフォルダに移動してコンテナをbuildします。
コンテナのタグはubuntu-geditとしています。
このコマンドは一度実行すれば良いです。
docker buildx build . -t ubuntu-gedit

x windowのlocalからの接続を有効にします。
このコマンドはログインの度に実施が必要です。
xhost +local:

hostと接続しつつDISPLAYという変数をhostと同じ値に設定してコンテナのgeditを実行します。
docker run --net host -e DISPLAY -it ubuntu-gedit gedit

期待通りubuntuのhost上でubuntuコンテナのgeditを実行できました。


参考
DockerでGUIアプリケーションを開く基本的な押さえどころ
ヘッドレスでKinectのDepthエンジンを使う

hostがwindowsの場合

環境
  • windows 10
  • docker desktop
    下記コマンドでインストールしました。
    winget install Docker.DockerDesktop
  • wsl v2
    docker desktopの動作に必要です。
    下記コマンドでインストールしてv2に変更しました。
    set-versionコマンドで処理が数秒で終わってしまう場合は、表示される警告文のurlにアクセスしてwsl v2用のプログラムをインストールしてください。
    また、wsl v2はbiosで仮想化処理(Intel Virtualization Technology)を有効にする必要もあります。
    wsl --install -D Ubuntu
    wsl -set-version Ubuntu 2
    # 確認
    wsl -l -v
  • VcXsrv
    windowsで動くx serverです。
    下記コマンドでインストールしました。
    winget install marha.VcXsrv

スタートメニューからdocker desktopを選択して実行してください。
docker desktopを動かしておかないとpower shellでdockerを実行してもデーモン不在で動きません。
この手順はログインの度に必要です。


dockerを動かしたらDockerfileを配置したフォルダに移動してコンテナをbuildします。
コンテナのタグはubuntu-geditとしています。
このコマンドは一度実行すれば良いです。
docker buildx build . -t ubuntu-gedit

スタートメニューからXLaunchを実行します。
設定を聞かれますが標準設定で問題ありません。
この手順はログインの度に必要です。


power shellでhostと接続し、DISPLAYとして「host.docker.internal:0.0」を渡し、コンテナのgeditを実行します。
docker run -e "DISPLAY=host.docker.internal:0.0" --net host -it ubuntu-gedit bash -c gedit

期待通りに動きました。


参考
Dockerの初歩と詰まったことへの備忘録
Install WSL command
WSL2をインストールして使うときの注意点

おわり

dockerのコンテナ上で動かすGUIプログラムをhostの画面に表示して実行できました。
今までGUIのプログラムはdockerの外で開発するしか無いと思っていましたが、この仕組みを使えばGUIプログラム開発にもdockerを使えて便利な場面がありそうです。
更にwindowsでも

参考

Dockerfile作成時
Docker Build中に Configuring tzdataでハング
Ubuntu 20.04のdocker build時にタイムゾーン選択を求められた時の対処メモ

hostがubuntuの場合
DockerでGUIアプリケーションを開く基本的な押さえどころ
ヘッドレスでKinectのDepthエンジンを使う

hostがwindowsの場合
Dockerの初歩と詰まったことへの備忘録
Install WSL command
WSL2をインストールして使うときの注意点

0 件のコメント :