表記の通り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アプリの表示が可能か動作確認を行います。
ここでは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
問題がなければ以下のように👀が表示されます。
確認が終わったら、全部閉じてしまって構いません。
(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デスクトップに表示してくれるようになるみたいです。
この仕組みが良く理解できていません。今後、仕様の変更などで無効な手順になる可能性もあると思います。その際はご了承ください。
以上で事前環境の準備は完了です。
2.VSCodeによるDocke環境の構築
Windows上のVSCode
を使ってGUIアプリ動作検証用のDockerイメージを作ります。
VSCode
に以下のextensionを導入している前提で進めます。
- Dev Containers
- Docker
- WSL (←これは不要かも?)
2.1 ファイルの構成
使用するファイルの構成は以下の通りです。Windowsの任意のフォルダに以下のファイルを格納し、VSCode
でそのフォルダを開いてください。
┣━workspace/
┃ ┗━test.txt
┣━Dockerfile
┗━docker-compose.yml
Hello!
FROM ubuntu:latest
RUN apt-get update
RUN apt-get install -y x11-apps
# ディレクトリがない場合は自動で作成される
WORKDIR /workspace
version: '3'
services:
# サービス名
xeyetes:
# カレントディレクトリでイメージを構築
build: .
# データを永続化
volumes:
- ./workspace:/workspace
# プロセスを継続させてコンテナの正常終了を防ぐ
stdin_open: true
- 「stdin_open: true」が無いと直ぐにコンテナが閉じてしまってテストできない
2.2 コンテナの作成と起動
VSCode
上でdocker-compose.yml
を右クリックし、Compose Up
を選択。
その後、左サイドバーのDockerアイコンをクリックし、対象となるコンテナを選んで右クリック、Attach Visual Studio Code
を選ぶ。
すると、新規のVSCode
のウィンドウが立ち上がり、そのVSCode
ウィンドウを介してコンテナ内の操作が可能となる。
新規に立ち上がったVSCode
でターミナルを立ち上げxeyes
コマンドを実行する。
上手く設定できていれば👀に再会できると思います。
このGUIアプリですが、Remote Desktop
が表示しているみたいです。WSL
のLinux ディストリビューション由来と思って拾っているのでしょうか?
この辺の挙動を理解できていない点が危うい気がします。。。
2.3 補足事項
Windowsの設定
不要かもしれませんが、検証時の「Windowsの機能の有効化または無効化」の状態も載せておきます
Tips
今回の内容と直接関係ありませんが、この方法でVSCode
経由で開発すると、volumeで永続化されたファイルに関しては、コンテナ内で編集した内容が、元ファイルにもリアルタイムに反映されてちょっと感動しました。(よく考えれば当たり前の挙動かもしれませんが)
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
に記載したファイル名も変える必要があります。
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
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()
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
を実行すると以下のように画像が表示されます。
4.参考
何度やってもError: Can't open display:
となり、挫けそうになったときに助けて頂いたHPのリンクです。皆さんも参考にしてください。
Docker Desktopの設定の確認
WSLの導入時のトラブル
WSL2のインストール