相同 Docker 图像在一台主机上转发 X11 但在另一台主机上不转发
Same Docker image forwards X11 one host but not on another
我创建了一个简单的 Docker 图像,其中包含 SSH + xeyes。我 运行 那个容器,使用 X11 转发通过 SSH 连接到容器并希望能够显示 xeyes.
我已经在主机 A 上构建并 运行 Docker 容器。当我连接到容器时,它不起作用 Error: Can't open display:
我已经在另一台主机 B 上构建并 运行 Docker 容器。它的效果非常好。
我不明白其中的区别...
我的Docker文件:
FROM ubuntu:16.04
ENV SSH_PASSWORD "rootpass"
RUN apt-get update
RUN apt-get install -qqy x11-apps openssh-server ssh
# Install SSH access
RUN mkdir /var/run/sshd
RUN echo "root:$SSH_PASSWORD" | chpasswd
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
CMD [ "/usr/sbin/sshd", "-D" ]
EXPOSE 22
在主机 A 和 B 上,我这样做:
- 使用
docker build -t myeyes .
构建图像
- 运行 容器:
docker run -d -p 7222:22 --name myeyes myeyes
.
然后,我从另一台主机 C 执行 xhost +
并尝试这些容器:
对于 A 上的容器失败:
$ ssh -X -p 7222 root@IP-of-A
...
# env | grep DISPLAY
# xeyes
Error: Can't open display:
# grep X11Forward /etc/ssh/sshd_config
X11Forwarding yes
# ls -al
-rw------- 1 root root 180 Sep 29 09:32 .bash_history
-rw-r--r-- 1 root root 3106 Oct 22 2015 .bashrc
drwx------ 2 root root 4096 Sep 29 09:04 .cache
-rw-r--r-- 1 root root 148 Aug 17 2015 .profile
对于 B 上的容器有效:
$ ssh -X -p 7222 root@IP-of-B
...
# env | grep DISPLAY
DISPLAY=localhost:10.0
# grep X11Forward /etc/ssh/sshd_config
X11Forwarding yes
# ls -al
-rw------- 1 root root 58 Sep 29 09:34 .Xauthority
-rw------- 1 root root 59 Sep 29 09:33 .bash_history
-rw-r--r-- 1 root root 3106 Oct 22 2015 .bashrc
drwx------ 2 root root 4096 Sep 29 09:21 .cache
-rw-r--r-- 1 root root 148 Aug 17 2015 .profile
# cat .Xauthority
...
MAGIC COOKIE
...
# xeyes
请注意,在 B 上,我有一个有效的 .Xauthority 和 DISPLAY。但是,我没有做任何特别的设置,所以 为什么不将它们设置在 A 的容器上?
最后主机 A 是一台 Linux Mint 18.1 笔记本电脑。主机 B 是 Debian Jessie。
在 ssh 中启用详细信息,我注意到以下消息:
debug2: x11_get_proto: /usr/bin/xauth list :0 2>/dev/null
debug1: Requesting X11 forwarding with authentication spoofing.
...
X11 forwarding request failed on channel 0
然后我在网上搜索 "X11 forwarding request failed on channel 0" 并 找到了解决方案 :在 /etc/ssh/sshd_config 中添加:
X11UseLocalhost no
并且 然后 ssh -X 在任何地方都可以正常工作。
因此,必须将此命令添加到我的容器的 Dockerfile 中:
RUN echo "X11UseLocalhost no" >> /etc/ssh/sshd_config
我创建了一个简单的 Docker 图像,其中包含 SSH + xeyes。我 运行 那个容器,使用 X11 转发通过 SSH 连接到容器并希望能够显示 xeyes.
我已经在主机 A 上构建并 运行 Docker 容器。当我连接到容器时,它不起作用 Error: Can't open display:
我已经在另一台主机 B 上构建并 运行 Docker 容器。它的效果非常好。
我不明白其中的区别...
我的Docker文件:
FROM ubuntu:16.04
ENV SSH_PASSWORD "rootpass"
RUN apt-get update
RUN apt-get install -qqy x11-apps openssh-server ssh
# Install SSH access
RUN mkdir /var/run/sshd
RUN echo "root:$SSH_PASSWORD" | chpasswd
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
CMD [ "/usr/sbin/sshd", "-D" ]
EXPOSE 22
在主机 A 和 B 上,我这样做:
- 使用
docker build -t myeyes .
构建图像
- 运行 容器:
docker run -d -p 7222:22 --name myeyes myeyes
.
然后,我从另一台主机 C 执行 xhost +
并尝试这些容器:
对于 A 上的容器失败:
$ ssh -X -p 7222 root@IP-of-A
...
# env | grep DISPLAY
# xeyes
Error: Can't open display:
# grep X11Forward /etc/ssh/sshd_config
X11Forwarding yes
# ls -al
-rw------- 1 root root 180 Sep 29 09:32 .bash_history
-rw-r--r-- 1 root root 3106 Oct 22 2015 .bashrc
drwx------ 2 root root 4096 Sep 29 09:04 .cache
-rw-r--r-- 1 root root 148 Aug 17 2015 .profile
对于 B 上的容器有效:
$ ssh -X -p 7222 root@IP-of-B
...
# env | grep DISPLAY
DISPLAY=localhost:10.0
# grep X11Forward /etc/ssh/sshd_config
X11Forwarding yes
# ls -al
-rw------- 1 root root 58 Sep 29 09:34 .Xauthority
-rw------- 1 root root 59 Sep 29 09:33 .bash_history
-rw-r--r-- 1 root root 3106 Oct 22 2015 .bashrc
drwx------ 2 root root 4096 Sep 29 09:21 .cache
-rw-r--r-- 1 root root 148 Aug 17 2015 .profile
# cat .Xauthority
...
MAGIC COOKIE
...
# xeyes
请注意,在 B 上,我有一个有效的 .Xauthority 和 DISPLAY。但是,我没有做任何特别的设置,所以 为什么不将它们设置在 A 的容器上?
最后主机 A 是一台 Linux Mint 18.1 笔记本电脑。主机 B 是 Debian Jessie。
在 ssh 中启用详细信息,我注意到以下消息:
debug2: x11_get_proto: /usr/bin/xauth list :0 2>/dev/null
debug1: Requesting X11 forwarding with authentication spoofing.
...
X11 forwarding request failed on channel 0
然后我在网上搜索 "X11 forwarding request failed on channel 0" 并 找到了解决方案 :在 /etc/ssh/sshd_config 中添加:
X11UseLocalhost no
并且 然后 ssh -X 在任何地方都可以正常工作。
因此,必须将此命令添加到我的容器的 Dockerfile 中:
RUN echo "X11UseLocalhost no" >> /etc/ssh/sshd_config