DEV Notes

Docker Toolbox y Virtual Machines

Desde hace un tiempo vengo usando un metodo para dividir entre mi "maquina de trabajo" y "maquina de juegos" (ya que es la misma PC), y el mismo es usar maquinas virtuales para "dividir" las cosas. Obviamente en una VM no voy a poder jugar, entonces en realidad, tengo los entornos de desarrollo en las VM. En mi caso, el entorno de desarrollo era Visual Studio, Visual Studio Code, MS SQL y REDIS. And for a time, that was good. Todo vivia ahi adentro, y cuando dejaba de trabajar, simplemente apagaba la maquina virtual y listo.

Pero la tecnologia sigue avanzando, y hace un par de años salio al mercado Docker. Muchos diran que es la salvacion de los entornos de desarrollo, ya que con 2 o 3 comandos, podes tener algo corriendo sin mucho inconveniente. Pero cuando en la ecuacion tenes Docker + Maquinas Virtuales, la cosa se empieza a complicar.

Yo uso Virtual Box (http://www.virtualbox.org) de Oracle, basicamente porque es gratis 🐀, el host es un Windows 10, y la guest machine es un Windows 10.
Cuando intente instalar Docker en el Windows 10 Pro en la VM de DEV, me dio un error diciendo "No puedo correr", dado que ya esta dentro de una maquina virtual. VirtualBox no soporta maquinas virtuales "anidadas". Lo otro que tambien puede pasarte es que tengas un Windows 10 HOME, que no permite tampoco correr el Docker tradicional.

Entonces, como podemos hacer para correr Docker en este caso? Bueno, habia encontrado varias maneras complicadas, pero ahora hay una forma realmente MUY facil, y se las dejo aca.

  1. Bajar el Docker Toolbox
  2. Instalarlo
  3. Arrancarlo (estar atentos a las confirmaciones de Windows, porque tiene que agregar una interfaz de red y te va a preguntar un par de veces que lo permitas), y una vez que veamos la pantalla de Docker, anotar el IP que esta usando Docker toolbox ip
  4. Ir a nuestro Windows Guest, abrir un CMD como Administrador
  5. Ahora viene la magia! Supongamos que necesitamos acceder a un redis que esta en el docker. Para eso, obviamente, primero instalamos el redis en el Docker haciendo docker pull redis en el Docker Toolbox
  6. Una vez que redis esta corriendo, lo vamos a tener andando en el port 6379 (el default port). Pero esta corriendo en el host, y desde el guest no lo vamos a ver
  7. Aca viene la magia: usando port forwarding, vamos a enviar todo lo que llegue al port 6379 de nuestro localhost dentro del guest al host! Primero, tenemos que abrir un command prompt como Administrador en el guest, y luego ejecutar la siguiente sentencia:
netsh interface portproxy add v4tov4 listenaddress=127.0.0.1 listenport=6379 connectaddress=192.168.99.100 connectport=6379

Lo importante a tener en cuenta es que usemos en connectaddress la misma direccion que nos dio el Docker Toolbox, en este caso 192.168.99.100. 8. Para probarlo, podemos intentar conectarnos al localhost:6379 desde el guest, y verificar que funciona

Finalmente, pueden ejecutar netsh interface portproxy show all para ver todos los port forwardings que tenemos desde el guest al host.

Listen on ipv4:             Connect to ipv4: 
Address         Port        Address         Port 
--------------- ----------  --------------- ---------- 
127.0.0.1       6379         192.168.99.100  6379 

Espero que les haya servido 😊 And keep coding!

9 months ago