Configuración de Docker para Windows y WSL para funcionar sin problemas



En este post se espera que ya tenga WSL configurado. Aunque el demonio de Docker no se puede ejecutar directamente en WSL, puede usar la CLI de Docker para conectarse a un demonio remoto de Docker que se ejecuta a través de Docker para Windows o cualquier otra máquina virtual que cree (en este artículo se tratan ambos métodos).

Si se pregunta «¿por qué no solo ejecutar docker.exe y docker-compose.exe de Docker para Windows directamente en WSL?», esto se debe a un error al ejecutar Docker o Docker Compose de forma interactiva en ese entorno. El TL;DR es que no se puede ejecutar nada en primer plano con el modo interactivo, lo que lo hace inutilizable para el desarrollo web real.

Pero con la CLI de Docker configurada para el host remoto de Docker para Windows es realmente impresionante! Con este método, las aplicaciones rails muy grandes responden en ~100ms (o ~5s cuando tienen que compilar más de 10.000 líneas de Javascript y SCSS). ¡Eso también es con volúmenes montados!

Utilizo esta configuración casi todos los días para las aplicaciones impulsadas por Rails, Flask, Phoenix, Node y Webpack. Es muy sólido en términos de rendimiento y fiabilidad.

Configurar Docker para Windows (Docker Desktop)

En la configuración general, querrá exponer el demonio sin TLS.

Docker para Windows se ha cambiado recientemente a Docker Desktop,por lo que si la configuración se ve ligeramente diferente de la captura de pantalla, no se preocupe. Es lo mismo.

blog/docker-for-windows-expose-daemon-without-tls.jpg

Menciona «usar con precaución» porque cada vez que haces una conexión de red que no está encriptada, vale la pena hablar de ello, pero en este caso es completamente seguro porque nunca nos estamos conectando a ella a través de una red pública.

Esto va a permitir que la instancia WSL local se conecte localmente al demonio de Docker que se ejecuta en Docker para Windows. El tráfico ni siquiera sale de la caja de desarrollo, ya que el demonio solo está enlazado a localhostpor lo que ni siquiera otras máquinas de la red local podrán conectarse. En otras palabras, es muy seguro que estos datos se transmitan a través de texto sin formato.

También es posible que desee compartir las unidades en las que planea que resida el código fuente. Este paso no es necesario, pero mantengo mi código en un HD secundario interno, así que también compartí mi unidad «E». Si lo hace, realice la configuración «Unidades compartidas» y habilítela.

¿No puedes usar Docker para Windows?

¡Esto solo es necesario si NO está ejecutando Docker para Windows!

Querrá configurar su propia máquina virtual para ejecutar Docker. Docker Tip #73 entra en detalles sobre cómo hacerlo e incluso incluye vínculos a vídeos sobre cómo configurar la máquina virtual.

Instale Docker y Docker Compose en WSL

¡Todo el mundo puede seguir este punto!

Todavía necesitamos instalar Docker y Docker Compose dentro de WSL porque nos dará acceso a ambas aplicaciones cli. No nos molestaremos en empezar el demonio de Docker.

Las siguientes instrucciones son para Ubuntu 18.04 / 20.04, pero si utiliza una distribución WSL diferente, puede seguir la guía de instalación de Docker para su distro de los documentos de instalación de Docker.

Instalar Docker

Puede copiar / pegar todos los comandos a continuación en su terminal WSL.

Ubuntu 18.04 / 20.04 notas de instalación tomadas de la documentación de Docker:
# Update the apt package list.
sudo apt-get update -y

# Install Docker's package dependencies.
sudo apt-get install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

# Download and add Docker's official public PGP key.
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# Verify the fingerprint.
sudo apt-key fingerprint 0EBFCD88

# Add the `stable` channel's Docker upstream repository.
#
# If you want to live on the edge, you can change "stable" below to "test" or
# "nightly". I highly recommend sticking with stable!
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

# Update the apt package list (for the new apt repo).
sudo apt-get update -y

# Install the latest version of Docker CE.
sudo apt-get install -y docker-ce

# Allow your user to access the Docker CLI without needing root access.
sudo usermod -aG docker $USER

En este punto debe cerrar el terminal y abrir uno nuevo para poder ejecutar Docker sin sudo. ¡Será mejor que lo hagas ahora!

Instalar Docker Compose

Vamos a instalar Docker Compose usando PIP en lugar del binario precompilado en GitHub porque se ejecuta un poco más rápido (ambas siguen siendo aplicaciones de Python).

# Install Python 3 and PIP.
sudo apt-get install -y python3 python3-pip

