我有一个运行 CentOS 7 的 Amazon EC2 实例,其中安装了 docker。我在自定义 docker 网络上运行 docker 容器。
我正在尝试从其中一个 docker 容器访问 Web UI。当我尝试在 Mac 上执行此操作时,以下命令有效:
xhost + $my_ip
docker run -d --rm --name firefox --network myNetwork -e DISPLAY=$my_ip:0 -v /tmp/.X11-unix:/tmp/.X11-unix jess/firefox
然而,如果我只是尝试简单的解决方案并
ssh -Y remote-host docker run -d --rm --name firefox --network myNetwork -e DISPLAY=$my_ip:0 -v /tmp/.X11-unix:/tmp/.X11-unix jess/firefox
它不起作用;很可能是因为remote-host
无权访问$my_ip
。
这篇文章让我更进一步https://dzone.com/articles/docker-x11-client-via-ssh通过解释当您使用 ssh 的 X11 转发时,ssh 实际上是在远程计算机上启动一个“代理”,该代理侦听远程计算机的环回接口。
因此我实际上可以使用这个 dockerfile 从远程主机上的容器内部运行 Firefox:
FROM centos
RUN yum install -y firefox dbus && \
dbus-uuidgen > /var/lib/dbus/machine-id
ENTRYPOINT [ "/usr/bin/firefox" ]
运行后执行以下 docker run 命令ssh -Y remote-host
:
docker run --network host --env="DISPLAY" --volume="$HOME/.Xauthority:/root/.Xauthority:rw" firefox
是啊!但并不完全是。如果我从 更改--network host
为--network myNetwork
它就不再起作用了。因为如上所述,ssh 正在监听主机的环回接口,而 docker 容器不再有权访问该接口。
因此,似乎我唯一能让它工作的方法就是找到某种方法,在设置 X11 转发时告诉 ssh 绑定到除环回之外的接口。这可能吗?
答案1
我找到了另一种方法来实现我的最终目标,即访问其中一个 Docker 容器的 Web UI。我最终通过 SSH 设置了 SOCKS v5 代理。这实际上仅用于开发和调试目的,不应在生产情况下使用。我对在 docker 容器中以 root 身份运行 sshd 的安全隐患不负任何责任。请确保您了解这样做的后果。
我采取的步骤如下。对于此示例,请考虑centosec2
运行 CentOS 的 EC2 服务器、myappcontainer
运行托管我尝试访问的 Web UI 的应用程序的容器的名称以及正在运行的my-net
覆盖网络的名称。myappcontainer
要求:
- 可以配置为通过 SOCKS v5 代理连接的浏览器。我建议使用带有附加组件 FoxyProxy 的 Firefox,因为它可以非常轻松地打开和关闭代理。
- 可以运行的 Docker 镜像
sshd
。我使用了https://hub.docker.com/r/macropin/sshd/
脚步:
将笔记本电脑的端口转发到服务器。在此示例中8888从你的笔记本电脑的角度来看,它将是运行 SOCKS 代理的端口,并且9696将是服务器上的转发端口。
[user@laptop ~]$ ssh -L 8888:localhost:9696 centosec2 -N
在另一个 shell 中,打开与服务器的常规 ssh 会话,然后启动
sshd
容器。确保sshd
容器与运行 Web UI 的容器在同一个网络上运行。[用户@笔记本电脑 ~]$ ssh centosec2 [user@centosec2 ~]$ docker run --rm -d -p 2222:22 --network my-net -v .ssh/id_rsa.pub:/root/.ssh/authorized_keys macropin/sshd
容器启动后
sshd
,使用相同的 shell 通过 ssh 进入sshd
容器,并在转发到笔记本电脑的端口上启动 SOCKS 代理。-D 9696
告诉 ssh 在端口 9696 上启动 SOCKS 服务器。[user@centosec2 ~]$ ssh -D 9696 -p 2222 root@localhost -N
您的笔记本电脑现在可以通过在端口 8888 上运行的 SOCKS 代理访问 docker 网络。配置您选择的浏览器以通过在 上运行的 SOCKS v5 代理连接到互联网
localhost:8888
。然后,您应该能够使用 docker 容器的主机名导航到 Web UIhttp://myappcontainer:8080
虽然需要克服很多困难,但这是我能想到的最简单的方法。希望这能帮助其他人。