3
3

Docker初心者がコンテナ内からGUIアプリケーション表示する方法に挑戦

Posted at

表記の通りDockerの使い方について勉強をしているところです。Dockerは手軽に環境を構築できて便利ですね。欲を言うとGUIアプリをもっと気軽に検証できれば最高だと思います。

実際には、コンテナ作成時に環境変数などを定義することでGUI表示にも対応可能なようですが、長めのオプションを書き込まないといけなかったりと、初心者にはちょっと気が重いです。なのでVSCodeを使ってもっと手軽にGUIアプリ表示を実現できないか検討してみました。

本手法はWSL2を利用しています。手順が若干トリッキーなのですが、一旦環境を構築すると、WSLで構築したLinuxディストリビューションのような感覚でGUIアプリを表示できました。自分のための備忘録として投稿致します。

注意事項
ここに記載しているGUIの表示手順は、WSLgを用いた正規の手法では無いと思います。予期しない不具合などが併発する可能性もありますので、自己責任で実施を検討してください。

1.実行環境

Windows 10 Pro (22H2)

以下が導入済みであること

  • Docker Desktop
  • WSL2

検証時のWSL2のバージョン

PS C:\Users\hoge> wsl --version
WSL バージョン: 2.0.14.0
カーネル バージョン: 5.15.133.1-1
WSLg バージョン: 1.0.59
MSRDC バージョン: 1.2.4677
Direct3D バージョン: 1.611.1-81528511
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows バージョン: 10.0.19045.3803

1.1 WSL - Linux ディストリビューションの導入と動作確認

まずはMicrosoft Storeなどから、通常通りLinuxディストリビューションを導入して、GUIアプリの表示が可能か動作確認を行います。

ubuntuimage_01.jpg

ここではUbuntu-22.04を導入した前提で進めます。

導入したUbuntu-22.04内に入り、下記のコマンドを実行し、GUIアプリがWindowsのデスクトップ上に表示されることを確認してください。

  • x11-appsはxeyesとかxclockなどの簡単なXアプリのセット
sudo apt update && sudu apt upgrade -y
sudo apt install x11-apps
xeyes

問題がなければ以下のように👀が表示されます。

ubuntu_eyes.jpg

確認が終わったら、全部閉じてしまって構いません。
sudo apt remove x11-appsしても良いです)

1.2 既定のディストリビューションの変更

次に、Windows上のDocker Desktopを起動した状態で、PowerShellなどを使ってwsl -l -vと入力し、WSLディストリビューションの状態を確認します。
下記のようにdocker-desktopの左側に*がある場合は、既定のディストリビューションがDocker Desktopになっているので、変更する必要があります。

PS C:\Users\hoge> wsl -l -v
  NAME                   STATE           VERSION
* docker-desktop         Running         2
  docker-desktop-data    Running         2
  Ubuntu-22.04           Running         2

Ubuntu-22.04に変更するためにwsl -s Ubuntu-22.04と入力します。

PS C:\Users\hoge> wsl -s Ubuntu-22.04
この操作を正しく終了しました。

その後、もう一度wsl -l -vで確認してみます。

PS C:\Users\hoge> wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu-22.04           Running         2
  docker-desktop-data    Running         2
  docker-desktop         Running         2

既定のディストリビューションがUbuntu-22.04になりました。

こうしておくことで、Dockerコンテナ内で起動したGUIアプリをRmote Desktopが拾って、Windowusデスクトップに表示してくれるようになるみたいです。

この仕組みが良く理解できていません。今後、仕様の変更などで無効な手順になる可能性もあると思います。その際はご了承ください。

wsl-l.jpg

以上で事前環境の準備は完了です。

2.VSCodeによるDocke環境の構築

Windows上のVSCodeを使ってGUIアプリ動作検証用のDockerイメージを作ります。

VSCodeに以下のextensionを導入している前提で進めます。

  • Dev Containers
  • Docker
  • WSL (←これは不要かも?)

vc_extention.jpg

2.1 ファイルの構成

使用するファイルの構成は以下の通りです。Windowsの任意のフォルダに以下のファイルを格納し、VSCodeでそのフォルダを開いてください。

