¿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?

Author: Johan, 2015-08-24

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)

Como comentó por sdc:

Puede confirmar que el reenvío de puertos está configurado correctamente con

 VBoxManage showvminfo boot2docker-vm | grep "NIC.* Rule" 
 44
Author: VonC,
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)
 21
Author: David,
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)

 17
Author: Stijn,
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 .

 7
Author: Johan,
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)
 3
Author: leonfs,
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
 1
Author: npenkov,
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