dockerホストとdockerコンテナでX転送して遊んでみた話

参考文献

4.5. X11 転送を使う  
X11でX11 forwarding request failed on channel 0とエラー表示されて、窓が飛んでこない場合  
ssh X Forwarding できないときの対処  
X11 Forwarding  
多段sshを行うときに、ローカルの秘密鍵を参照し続ける  
Linux - X Window System  
Linux - X Window System  
Linux - X Window System  
C.3. X サーバーの設定ファイル  

環境

参考文献は6なんだよな。。

コード表示

[oracle@centos .ssh]$ cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core) 

dockerホスト側(sshクライアント側)でのXserverサービス起動確認

サービス名はgdm.service。centosをインストールするときにGNOME選択して、アドオンにXserver互換オプションチェック入れておいたから、マシン立ち上がったら、サービス自動起動するのかな。

コード表示

[oracle@centos .ssh]$ systemctl status gdm.service
● gdm.service - GNOME Display Manager
   Loaded: loaded (/usr/lib/systemd/system/gdm.service; enabled; vendor preset: enabled)
   Active: active (running) since 日 2019-05-12 16:26:16 JST; 5h 55min ago
 Main PID: 1119 (gdm)
    Tasks: 18
   Memory: 89.4M
   CGroup: /system.slice/gdm.service
           ├─ 1119 /usr/sbin/gdm
           └─21036 /usr/bin/X :0 -background none -noreset -audit 4 -verbose -auth /run/gdm/auth-for-gdm-dIETUH/database -seat seat0 -nolisten tcp vt1

xorgでググる

/etc/X11/配下がたのしそう。

コード表示

[root@centos .ssh]# find / -name "*xorg*"
/usr/share/X11/xorg.conf.d
/usr/share/X11/xkb/rules/xorg.lst
/usr/share/X11/xkb/rules/xorg
/usr/share/X11/xkb/rules/xorg.xml
/etc/X11/xorg.conf.d
/etc/X11/fontpath.d/xorg-x11-fonts-Type1
[oracle@centos X11]$ pwd
/etc/X11
[oracle@centos X11]$ tree -a
.
├── Xmodmap
├── Xresources
├── applnk
├── fontpath.d
│   ├── cjkuni-uming-fonts -> /usr/share/fonts/cjkuni-uming/
│   ├── default-ghostscript -> /usr/share/fonts/default/ghostscript
│   ├── fonts-default -> /usr/share/fonts/default/Type1
│   ├── liberation-fonts -> /usr/share/fonts/liberation
│   ├── xorg-x11-fonts-100dpi:unscaled:pri=30 -> /usr/share/X11/fonts/100dpi
│   ├── xorg-x11-fonts-Type1 -> /usr/share/X11/fonts/Type1
│   └── xorg-x11-fonts-misc:unscaled:pri=10 -> /usr/share/X11/fonts/misc
├── mwm
│   └── system.mwmrc
├── xinit
│   ├── Xclients
│   ├── Xclients.d
│   ├── Xsession
│   ├── xinitrc
│   ├── xinitrc-common
│   ├── xinitrc.d
│   │   ├── 00-start-message-bus.sh
│   │   ├── 10-qt5-check-opengl2.sh
│   │   ├── 50-xinput.sh
│   │   ├── localuser.sh
│   │   ├── xmbind.sh
│   │   └── zz-liveinst.sh
│   ├── xinput.d
│   │   ├── ibus.conf
│   │   ├── none.conf
│   │   ├── xcompose.conf
│   │   └── xim.conf
│   └── xinputrc -> /etc/alternatives/xinputrc
└── xorg.conf.d
    └── 00-keyboard.conf

15 directories, 19 files

manはここ

コード表示

[oracle@centos X11]$ man 5 xorg.conf
[oracle@centos X11]$ man 1 Xorg
[oracle@centos X11]$ man 1 xhost

dockerコンテナ(sshサーバー)からdockerホスト(sshクライアント)へリモートアクセスできるように設定する

ホスト名とかで指定しても、denyされたので、ipで指定してみたらいけた。指定したsshサーバーからのレスポンスを受け取ることができるようにする。

コード表示

[oracle@centos .ssh]$ xhost +192.168.100.101
192.168.100.101 being added to access control list

dockerコンテナ(sshサーバー)にxauthをインストール

dockerホスト側ではxauthは違うレポから提供されているけど、dockerコンテナ側で用意するのはbaseレポから提供されているものでOK。Failed to set locale, defaulting to Cとかでてるけど、環境変数指定していないだけだと思う。そのままでOK。指定しないとCがデフぉみたいな感じ。