┣━workspace/
┃  ┗━test.txt
┣━Dockerfile
┗━docker-compose.yml

workspace/test.txt
Hello!
Dockerfile
FROM ubuntu:latest

RUN apt-get update
RUN apt-get install -y x11-apps

# ディレクトリがない場合は自動で作成される
WORKDIR /workspace
docker-compose.yml
version: '3'
services:
  # サービス名
  xeyetes:
    # カレントディレクトリでイメージを構築
    build: .
    # データを永続化
    volumes:
      - ./workspace:/workspace
    # プロセスを継続させてコンテナの正常終了を防ぐ
    stdin_open: true
  • 「stdin_open: true」が無いと直ぐにコンテナが閉じてしまってテストできない

2.2 コンテナの作成と起動

VSCode上でdocker-compose.ymlを右クリックし、Compose Upを選択。

vsc_01.jpg

その後、左サイドバーのDockerアイコンをクリックし、対象となるコンテナを選んで右クリック、Attach Visual Studio Codeを選ぶ。

vsc_02.jpg

すると、新規のVSCodeのウィンドウが立ち上がり、そのVSCodeウィンドウを介してコンテナ内の操作が可能となる。

新規に立ち上がったVSCodeでターミナルを立ち上げxeyesコマンドを実行する。
上手く設定できていれば👀に再会できると思います。

vsc_03.jpg

このGUIアプリですが、Remote Desktopが表示しているみたいです。WSLのLinux ディストリビューション由来と思って拾っているのでしょうか?
この辺の挙動を理解できていない点が危うい気がします。。。

vsc_04.jpg

2.3 補足事項

Windowsの設定

不要かもしれませんが、検証時の「Windowsの機能の有効化または無効化」の状態も載せておきます

kino.jpg

Tips

今回の内容と直接関係ありませんが、この方法でVSCode経由で開発すると、volumeで永続化されたファイルに関しては、コンテナ内で編集した内容が、元ファイルにもリアルタイムに反映されてちょっと感動しました。(よく考えれば当たり前の挙動かもしれませんが)

無題.jpg

3.Docker経由でopencvをGUI表示

別の例としてOpenCV画面をQT5で表示させてみたいと思います。
以下のHPを参考にさせて頂きました。

3.1 ファイルの構成

ローカルファイルの構成

┣━py3/
┃  ┗━Dockerfile
┣━workspace/
┃  ┣━app.py
┃  ┗━lena_san.jpg
┗━docker-compose.yml

  • lena_san.jpgは任意の画像です。ファイル名を変えた場合はapp.pyに記載したファイル名も変える必要があります。
py3/Dockerfile
FROM python:3.10.6-buster

ARG DEBIAN_FRONTEND=noninteractive

RUN apt update && apt install -y \
    libgl1-mesa-dev \
&&  apt clean \
&&  rm -rf /var/lib/apt/lists/*

RUN python3 -m pip install --upgrade pip \
&&  pip install --no-cache-dir \
    numpy \
    opencv-python

workspace/app.py
import cv2

TITLE = "gui show test"
cv2.namedWindow(TITLE, cv2.WINDOW_AUTOSIZE)

img = cv2.imread("lena_san.jpg")
cv2.imshow(TITLE, img)

print("Press Esc key to close ...")
while True:
    if cv2.waitKey(1) == 0x1B:
        break

cv2.destroyAllWindows()
docker-compose.yml
version: "3.9" 
services:
  py3:
    build:
      context: ./py3
      dockerfile: Dockerfile
    volumes:
      - ./workspace:/workspace
    # プロセスを継続させてコンテナの正常終了を防ぐ
    stdin_open: true

3.2 コンテナの作成と起動

2章「VSCodeによるDocke環境の構築」と同じようにVSCode経由でコンテナ内にアクセス、ターミナルで/workspaceにおいてpython app.pyを実行すると以下のように画像が表示されます。

無題.jpg

4.参考

何度やってもError: Can't open display: となり、挫けそうになったときに助けて頂いたHPのリンクです。皆さんも参考にしてください。

Docker Desktopの設定の確認

WSLの導入時のトラブル

WSL2のインストール

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3