SSH + X11 転送で接続しているリモートホスト上で走っている Docker コンテナの中で X アプリ (X クライアント) を実行し、その GUI を SSH 接続元のクライアントのディスプレイで表示・操作したい (手元の X サーバと繋げたい)。そのため、Docker コンテナからホスト (SSH サーバ) の SSH X11 転送ポート (6000 + ディスプレイ番号) が見えるようにする。
環境
- Docker 1.12.6
- Docker イメージ: debian:latest
- Docker ホスト・SSH サーバ: Ubuntu 16.04.2 LTS (Kernel 4.4.0-64-generic)
- SSH クライアント: Mac OS X 10.11.6 + XQuartz 2.7.9
手順
-
Docker コンテナを走らせるホストに X11 転送付きで SSH 接続する (
% ssh -Y hoge@fuga
)。 -
Docker コンテナを作成する。このとき (a) コンテナとホストのネットワークインターフェースを共有し (
--net=host
)、(b) ホストの環境変数DISPLAY
をコンテナに渡して (-e DISPLAY=$DISPLAY
)、(c) ホスト側ユーザの .Xauthority をコンテナ側 root (デフォルトユーザ) と共有する (-v $HOME/.Xauthority:/root/.Xauthority:rw
)。% docker run --rm -i -t --net host -e DISPLAY=$DISPLAY \ -v $HOME/.Xauthority:/root/.Xauthority:rw \ debian /bin/bash
-
Docker コンテナ内で X アプリを実行する → 手元の画面に GUI が表示されたら OK
# apt-get update # apt-get install -y x11-apps # xeyes
ちなみに、単純に Docker のホスト・コンテナ間で X サーバとクライアントを繋ぐには、ホストの X サーバがローカルからの接続をすべて受け入れるようにして (% xhost +local:
)、ホストとコンテナで /tmp/.X11-unix を共有して UNIX ドメインソケットでやりとりするのが楽 (ただしセキュリティ的にはアレ)。
% xhost +local:
% docker run --rm -i -t -e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix \
debian /bin/bash