ようやくコンテナから画面をとることに成功した話

April 2020 · 3 minute read

RockinWoolです。こんにちは。
コロナ怖いですね。自分も結構自粛してますが、なんとなく胸が狭まっているような感覚があるんですよね。まあ気のせいだといいなあ

さて、今回はタイトルの通りDockerコンテナからGuiアプリなどを起動した際にホストコンピュータの方に表示させる方法をついに確立したので、よろこびそのままここに書き込むことにしました。
ちなみに今回も本当の目的は別にあって、その途中で無理に凝った結果生まれたものになります。
しかも本当の目的ではDocker使う必要はどこにもなくて、本当に時間を無駄にしてしまったなあという感じ。
挙句の果てに、いつも通りの「寝てデバッグ」が発動して、5時間頑張るよりも8時間寝る方が解決につながってしまって本当に虚無な時間を過ごしてしまったなあ・・・と。

それでは前置きはこの辺りにして、説明に入って行こうと思います。
今回は某VIMゴリラさん(自分が勝手に呼んでいる)のツイッターを参考にしました(ソースは後で付記します)
それを自分なりにアレンジして以下の3つのファイルを作りました。

  1. Dockerfile
  2. docker-compose.yml
  3. xhost_setup.sh

Dockerfileはコンテナの設計図のようなものと認識しております。今回はGUIというよりかは単なる端末であるxtermを内部で起動できるように作りました↓

FROM ubuntu:18.04
RUN apt update && apt install -y \ 
    xterm \ 
    && rm -rf /var/lib/apt/lists/* 
RUN useradd -m -s /bin/bash RockinWool
USER RockinWool

USERを足しているのは、xhostかなんかがroot権限者だと怒ってきたからだったと思います。やっておいて損はないはずです。
docker-compose.ymlの方は2つ注目すべき部分があります。1つ目は環境変数$DISPLAYをホストと同じものに設定している部分。2つ目は/tmp/.X11-unixディレクトリを共有している部分です。この二つを設定するとホストの画面出力を共有できるようになります。(重要なのはその中のソケットファイルなんだけど、話が長くなるので割愛)

version: "3" 
services: 
  guitest: 
    build: . 
    environment: 
      - "DISPLAY=${DISPLAY}" 
    volumes: 
      - /tmp/.X11-unix:/tmp/.X11-unix 
    command: xterm 

最後になりましたがxhost_setup.shは単にdocker-composeを自動化するものに近いです。自分がdocker-composeになれていないというのが原因です。ちなみにdocker-composeで単一のコンテナを起動したのは今回が初めてだったりします。
それとこのスクリプトではついでのようにxhost+でホスト側の画面をコンテナと共有できるようにしていますが、セキュリティ的にはまずいそうなので、適当なときにxhost-するべきなのかもしれませんね。

docker-compose build
xhost +
docker-compose run --rm guitest

これらを用いて実際に起動するとこんな感じになります・・・というのは次回にします。ここまで見てくださってありがとうございました。