【问题标题】:Same Docker image forwards X11 one host but not on another相同的 Docker 映像将 X11 转发到一台主机但不在另一台主机上
【发布时间】:2017-10-02 21:35:25
【问题描述】:

我创建了一个简单的 Docker 镜像,其中包含 SSH + xeyes。我运行该容器,使用 X11 转发通过 SSH 连接到容器,并希望能够显示 xeyes

我已经在主机 A 上构建并运行了 Docker 容器。当我连接到容器时,它不起作用 Error: Can't open display:

我已经在另一台主机 B 上构建并运行了 Docker 容器。它就像一个魅力。

我不明白其中的区别......

我的 Dockerfile:

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 上,我有一个有效的 .XauthorityDISPLAY。但是,我没有做任何特别的设置来设置它们,所以为什么不将它们设置在 A 的容器上?

最后主机 A 是一台 Linux Mint 18.1 笔记本电脑。主机 B 是 Debian Jessie。

【问题讨论】:

  • 您在主机 A 上是否有 GUI,或者您在命令行模式下运行所有​​ GUI?
  • 我在主机 A 和主机 B 上都有 GUI。
  • 主机 A 上是否有一个名为 xauth 的包?如果没有尝试安装它。
  • 是的,我尝试在 Dockerfile 中添加 xauth。但这仍然是同样的问题。
  • 我看到的唯一区别是:在主机 A 上:Docker 版本 17.06.1-ce 在主机 B 上:Docker 版本 1.12.3

标签: linux docker ssh dockerfile x11-forwarding


【解决方案1】:

在 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

【讨论】:

    猜你喜欢
    • 2017-04-30
    • 2016-11-22
    • 2019-11-20
    • 1970-01-01
    • 2016-05-23
    • 2014-07-19
    相关资源
    最近更新 更多