¿Reenvío de puertos en docker-machine?
Desde que boot2docker
está obsoleto he cambiado a docker-machine
pero no se como abrir un puerto desde docker-machine
. En boot2docker
podría hacer así:
boot2docker ssh -L 27017:localhost:27017
Esto reenviaría el puerto 27017 de VirtualBox a localhost 27017 siempre y cuando la conexión SSH esté abierta. Tenga en cuenta que no estoy buscando una manera de abrir el puerto de forma permanente en VirtualBox. ¿Cómo puedo lograr esto con docker-machine
?
6 answers
Todavía puede acceder a VBoxManage.comando exe del VirtualBox utilizado por la máquina docker:
VBoxManage controlvm "boot2docker-vm" natpf1 "tcp-port27017,tcp,,27017,,27017";
- Use
docker-machine info
para obtener el nombre de su vm. - use
modifyvm
si la vm aún no se ha iniciado.
Ver un ejemplo práctico en esta respuesta.
Esa es la solución actual, pendiente de la posibilidad de pasar el argumento a docker-machine ssh
: ver problema 691.
La otra solución es no puerto de reenvío, y utilizar directamente el IP de la VM:
$(docker-machine ip default)
Puede confirmar que el reenvío de puertos está configurado correctamente con
VBoxManage showvminfo boot2docker-vm | grep "NIC.* Rule"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-27 15:20:18
Con las versiones recientes de la máquina, simplemente puede hacer (donde por defecto es el nombre de la máquina):
docker-machine ssh default -L 27017:localhost:27017
Esta es una solución más temporal que el cambio de configuración de la VM.
Use la siguiente variación para solo reenviar puertos en un proceso en segundo plano:
docker-machine ssh default -f -N -L 27017:localhost:27017
- -f Solicita a ssh que vaya a segundo plano justo antes de la ejecución del comando.
- - N Permitir comando vacío (útil aquí solo para reenviar puertos)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-18 13:53:31
Puede ssh en la máquina y pasar los argumentos de reenvío de puertos regulares:
ssh docker@$(docker-machine ip default) -L 27017:localhost:27017
La contraseña del usuario de docker es tcuser. (véase https://github.com/boot2docker/boot2docker)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-03 19:29:44
Dado que me cuesta recordar cómo hacer esto, he creado un pequeño script bash llamado pf (que significa "port forward") que te permite hacer:
$ pf 8080
Esto reenviará el puerto acoplable 8080 al puerto host 8080 en segundo plano (añada -f
para que se ejecute en primer plano). Para usar un puerto de host diferente simplemente haga:
$ pf 8090:8080
Que asigna el puerto host 8090 a 8080.
Para detener el reenvío de puertos agregue -s
:
$ pf 8090:8080 -s
(en realidad el puerto host es suficiente también: pf 8090 -s
). Hay otras opciones disponibles, así que echa un vistazo a la página github .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-08 08:20:34
Si no desea la necesidad de usar contraseñas, agregaría que solo debe apuntar a la clave privada.
ssh -L 8080:localhost:8080 -i ~/.docker/machine/machines/default/id_rsa docker@$(docker-machine ip default)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-27 17:00:28
Solo para mejorar en el script la respuesta de @VonC: actualmente si usa Docker Toolbox en macOS X, la máquina VM predeterminada es "default". Así que un script para mapear todo lo expuesto desde el contenedor debería ser como:
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
Si intenta ejecutar varias veces, se debe agregar una instrucción antes de la creación para eliminar la regla existente:
VBoxManage controlvm "default" natpf1 delete "${port_type}-port${port_num}"
En el script se asume que ya tiene puerto reenviar los puertos del contenedor a la máquina virtual.
docker port cassandra
Da salida como:
7000/tcp -> 0.0.0.0:7000
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-12 19:50:03