コード表示

[root@638ccb67f9ca ssh]# yum install -y xauth
[oracle@centos X11]$ yum list installed | grep xauth
xorg-x11-xauth.x86_64                   1:1.0.9-1.el7                  @anaconda
[oracle@centos X11]$ ssh ssh1
root@192.168.100.101's password: 
Last login: Sun May 12 10:01:50 2019 from gateway
[root@638ccb67f9ca ~]# yum list installed | grep xauth
Failed to set locale, defaulting to C
xorg-x11-xauth.x86_64                   1:1.0.9-1.el7                   @base   

dockerコンテナ内(Xクラインアント)で起動したアプリケーションをdockerホスト(Xサーバー)に転送ないし送信できるように設定する

引っ張ってくる。pullするイメージ。リモートで作業した結果をpullする感じかな。/etc/ssh/で作業するよ。X11Forwarding yesとX11DisplayOffset 10とX11UseLocalhost noがコメントアウトされていないこと。環境変数DISPLAYに転送先のIP指定しておく。設定変更したら、sshdサービス再起動。

コード表示

[oracle@centos .ssh]$ ssh ssh1
root@192.168.100.101's password: 
Last login: Sun May 12 09:25:13 2019 from gateway
[root@638ccb67f9ca ~]# cd /etc/ssh/
[root@638ccb67f9ca ssh]# ll
total 604
-rw-r--r--. 1 root root     581843 Apr 11  2018 moduli
-rw-r--r--. 1 root root       2276 Apr 11  2018 ssh_config
-rw-r-----. 1 root ssh_keys    227 May 12 08:20 ssh_host_ecdsa_key
-rw-r--r--. 1 root root        162 May 12 08:20 ssh_host_ecdsa_key.pub
-rw-r-----. 1 root ssh_keys    387 May 12 08:20 ssh_host_ed25519_key
-rw-r--r--. 1 root root         82 May 12 08:20 ssh_host_ed25519_key.pub
-rw-r-----. 1 root ssh_keys   1679 May 12 08:20 ssh_host_rsa_key
-rw-r--r--. 1 root root        382 May 12 08:20 ssh_host_rsa_key.pub
-rw-------. 1 root root       3907 Apr 11  2018 sshd_config
[root@638ccb67f9ca ssh]# cat /etc/ssh/sshd_config | grep X11
X11Forwarding yes
#X11DisplayOffset 10
#X11UseLocalhost yes
#	X11Forwarding no
[root@638ccb67f9ca ssh]# cp sshd_config org_sshd_config
[root@638ccb67f9ca ssh]# vi /etc/ssh/sshd_config
[root@638ccb67f9ca ssh]# diff sshd_config org_sshd_config
102,103c102,103
< X11DisplayOffset 10
< X11UseLocalhost no
---
> #X11DisplayOffset 10
> #X11UseLocalhost yes
[root@638ccb67f9ca ~]# cat /etc/ssh/sshd_config | grep X11
X11Forwarding yes
X11DisplayOffset 10
X11UseLocalhost no
#	X11Forwarding no
[root@638ccb67f9ca ~]# systemctl restart sshd
[root@638ccb67f9ca ~]# systemctl status sshd
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2019-05-12 13:37:19 UTC; 7s ago
     Docs: man:sshd(8)
           man:sshd_config(5)
 Main PID: 8768 (sshd)
   CGroup: /docker/638ccb67f9caf21a7ad35524eb9c3b09950ca17f7cda1d8f5ee33ad0537d7078/system.slice/sshd.service
           └─8768 /usr/sbin/sshd -D
           ‣ 8768 /usr/sbin/sshd -D

May 12 13:37:19 638ccb67f9ca systemd[1]: Starting OpenSSH server daemon...
May 12 13:37:19 638ccb67f9ca sshd[8768]: Server listening on 0.0.0.0 port 22.
May 12 13:37:19 638ccb67f9ca sshd[8768]: Server listening on :: port 22.
May 12 13:37:19 638ccb67f9ca systemd[1]: Started OpenSSH server daemon.

dockerホストからdockerコンテナに接続してみる

sshで。-vはデバッグオプション。-XがX転送で。-Cが転送量の圧縮だっけな。

コード表示

