Переадресация портов в докер-машине?
Так как boot2docker
устарел, я переключился на docker-machine
, но я не знаю, как открыть порт из docker-machine
. В boot2docker
я мог бы сделать так:
boot2docker ssh -L 27017:localhost:27017
Это перенаправляет порт 27017 из VirtualBox на localhost 27017, пока соединение SSH открыто. Обратите внимание, что я не ищу способ постоянно открывать порт в VirtualBox. Как я могу достичь этого с помощью docker-machine
?
Ответы
Ответ 1
Вы все равно можете получить доступ к команде VBoxmanage.exe из VirtualBox, используемой докерной машиной:
VBoxManage controlvm "boot2docker-vm" natpf1 "tcp-port27017,tcp,,27017,,27017";
- Используйте
docker-machine info
, чтобы получить имя вашего vm.
- используйте
modifyvm
, если vm еще не запущен.
См. практический пример в этом ответе.
Это текущее обходное решение, ожидающее возможности передать аргумент docker-machine ssh
: см. issue 691.
Другим обходным решением является не переадресация порта и использование непосредственно IP-адреса виртуальной машины:
$(docker-machine ip default)
Как прокомментировал sdc:
Вы можете подтвердить правильность настройки переадресации портов с помощью
VBoxManage showvminfo boot2docker-vm | grep "NIC.* Rule"
Ответ 2
В последних версиях машины вы можете просто сделать (где по умолчанию указано имя машины):
docker-machine ssh default -L 27017:localhost:27017
Это более временное решение, чем изменение конфигурации виртуальной машины.
Используйте следующий вариант для переадресации портов в фоновом режиме:
docker-machine ssh default -f -N -L 27017:localhost:27017
- -f Запрашивает ssh для перехода к фону непосредственно перед выполнением команды.
- -N Разрешить пустую команду (полезно здесь только для переадресации портов)
Ответ 3
Вы можете отправить ssh в машину и передать аргументы перенаправления обычного порта:
ssh [email protected]$(docker-machine ip default) -L 27017:localhost:27017
Пароль пользователя docker - tcuser. (см. https://github.com/boot2docker/boot2docker)
Ответ 4
Поскольку мне трудно запоминать, как это сделать, я создал небольшой bash script, называемый pf (что означает "port forward" ), который позволяет:
$ pf 8080
Это приведет к переходу порта 8080 докера на хост порт 8080 в фоновом режиме (добавьте -f
, чтобы он запускался на переднем плане). Использовать другой хост-порт:
$ pf 8090:8080
который отображает хост-порт 8090 на 8080.
Чтобы остановить переадресацию порта, добавьте -s
:
$ pf 8090:8080 -s
(фактически достаточно хост-порт: pf 8090 -s
). Существуют и другие доступные варианты, поэтому посмотрите github.
Ответ 5
Если вы не хотите использовать пароли, я бы добавил, что вы должны просто указать на закрытый ключ.
ssh -L 8080:localhost:8080 -i ~/.docker/machine/machines/default/id_rsa [email protected]$(docker-machine ip default)
Ответ 6
Просто чтобы увеличить в script ответ @VonC - в настоящее время, если вы используете Docker Toolbox на MacOS X, по умолчанию машина VM является "по умолчанию". Таким образом, script для отображения всех экспонатов из контейнера должен выглядеть так:
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}"
В script предполагается, что вы уже переносите порты из контейнера в виртуальную машину.
docker port cassandra
дает вывод, например:
7000/tcp -> 0.0.0.0:7000