Ответ 1
Я думаю, вы можете сделать это, добавив --net=host
к вашему проходу докеров. Но см. Также этот вопрос: Переместить порт хоста в контейнер докеров
Используя 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, предпочтительно.
Спасибо.
Я думаю, вы можете сделать это, добавив --net=host
к вашему проходу докеров. Но см. Также этот вопрос: Переместить порт хоста в контейнер докеров
Использование вашей хост-сети в качестве сети для ваших контейнеров через --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;
.
на 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
.