доступ к ssh туннелю хоста из контейнера docker
Используя ubuntu tusty, есть служба, работающая на удаленной машине, к которой я могу получить доступ через переадресацию портов через ssh-туннель из localhost:9999.
У меня работает контейнер docker. Мне нужно получить доступ к этой удаленной службе через туннель хоста, из контейнера.
Я попытался туннелировать от контейнера к хосту с помощью -L 9000:host-ip:9999, а затем получить доступ к сервису через 127.0.0.1:9000 из контейнера не удается подключиться. Чтобы проверить, включено ли отображение порта, я пытался
nc -luv -p 9999 # at host
nc -luv -p 9000 # at container
Следуя этому, Параг. 2 но не было никакой воспринятой коммуникации, даже при выполнении
в контейнере
nc -luv host-ip -p 9000
Я также попытался сопоставить порты через docker run -p 9999:9000, но это сообщает, что привязка не удалась, потому что порт хоста уже используется (из туннеля хоста на удаленную машину, предположительно).
Итак, мои вопросы
1-Как я достигну соединения? Нужно ли мне настроить ssh-туннель к хосту, или это может быть достигнуто с помощью докер порт картографирование в одиночку?
2-Как быстро проверить, что соединение установлено? Предпочтительно через Баш.
Спасибо.
2 ответов:
Я думаю, что вы можете сделать это, добавив
--net=hostк вашему запуску docker. Но Смотрите также этот вопрос: перенаправить порт хоста в контейнер docker
Использование сети хостов в качестве сети для ваших контейнеров через
--net=hostили в docker-compose черезnetwork_mode: hostявляется одним из вариантов, но это имеет, возможно, нежелательный побочный эффект, что (а) вы теперь открываете порты ваших контейнеров в вашей хост-системе и (б) вы больше не можете подключиться к тем контейнерам, которые не сопоставлены с вашей хост-сетью.На мой взгляд, быстрое и более чистое решение в вашем случае-это сделать ваш ssh – туннель доступным для вашей хост-системы, или, точнее говоря, для вашего компьютера. ваш мост
docker0- вместо того, чтобы выставлять ваши контейнеры docker в вашей среде хоста (как предложено в принятом ответе).Чтобы это сработало, извлеките ip, который использует ваш мост
docker0через:ifconfigВы увидите примерно следующее:
docker0 Link encap:Ethernet HWaddr 03:41:4a:26:b7:31 inet addr:172.17.0.1 Bcast:172.17.255.255 Mask:255.255.0.0Теперь вам нужно сказать ssh привязаться к этому ip , чтобы слушать трафик, направленный к порту 9000 через
ssh -L 172.17.0.1:9000:host-ip:9999Без установки bind_address,
:9000будет ли доступен только к интерфейсу loopback вашего хоста, а не непосредственно к вашим контейнерам docker.Наконец, в вашем контейнерном приложении используйте тот же самый
docker0ip для соединения с сервером:172.17.0.1:9000. Например, если у вас есть ...DOT.NET ядро "приложения, которое должно подключиться к удаленной БД, расположенной по адресу:9000, ваша "ConnectionString" будет содержать"server=172.17.0.1,9000;.Теперь трафик, направляемый через ваш
docker0мост, также достигнет вашего ssh-туннеля:)Примечание сбоку: вы также можете привязать свой туннель к
0.0.0.0, который заставит ssh слушать все интерфейсы.
Comments