# Install Docker Compose into your user's home directory.
pip3 install --user docker-compose

El siguiente paso es asegurarse de que $HOME/.local/bin esté establecido en su $PATH.

Puede comprobar si ya está configurado ejecutando echo $PATH. Dependiendo de la distro WSL que utilice, es posible que vea o no /home/nick/.local/bin (reemplace nick por su nombre de usuario).

Si está ahí, puedes ir y puedes saltar a la siguiente sección de este post.

Si no está allí, querrá agregarlo a su $PATH. Puede hacerlo abriendo su archivo de perfil con nano ~/.profile. A continuación, en cualquier parte del archivo, en una nueva línea, agregue export PATH="$PATH:$HOME/.local/bin" y guarde el archivo.

Por último, ejecute source ~/.profile para activar el nuevo $PATH y confirmar que funciona ejecutando echo $PATH. Deberías verlo allí ahora. ¡hecho!

Configurar WSL para conectarse a Docker para Windows

El siguiente paso es configurar WSL para que sepa cómo conectarse al demonio remoto de Docker que se ejecuta en Docker para Windows (recuerde, está escuchando en el puerto 2375).

Si no usa Docker para Windows y siguió la guía de Docker Tip #73 para crear su propia máquina virtual, probablemente ya lo hizo, lo que significa que puede omitir el siguiente comando.

Conéctese a un demonio remoto de Docker con este 1 revestimiento:

echo "export DOCKER_HOST=tcp://localhost:2375" >> ~/.bashrc && source ~/.bashrc

Eso sólo tiene que añadir la línea de exportación a su archivo .bashrc para que esté disponible cada vez que abra su terminal. Los comandos source recargan la configuración bash para que no tengas que abrir un nuevo terminal ahora mismo para que surta efecto.

Verificar que todo funciona

# You should get a bunch of output about your Docker daemon.
# If you get a permission denied error, close + open your terminal and try again.
docker info

# You should get back your Docker Compose version.
docker-compose --version

Garantizar el trabajo de montajes por volumen

Lo último que tenemos que hacer es configurar las cosas para que el volumen funcione. Esto me tropezó por un tiempo porque echa un vistazo a esto…

Al usar WSL, Docker para Windows espera que proporcione las rutas de volumen en un formato que coincida con esto: /c/Users/nick/dev/myapp.

Pero, WSL no funciona así. En su lugar, utiliza el formato /mnt/c/Users/nick/dev/myapp Honestamente, creo que Docker debería cambiar su camino para usar /mnt/c porque está más claro sobre lo que está pasando, pero esa es una discusión para otro momento.

Para que las cosas funcionen por ahora, tiene 2 opciones. Si está ejecutando Windows 18.03 (primavera de 2018) o más nuevo, puede configurar WSL para que se monte en / en lugar de /mnt y ya está todo listo. Si tienes 17.09 (otoño de 2017) tendrás que hacer otra cosa.

Estas son las instrucciones paso a paso para ambas versiones de Windows:

¿Ejecutando Windows 10 18.03+ o Newer?

En primer lugar, abra un terminal WSL porque necesitamos ejecutar algunos comandos.

Cree y modifique el nuevo archivo de configuración WSL:
sudo nano /etc/wsl.conf

# Now make it look like this and save the file when you're done:
[automount]
root = /
options = "metadata"

Tenemos que establecer root = / porque esto hará que sus unidades montadas en /c o /e en lugar de /mnt/c o /mnt/e.

La línea options = "metadata" no es necesaria, pero corregirá los permisos de carpeta y archivo en los soportes WSL para que todo no sea 777 todo el tiempo dentro de los soportes WSL. Recomiendo encarecidamente que hagas esto!

Una vez que realice esos cambios, cierre la sesión e inicie sesión en Windows para asegurarse de que los cambios surtan efecto. Win + L no es suficiente. Tendrás que hacer un cierre de sesión en toda regla / iniciar sesión.

Si recibes un error la próxima vez que inicies tu terminal WSL no te asustes.

Es un error con 18.03 y se puede solucionar fácilmente. Pulse CTRL + Shift + ECS para abrir el administrador de tareas, vaya a la pestaña «Servicios», busque el servicio «LxssManager» y reinícielo.

Esto parece suceder sólo si cierra la sesión de Windows en lugar de hacer un reinicio completo y probablemente se corregirá en un parche futuro de 18.03+.

Una vez hecho esto, estás listo. Podrás acceder a tus monturas y funcionarán perfectamente con Docker y Docker Compose sin ningún ajuste adicional. Por ejemplo, podrás usar .:/myapp en un archivo docker-compose.yml, etc.

¿Qué emulador de terminal está utilizando?

