У меня есть экземпляр Amazon EC2 под управлением CentOS 7 с установленным докером. Я использую Docker-контейнеры в пользовательской Docker-сети.
Я пытаюсь получить доступ к веб-интерфейсу из одного из этих Docker-контейнеров. Следующая команда работает, когда я пытаюсь сделать это на моем 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 объясняя, что когда вы используете пересылку X11 с ssh, ssh фактически запускает «прокси» на удаленном компьютере, который прослушивает интерфейс обратной связи удаленного компьютера.
Так что я могу запустить Firefox из контейнера на удаленном хосте, используя этот dockerfile:
FROM centos
RUN yum install -y firefox dbus && \
dbus-uuidgen > /var/lib/dbus/machine-id
ENTRYPOINT [ "/usr/bin/firefox" ]
и эта команда запуска Docker после запуска ssh -Y remote-host
:
docker run --network host --env="DISPLAY" --volume="$HOME/.Xauthority:/root/.Xauthority:rw" firefox
Ура! Но не совсем. Если я изменю с --network host
в --network myNetwork
это больше не работает. Поскольку, как указано выше, ssh прослушивает интерфейс обратной связи хост-машины, к которому контейнер докера больше не имеет доступа.
Таким образом, похоже, что единственный способ заставить это работать - это найти какой-то способ сказать ssh привязку к интерфейсу, отличному от loopback, при настройке пересылки X11. Это возможно?
источник
GatewayPorts
да на стороне сервераsshd_config
если это сработает?Ответы:
Я нашел другой способ достичь своей конечной цели - получить доступ к веб-интерфейсу одного из контейнеров Docker. Я закончил настройкой SOCKS v5 прокси через SSH. Это действительно предназначено только для целей разработки и отладки и не должно использоваться в производственной ситуации. Я не несу ответственности за последствия безопасности запуска sshd от имени пользователя root в контейнере Docker. Убедитесь, что вы понимаете последствия этого.
Шаги, которые я предпринял, перечислены ниже. Для этого примера рассмотрим
centosec2
мой сервер EC2 работает под управлением CentOS,myappcontainer
имя контейнера, на котором выполняется приложение, в котором размещен веб-интерфейс, к которому я пытаюсь получить доступ, иmy-net
это имя оверлейной сети, котораяmyappcontainer
работает на.Требования:
sshd
, я использовал https://hub.docker.com/r/macropin/sshd/шаги:
Порт перенаправить порт с вашего ноутбука на сервер. В этом примере 8888 будет порт с прокси-сервером SOCKS с точки зрения вашего ноутбука и 9696 будет перенаправленным портом на сервере.
[user@laptop ~]$ ssh -L 8888:localhost:9696 centosec2 -N
В другой оболочке откройте обычный сеанс ssh на сервере, а затем запустите
sshd
контейнер. Убедитесь, чтоsshd
Контейнер работает в той же сети, что и контейнер с веб-интерфейсом.Однажды
sshd
контейнер запускается, используйте ту же оболочку для SSH вsshd
Контейнер и запустите SOCKS прокси на порту, перенаправляемом на ваш ноутбук.-D 9696
говорит ssh запустить сервер SOCKS на порту 9696.[user@centosec2 ~]$ ssh -D 9696 -p 2222 root@localhost -N
Теперь ваш ноутбук может получить доступ к сети докеров через прокси-сервер SOCKS, работающий через порт 8888. Настройте свой браузер для подключения к Интернету через прокси-сервер SOCKS v5, работающий на
localhost:8888
, После этого вы сможете перейти к веб-интерфейсу, используя имя хоста контейнера Dockerhttp://myappcontainer:8080
Это много прыжков, но это был самый простой способ понять, как этого добиться. Надеюсь, это поможет кому-то еще.
источник