Docker コンテナで x11 アプリを動かす (コンテナからのネットワークアクセス対応)
Docker コンテナ上で動く X11 アプリケーションのウィンドウをディスプレイに表示させる という記事で xeyes を動作させることができたのですが、
以下のように --net host
を指定しています。
$ docker run --rm -it \
--net host \
-e DISPLAY=$DISPLAY \
-v $HOME/.Xauthority:/root/.Xauthority \
xeyes
--net host
は docker host と docker container の間だけで通信できるネットワークを利用します。
なので、 docker container からインターネットに接続したい場合には使用することができません。
この記事では、container からネットワークにアクセスできてかつ X11 アプリを使えるようにします。
Dockerfile
オリジナル との違い
-
xeyes
を直接 CMD で起動していましたが、ネットワークアクセスを試すために/bin/bash
を起動します。 -
bash
を image にインストールします。(ここはテスト目的なので本質とは関係ないです)
conf/Dockerfile
の中身
FROM alpine
RUN apk --no-cache add bash xeyes
CMD ["/bin/bash"]
docker image のビルド
docker build -t xeyes conf
local ユーザーのみ X の接続を許可する
xhost +local:
container の起動
オリジナル との違い
- 環境変数
DISPLAY
にunix${DISPLAY}
を渡す。 -
/tmp/.X11-unix
を-v
でホストと共有する。
docker run --rm -it \
-e DISPLAY=unix${DISPLAY} \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-v $HOME/.Xauthority:/root/.Xauthority \
xeyes
コンテナからのネットワークアクセス確認
bash-5.0# ping www.example.com
PING www.example.com (93.184.216.34): 56 data bytes
64 bytes from 93.184.216.34: seq=0 ttl=51 time=149.040 ms
64 bytes from 93.184.216.34: seq=1 ttl=51 time=172.391 ms
64 bytes from 93.184.216.34: seq=2 ttl=51 time=195.793 ms
^C
--- www.example.com ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 149.040/172.408/195.793 ms
コンテナから x11 アプリを起動
bash-5.0# xeyes
エラーメッセージ
xhost +local:
を実施していない場合、以下のエラーになります。
bash-5.0# xeyes
No protocol specified
Error: Can't open display: unix:0
GitHub
GitHub にこの記事で書いた Dockerfile やスクリプトなどを置いています。