Si usa ConEmu, entonces querrás asegurarte de actualizar a la versión alfa más reciente (al menos 18.05.06+ que puedes ver en la barra de título de la configuración). Contiene un archivo wslbridge.exe parcheado para admitir un punto de montaje raíz WSL personalizado.

El terminal WSL de Ubuntu predeterminado es compatible con esto de forma predeterminada, por lo que todos son buenos. No sé si otros terminales apoyan esto todavía. Hágamelo saber en los comentarios.

¡Ya terminaste! Puede omitir los pasos de 17.09 a continuación si siguió los pasos anteriores.

¿Ejecutando Windows 10 17.09?

En primer lugar, abra un terminal WSL porque necesitamos ejecutar algunos comandos.

Enlazar puntos de montaje personalizados para corregir las diferencias de Docker para Windows y WSL:
sudo mkdir /c
sudo mount --bind /mnt/c /c

Querrá repetir esos comandos para las unidades que compartió, como d o eetc.

Compruebe que funciona ejecutando: ls -la /c. Debería ver la misma salida exacta que la ejecución ls -la /mnt/c porque /mnt/c está montado en /c.

En este punto eres de oro. Puede utilizar rutas de montaje por volumen como .:/myapp en sus archivos de Docker Compose y todo funcionará como normal. Eso es increíble porque ese formato es lo que los usuarios nativos de Linux y MacOS también utilizan.

Vale la pena señalar que cada vez que ejecute un docker-compose up, querrá asegurarse de navegar primero a la ubicación /c/Users/nick/dev/myapp de lo contrario su volumen no funcionará. En otras palabras, nunca acceda a /mnt/c directamente.

Técnicamente se podía utilizar un enlace simbólico en lugar de un montaje de enlace, pero me han quemado en el pasado cuando se trataba de usar enlaces simbólicos y tener ciertas herramientas no funcionan porque no las siguieron correctamente. Mejor seguro que lo siento aquí.

Sin embargo, siéntase libre de utilizar enlaces simbólicos dentro de WSL para acceder a su montaje de enlace. Por ejemplo, mi carpeta Dev vive todo el camino en /e/Backup/VMs/workstation/home/nick/Dev y no hay manera en heck siempre voy a escribir eso cuando quiera acceder a mis archivos de desarrollo.

Así que dentro de WSL creé un symlink con ln -s /e/Backup/VMs/workstation/home/nick/Dev ~/Dev y ahora sólo puedo escribir cd ~/Dev para acceder a mis archivos y todo funciona.

Configure automáticamente el soporte de enlace:

Desafortunadamente tendrás que ejecutar ese comando sudo mount cada vez que abras un nuevo terminal porque WSL no admite el montaje a través de /etc/fstab todavía (editar: lo hace en 18.09+, pero si estás usando 18.09+ debes seguir los pasos de 18.03+).

Pero podemos evitar esa limitación simplemente montándola en su archivo ~/.bashrc Esto está un poco sucio, pero por lo que sé, creo que esta es la única manera de hacerlo, así que si sabes de una mejor manera, por favor hágamelo saber.

Puede hacerlo con este 1 revestimiento: echo "sudo mount --bind /mnt/c /c" >> ~/.bashrc && source ~/.bashrc y asegúrese de repetir el comando para las unidades adicionales que compartió con Docker para Windows. Por cierto, no necesitas mkdir porque ya lo hicimos.

Sí, lo sé, eso significa que usted será rápido para su contraseña raíz cada vez que abra un terminal, pero podemos evitarlo también porque Linux es genial así.

Permita que el usuario vincule un soporte sin una contraseña raíz:

Para ello, ejecute el comando sudo visudo

Eso debería abrir nano (un editor de texto). Goto la parte inferior del archivo y añadir esta línea: nick ALL=(root) NOPASSWD: /bin/mount, pero reemplace «nick» por su nombre de usuario.

Eso sólo permite a su usuario ejecutar el comando sudo mount sin tener que proporcionar una contraseña. Puede guardar el archivo con CTRL + O, confirmar y salir con CTRL + CTRL + X.

Misión completa. Todos están listos para ganar en la vida mediante Docker para Windows y WSL.

blog/cards/getting-docker-for-windows-and-wsl-working-together.jpg

Una respuesta a “Configuración de Docker para Windows y WSL para funcionar sin problemas

  1. Repuestos Oppo diciembre 16, 2021 / 1:11 pm

    I was suggested this blog by my cousin. I’m not sure whether this post is written by him as no one else know such detailed about my difficulty. You’re incredible! Thanks!

    Me gusta

Deja una respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.