[oracle@centos .ssh]$ pwd
/home/oracle/.ssh
[oracle@centos .ssh]$ ll
合計 16
-rw-r--r--. 1 oracle docker  352  5月 12 22:56 config
-rw-------. 1 oracle docker 1679  5月 12 17:23 id_rsa
-rw-r--r--. 1 oracle docker  395  5月 12 17:23 id_rsa.pub
-rw-r--r--. 1 oracle docker  531  5月 12 17:37 known_hosts
[oracle@centos .ssh]$ cat c*
Host ssh3
  Hostname 192.168.100.103
  Port 22
  Identityfile ~/.ssh/id_rsa
  User root
  ProxyCommand ssh -W %h:%p 192.168.100.102
Host ssh2
  Hostname 192.168.100.102
  Port 22
  Identityfile ~/.ssh/id_rsa
  User root
  ProxyCommand ssh -W %h:%p 192.168.100.101
Host ssh1
  Hostname 192.168.100.101
  Port 22
  Identityfile ~/.ssh/id_rsa
  User root
[oracle@centos .ssh]$ ssh -vXC ssh1
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017
debug1: Reading configuration data /home/oracle/.ssh/config
debug1: /home/oracle/.ssh/config line 13: Applying options for ssh1
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 58: Applying options for *
debug1: Connecting to 192.168.100.101 [192.168.100.101] port 22.
debug1: Connection established.
debug1: identity file /home/oracle/.ssh/id_rsa type 1
debug1: key_load_public: No such file or directory
debug1: identity file /home/oracle/.ssh/id_rsa-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_7.4
debug1: Remote protocol version 2.0, remote software version OpenSSH_7.4
debug1: match: OpenSSH_7.4 pat OpenSSH* compat 0x04000000
debug1: Authenticating to 192.168.100.101:22 as 'root'
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: algorithm: curve25519-sha256
debug1: kex: host key algorithm: ecdsa-sha2-nistp256
debug1: kex: server->client cipher: chacha20-poly1305@openssh.com MAC:  compression: zlib@openssh.com
debug1: kex: client->server cipher: chacha20-poly1305@openssh.com MAC:  compression: zlib@openssh.com
debug1: kex: curve25519-sha256 need=64 dh_need=64
debug1: kex: curve25519-sha256 need=64 dh_need=64
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: Server host key: ecdsa-sha2-nistp256 SHA256:YJHAd648yfk43PAAx3L0vp0IKhBINaYEEGb53Mxn7pw
debug1: Host '192.168.100.101' is known and matches the ECDSA host key.
debug1: Found key in /home/oracle/.ssh/known_hosts:1
debug1: rekey after 134217728 blocks
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: rekey after 134217728 blocks
debug1: SSH2_MSG_EXT_INFO received
debug1: kex_input_ext_info: server-sig-algs=
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug1: Next authentication method: gssapi-keyex
debug1: No valid Key exchange context
debug1: Next authentication method: gssapi-with-mic
debug1: Unspecified GSS failure.  Minor code may provide more information
No Kerberos credentials available (default cache: KEYRING:persistent:1000)

debug1: Unspecified GSS failure.  Minor code may provide more information
No Kerberos credentials available (default cache: KEYRING:persistent:1000)

debug1: Next authentication method: publickey
debug1: Offering RSA public key: /home/oracle/.ssh/id_rsa
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug1: Next authentication method: password
root@192.168.100.101's password: 
debug1: Enabling compression at level 6.
debug1: Authentication succeeded (password).
Authenticated to 192.168.100.101 ([192.168.100.101]:22).
debug1: channel 0: new [client-session]
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: pledge: exec
debug1: client_input_global_request: rtype hostkeys-00@openssh.com want_reply 0
debug1: Requesting X11 forwarding with authentication spoofing.
debug1: Sending environment.
debug1: Sending env XMODIFIERS = @im=ibus
debug1: Sending env LANG = ja_JP.UTF-8
Last login: Sun May 12 13:51:37 2019 from gateway
[root@638ccb67f9ca ~]# whoami
root
[root@638ccb67f9ca ~]# hostname
638ccb67f9ca
[root@638ccb67f9ca ~]# ip a show eth0
23: eth0@if24:  mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:c0:a8:64:65 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.100.101/24 brd 192.168.100.255 scope global eth0
       valid_lft forever preferred_lft forever

DBUSでXclientとXserver同士を接着させる呪文を唱える

dbus-x11-1.10.24-12.el7.x86_64をいんすこ。

コード表示

[root@638ccb67f9ca ~]# yum provides dbus-launch
Failed to set locale, defaulting to C
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ftp.riken.jp
 * extras: ftp.riken.jp
 * updates: ftp.riken.jp
1:dbus-x11-1.10.24-12.el7.x86_64 : X11-requiring add-ons for D-BUS
Repo        : base
Matched from:
Filename    : /usr/bin/dbus-launch



