访问在远程主机上运行的 Docker 容器中运行的 Web UI

访问在远程主机上运行的 Docker 容器中运行的 Web UI

我有一个运行 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/

脚步:

  1. 将笔记本电脑的端口转发到服务器。在此示例中8888从你的笔记本电脑的角度来看,它将是运行 SOCKS 代理的端口,并且9696将是服务器上的转发端口。

    [user@laptop ~]$ ssh -L 8888:localhost:9696 centosec2 -N

  2. 在另一个 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
    
  3. 容器启动后sshd,使用相同的 shell 通过 ssh 进入sshd容器,并在转发到笔记本电脑的端口上启动 SOCKS 代理。-D 9696告诉 ssh 在端口 9696 上启动 SOCKS 服务器。

    [user@centosec2 ~]$ ssh -D 9696 -p 2222 root@localhost -N

  4. 您的笔记本电脑现在可以通过在端口 8888 上运行的 SOCKS 代理访问 docker 网络。配置您选择的浏览器以通过在 上运行的 SOCKS v5 代理连接到互联网localhost:8888。然后,您应该能够使用 docker 容器的主机名导航到 Web UIhttp://myappcontainer:8080

虽然需要克服很多困难,但这是我能想到的最简单的方法。希望这能帮助其他人。

相关内容