Доступ к узлу хоста ssh из контейнера докеров

Используя ubuntu tusty, на удаленном компьютере работает служба, через которую я могу получить доступ через переадресацию через туннель ssh из localhost:9999.

У меня работает контейнер докеров. Мне нужно получить доступ к этой удаленной службе через туннель хоста из контейнера.

Я попробовал туннелирование из контейнера на хост с -L 9000:host-ip:9999, а затем доступ к сервису через 127.0.0.1:9000 из контейнера не удалось подключиться. Чтобы проверить, включено ли отображение портов, я попробовал nc -luv -p 9999 # at host nc -luv -p 9000 # at container

после this, parag. 2, но не было воспринятого сообщения, даже когда nc -luv host-ip -p 9000 в контейнере

Я также попытался сопоставить порты с помощью docker run -p 9999:9000, но это сообщает о том, что привязка завершилась неудачно, поскольку хост-порт уже используется (предположительно, из туннеля хоста на удаленную машину).

Итак, мои вопросы

1 - Как мне достичь соединения? Нужно ли мне настроить туннель ssh на хост, или это может быть достигнуто только с помощью сопоставления портов докеров?

2 - Какой быстрый способ проверить соединение? Через bash, предпочтительно.

Спасибо.

Ответ 2

Использование вашей хост-сети в качестве сети для ваших контейнеров через --net=host или в docker-compose через network_mode: host является одним из вариантов, но это имеет нежелательный побочный эффект: (а) вы теперь выставляете порты контейнера в вашей хост-системе и (б) что вы больше не можете подключаться к тем контейнерам, которые не сопоставлены с вашей хост-сетью.

В вашем случае быстрое и более чистое решение состояло бы в том, чтобы сделать ваш ssh-туннель "доступным" для ваших докер-контейнеров (например, связав ssh с мостом docker0) вместо того, чтобы выставлять ваши док-контейнеры в вашей хост-среде (как это предлагается в принят ответ).

Настройка туннеля:

Чтобы это работало, найдите 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

Без установки адреса привязки, :9000 будет только доступным для интерфейса обратной связи вашего хоста, а не для ваших док-контейнеров.

Примечание: вы также можете привязать свой туннель к 0.0.0.0, что заставит ssh прослушивать все интерфейсы.

Настройка вашего приложения:

В вашем контейнерном приложении используйте тот же ip docker0 для подключения к серверу: 172.17.0.1:9000. Теперь трафик, проходящий через ваш мост docker0, также достигнет вашего ssh-туннеля:)

Например, если у вас есть приложение "DOT.NET Core", которому необходимо подключиться к удаленной базе данных, расположенной в :9000, ваша "ConnectionString" будет содержать "server=172.17.0.1,9000;.

Ответ 3

на MacOS (протестировано в v19.03.2),

1) создать туннель на хосте

ssh -i key.pem [email protected]_server -L 3336:mysql_host:3306 -N

2) из контейнера вы можете использовать host.docker.internal или docker.for.mac.localhost или docker.for.mac.host.internal для ссылки на хост.

пример,

mysql -h host.docker.internal -P 3336 -u admin -p

заметка из официального документа Docker-для-Mac

Я ХОЧУ ПОДКЛЮЧИТЬ ОТ КОНТЕЙНЕРА К СЕРВИСУ НА ХОЗЯЙСТВЕ

Хост имеет изменяющийся IP-адрес (или не имеет, если у вас нет доступа к сети). С 18.03 года мы рекомендуем подключаться к специальному DNS имя host.docker.internal, которое разрешает внутренний IP-адрес используется хостом. Это для целей разработки и не будет работать в производственная среда вне Docker Desktop для Mac.

Шлюз также доступен как gateway.docker.internal.