Перенаправление портов в докер-машине?

Поскольку boot2docker устарел, я перешел на docker-machine, но не знаю, как открыть порт из docker-machine. В boot2docker я мог бы сделать так:

boot2docker ssh -L 27017:localhost:27017

Это перенаправит порт 27017 с VirtualBox на локальный хост 27017, пока соединение SSH открыто. Обратите внимание, что я не ищу способ постоянно открывать порт в VirtualBox. Как я могу добиться этого с помощью docker-machine?


person Johan    schedule 24.08.2015    source источник


Ответы (6)


Вы по-прежнему можете получить доступ к команде VBoxmanage.exe из VirtualBox, используемого докер-машиной:

VBoxManage controlvm "boot2docker-vm" natpf1 "tcp-port27017,tcp,,27017,,27017";
  • Используйте docker-machine info, чтобы получить имя вашей виртуальной машины.
  • используйте modifyvm, если виртуальная машина еще не запущена.

См. практический пример в этом ответе.


Это текущий обходной путь, ожидающий возможности передать аргумент в docker-machine ssh: см. проблема 691.

Другой обходной путь — не переадресовывать порт и использовать напрямую IP-адрес виртуальной машины:

 $(docker-machine ip default)

Как прокомментировал пользователь sdc:

Вы можете убедиться, что перенаправление портов настроено правильно с помощью

 VBoxManage showvminfo boot2docker-vm | grep "NIC.* Rule" 
person VonC    schedule 24.08.2015
comment
Хотя это работает, это не совсем то, чего я хочу достичь. Я бы предпочел, чтобы настройки не были постоянными (я обновил вопрос, чтобы отразить это). Если это не сработает, я все равно благодарен за ваш ответ. - person Johan; 24.08.2015
comment
@Johan Я отредактировал ответ, чтобы объяснить, почему я предложил переадресацию портов виртуальной машины вместо ssh. - person VonC; 24.08.2015
comment
Большой!! Большое спасибо. - person Johan; 24.08.2015
comment
Вы можете убедиться, что переадресация портов настроена правильно с помощью VBoxManage showvminfo boot2docker-vm | grep "NIC.* Rule" - person sdc; 27.08.2017
comment
@sdc Спасибо. Я включил ваш комментарий в ответ для большей наглядности. - person VonC; 27.08.2017

С последними версиями машины вы можете просто сделать (где по умолчанию — это имя машины):

docker-machine ssh default -L 27017:localhost:27017

Это более временное решение, чем изменение конфигурации ВМ.

Используйте следующий вариант, чтобы перенаправлять порты только в фоновом процессе:

docker-machine ssh default -f -N -L 27017:localhost:27017
  • -f Запрашивает переход ssh в фоновый режим непосредственно перед выполнением команды.
  • -N Разрешить пустую команду (полезно только для перенаправления портов)
person David    schedule 02.01.2016
comment
пытаюсь выполнить docker-machine ssh default -N -L 80:localhost:80 и получаю ошибку: Privileged ports can only be forwarded by root. exit status 255 - person Oleksandr Diudiun; 02.03.2016
comment
также, если я попытаюсь sudo docker-machine ssh default -N -L 80:localhost:80, у меня будет другое уведомление machine does not exist - person Oleksandr Diudiun; 02.03.2016
comment
@noonehos, как я сказал в своем ответе, по умолчанию — это имя машины. Найдите свой, набрав docker-machine ls. - person David; 04.03.2016
comment
С версией Boot2Docker 1.11.2 и версией docker-machine 0.7.0, build a650a40 я получил эту ошибку: sh: illegal option -L... - person Anthony O.; 17.06.2016
comment
Привет Энтони, я получил ту же ошибку sh: недопустимая опция -L . Могу ли я узнать решение для этого? - person dhinar; 23.03.2018

Вы можете подключиться к машине по ssh и передать обычные аргументы переадресации портов:

ssh docker@$(docker-machine ip default) -L 27017:localhost:27017

Пароль пользователя docker — tcuser. (см. https://github.com/boot2docker/boot2docker)

person Stijn    schedule 03.10.2015
comment
Спасибо, очень полезно. Кстати, в большинстве систем порт 27017 будет привязан только к локальному адаптеру обратной связи, то есть к нему нельзя будет получить доступ снаружи хоста. Используйте ssh docker@$(docker-machine ip default) -L 1.2.3.4:27017:localhost:27017, чтобы показать его внешнему миру, где 1.2.3.4 — локальный IP-адрес. - person Andrew Ferrier; 11.11.2015
comment
Можно ли перенаправить несколько портов с помощью docker-machine ssh? например. -L 27017:локальный:27017 -L 3000:локальный:3000 - person majorBummer; 06.05.2016

Поскольку мне трудно вспомнить, как это сделать, я создал небольшой скрипт bash под названием pf (что означает «переадресация порта»), что позволяет вам:

$ pf 8080

Это переадресует порт док-станции 8080 на хост-порт 8080 в фоновом режиме (добавьте -f, чтобы он работал на переднем плане). Чтобы использовать другой хост-порт, просто выполните:

$ pf 8090:8080

который сопоставляет хост-порт 8090 с 8080.

Чтобы остановить переадресацию портов, добавьте -s:

$ pf 8090:8080 -s

(на самом деле достаточно и хост-порта: pf 8090 -s). Доступны и другие варианты, поэтому зайдите на страницу github.

person Johan    schedule 08.04.2016

Если вы не хотите использовать пароли, я бы добавил, что вам нужно просто указать закрытый ключ.

ssh -L 8080:localhost:8080 -i ~/.docker/machine/machines/default/id_rsa docker@$(docker-machine ip default)
person leonfs    schedule 27.10.2015

Просто чтобы улучшить в сценарии ответ @VonC - в настоящее время при использовании Docker Toolbox в MacOS X машина виртуальной машины по умолчанию является «по умолчанию». Таким образом, скрипт для сопоставления всех выставленных из контейнера должен выглядеть так:

for port in `docker port cassandra | cut -d'-' -f1`; 
do 
    port_num=`echo ${port} | cut -d'/' -f1`
    port_type=`echo ${port} | cut -d'/' -f2`
    echo "Create rule natpf1 for ${port_type} port ${port_num}"
    VBoxManage controlvm "default" natpf1 "${port_type}-port${port_num},${port_type},,${port_num},,${port_num}"
done

если вы пытаетесь выполнить несколько раз, перед созданием следует добавить оператор для удаления существующего правила:

VBoxManage controlvm "default" natpf1 delete "${port_type}-port${port_num}"

В сценарии предполагается, что вы уже перенаправили порты из контейнера на виртуальную машину.

docker port cassandra

дает вывод, например:

7000/tcp -> 0.0.0.0:7000
person npenkov    schedule 12.01.2016
comment
ПРИМЕЧАНИЕ: сценарий предполагает, что имя работающего контейнера — cassandra — в цикле for. (докер-порт Кассандра) - person npenkov; 12.01.2016