1:dbus-x11-1.10.24-13.el7_6.x86_64 : X11-requiring add-ons for D-BUS
Repo        : updates
Matched from:
Filename    : /usr/bin/dbus-launch



1:dbus-x11-1.10.24-12.el7.x86_64 : X11-requiring add-ons for D-BUS
Repo        : @base
Matched from:
Filename    : /usr/bin/dbus-launch



[root@638ccb67f9ca ~]# yum list installed | grep dbus*
Failed to set locale, defaulting to C
dbus.x86_64                             1:1.10.24-12.el7                @CentOS 
dbus-glib.x86_64                        0.100-7.el7                     @CentOS 
dbus-libs.x86_64                        1:1.10.24-12.el7                @CentOS 
dbus-python.x86_64                      1.1.1-9.el7                     @CentOS 
dbus-x11.x86_64                         1:1.10.24-12.el7                @base   
[root@638ccb67f9ca ~]# which dbus-launch
/usr/bin/dbus-launch
[root@638ccb67f9ca ~]# eval `dbus-launch --sh-syntax`
debug1: client_input_channel_open: ctype x11 rchan 3 win 65536 max 16384
debug1: client_request_x11: request from 192.168.100.101 52204
debug1: channel 1: new [x11]
debug1: confirm x11
debug1: channel 1: FORCE input drain
[root@638ccb67f9ca ~]# debug1: channel 1: free: x11, nchannels 2

[root@638ccb67f9ca ~]# export DBUS_SESSION_BUS_ADDRESS
[root@638ccb67f9ca ~]# export DBUS_SESSION_BUS_PID
[root@638ccb67f9ca ~echo $DBUS_SESSION_BUS_ADDRESS
unix:abstract=/tmp/dbus-gtDglgmnGA,guid=8131513d6d575324bd5d33555cd827fa
[root@638ccb67f9ca ~]# echo $DBUS_SESSION_BUS_PID
8856
[root@638ccb67f9ca ~]# ps 8856
  PID TTY      STAT   TIME COMMAND
 8856 ?        Ss     0:00 /usr/bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session
[root@638ccb67f9ca ~]# ps aux 
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  43324  3576 ?        Ss   08:20   0:00 /sbin/init
root        17  0.0  0.0  39084  6308 ?        Ss   08:20   0:00 /usr/lib/systemd/systemd-journald
root        30  0.0  0.0  42656  1788 ?        Ss   08:20   0:00 /usr/lib/systemd/systemd-udevd
root       985  0.0  0.0  26508  1840 ?        Ss   08:20   0:00 /usr/lib/systemd/systemd-logind
dbus      1113  0.0  0.0  58104  2340 ?        Ss   08:20   0:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
root      8079  0.0  0.0  57988  1360 ?        Ss   09:50   0:00 /usr/bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session
root      8799  0.0  0.0 112860  4304 ?        Ss   13:50   0:00 /usr/sbin/sshd -D
root      8818  0.0  0.0 155608  6388 ?        Rs   13:58   0:00 sshd: root@pts/0
root      8820  0.0  0.0  15224  1912 pts/0    Ss   13:58   0:00 -bash
root      8856  0.0  0.0  57988   884 ?        Ss   14:04   0:00 /usr/bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session
root      8864  0.0  0.0  55144  1764 pts/0    R+   14:07   0:00 ps aux

Xクライアントアプリをdockerコンテナ側で用意

yumする。xeyesはxorg-x11-apps-7.7-7.el7.x86_64として提供されている。

コード表示

[root@638ccb67f9ca ~]# yum install -y xeyes xterm firefox
[root@638ccb67f9ca ~]# yum provides xeyes        
Failed to set locale, defaulting to C
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ftp.riken.jp
 * extras: ftp.riken.jp
 * updates: ftp.riken.jp
xorg-x11-apps-7.7-7.el7.x86_64 : X.Org X11 applications
Repo        : base
Matched from:
Provides    : xeyes



xorg-x11-apps-7.7-7.el7.x86_64 : X.Org X11 applications
Repo        : @base
Matched from:
Provides    : xeyes
[root@638ccb67f9ca ~]# yum list installed | grep -E "xorg|xterm|firefox"
Failed to set locale, defaulting to C
firefox.x86_64                          60.6.1-1.el7.centos             @updates
xorg-x11-apps.x86_64                    7.7-7.el7                       @base   
xorg-x11-server-utils.x86_64            7.7-20.el7                      @base   
xorg-x11-xauth.x86_64                   1:1.0.9-1.el7                   @base   
xorg-x11-xinit.x86_64                   1.3.4-2.el7                     @base   
xterm.x86_64                            295-3.el7                       @base   

大切なのはdockerコンテナ内(sshサーバ)で、DISPLAYとDBUS_SESSION_BUS_PIDとDBUS_SESSION_BUS_ADDRESSを確認すること

ちょっとかんたんにX転送する場合としない場合、ssh鯖内でeval `dbus-launch –sh-syntax`する場合としない場合で比較してみる

X転送しない場合

コード表示

[oracle@centos .ssh]$ ssh ssh1
root@192.168.100.101's password: 
Last login: Sun May 12 14:25:33 2019 from gateway
[root@638ccb67f9ca ~]# echo $DISPLAY

[root@638ccb67f9ca ~]# echo $DBUS_SESSION_BUS_PID

[root@638ccb67f9ca ~]# echo $DBUS_SESSION_BUS_ADDRESS

[root@638ccb67f9ca ~]# logout
Connection to 192.168.100.101 closed.
[oracle@centos .ssh]$ 

X転送する場合

コード表示

[oracle@centos .ssh]$ ssh -XC ssh1
root@192.168.100.101's password: 
Last login: Sun May 12 14:32:12 2019 from gateway
[root@638ccb67f9ca ~]# echo $DISPLAY
192.168.100.101:10.0
[root@638ccb67f9ca ~]# echo $DBUS_SESSION_BUS_PID

[root@638ccb67f9ca ~]# echo $DBUS_SESSION_BUS_ADDRESS

[root@638ccb67f9ca ~]# logout
Connection to 192.168.100.101 closed.
[oracle@centos .ssh]$ 

X転送してeval `dbus-launch –sh-syntax`もする場合

コード表示

[oracle@centos .ssh]$ ssh -XC ssh1
root@192.168.100.101's password: 
Last login: Sun May 12 14:32:48 2019 from gateway
[root@638ccb67f9ca ~]# eval `dbus-launch --sh-syntax`
[root@638ccb67f9ca ~]# echo $DBUS_SESSION_BUS_PID
8978
[root@638ccb67f9ca ~]# echo $DBUS_SESSION_BUS_ADDRESS
unix:abstract=/tmp/dbus-1bRTlpm0VX,guid=689e9f7764605cb41f5144695cd82ef2
[root@638ccb67f9ca ~]# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  43324  3576 ?        Ss   08:20   0:00 /sbin/init
root        17  0.0  0.0  39084  6344 ?        Ss   08:20   0:00 /usr/lib/systemd/systemd-journald
root        30  0.0  0.0  42656  1788 ?        Ss   08:20   0:00 /usr/lib/systemd/systemd-udevd
root       985  0.0  0.0  26508  1840 ?        Ss   08:20   0:00 /usr/lib/systemd/systemd-logind
dbus      1113  0.0  0.0  58104  2340 ?        Ss   08:20   0:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
root      8079  0.0  0.0  57988  1360 ?        Ss   09:50   0:00 /usr/bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session
root      8799  0.0  0.0 112860  4340 ?        Ss   13:50   0:00 /usr/sbin/sshd -D
root      8856  0.0  0.0  57988   884 ?        Ss   14:04   0:00 /usr/bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session
root      8956  0.0  0.0 155608  6388 ?        Ss   14:33   0:00 sshd: root@pts/0
root      8958  0.0  0.0  15224  1912 pts/0    Ss   14:33   0:00 -bash
root      8978  0.0  0.0  57988   884 ?        Ss   14:34   0:00 /usr/bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session
root      8979  0.0  0.0  55144  1764 pts/0    R+   14:34   0:00 ps aux

Xクライアントでアプリ実行してfin

ぉぉぉ

コード表示

[root@638ccb67f9ca ~]# xeyes &
[2] 8985
[1]   Done                    xeyes
[root@638ccb67f9ca ~]# Warning: locale not supported by C library, locale unchanged
^C
[root@638ccb67f9ca ~]# xterm &
[3] 8986
[2]   Done                    xeyes
[root@638ccb67f9ca ~]# Warning: locale not supported by C library, locale unchanged
^C
[3]+  Done                    xterm
[root@638ccb67f9ca ~]# xterm &
[1] 9005
[root@638ccb67f9ca ~]# Warning: locale not supported by C library, locale unchanged
^C
[1]+  Done                    xterm



あとがき

xtermは便利そ。端末複製できる点がよい。firefoxとかは文字化けの原因しらべよ。Xはちょーたのしい!!!!以上、ありがとうございました。