Instalación y configuración de Docker en Windows Subsystem Linux (WSL)

Prerrequisitos


Antes de comenzar, asegúrese de que su sistema tenga aproximadamente la siguiente configuración:

  • Windows 10 versión 1803 compilación 1734 y posterior
  • Ubuntu para WSL 16.0.4 LTS o algo así (su versión puede variar ligeramente)

Es importante que la versión y compilación de Windows no sea inferior a la indicada aquí. El hecho es que, comenzando con estos números, se han realizado cambios fundamentales en el kernel de Windows WSL que permiten el uso de cgroups (grupos de control - agregados al kernel de Linux en 2008). Y son necesarios para que Docker administre los recursos de su sistema en contenedores.



Instalar Docker-CE 09.17.0


Instalaremos Docker Community Edition 17.09.0 (porque al momento de escribir esto, las versiones más recientes han caído cuando se instalaron en WSL).

Lo primero que haremos es deshacernos de todas las instalaciones anteriores de Docker (si las hubiera). Para hacer esto, ejecuta el terminal bash y escribe lo siguiente:

$ sudo apt-get remove docker docker-engine docker.io containerd runc


Ahora instale el repositorio para Docker CE. A través de apt-get, podemos instalar la versión necesaria sin tener que construirla desde las fuentes nosotros mismos. Siguiendo las recomendaciones del sitio web oficial de Docker, escribimos los siguientes comandos:

#   
$ sudo apt-get update
#   ,   apt    HTTPS
$ sudo apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common

#      GPG   Docker
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
#  Docker   :
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

#        Docker    
$ sudo apt-get update

Si alguna vez ha agregado un nuevo repositorio usando apt, todo esto le resulta familiar en general. Si no, espero que aún te quedes conmigo :)

A continuación, instala Docker:

$ sudo apt-get install docker-ce=17.09.0~ce-0~ubuntu

Si no está utilizando WSL al estilo Ubuntu, la lista de versiones disponibles puede verse así:

$ apt list -a docker-ce


... o use un comando similar de alguna otra biblioteca si abandonó APT.

Al final, debe agregar su usuario actual al grupo Docker para poder usar correctamente el motor Docker, que debería estar ejecutándose en su sistema con como raíz

sudo usermod -aG docker $USER

Ejecutando Docker en Windows


Ahora que Docker está instalado, necesitamos usar un método bastante complicado para iniciarlo como un servicio en WSL cada vez que iniciamos Windows. Esto no es tan fácil como parece. Necesitamos actuar en nombre del superusuario y ejecutar el shell de comandos con privilegios elevados, lo que complica un poco la tarea.

Para simplificar un poco el proceso, cree un nuevo archivo en / usr / local / sbin / , un script que contiene los comandos apropiados para iniciar el servicio Docker:

$ sudo nano /usr/local/sbin/start_docker.sh

con los siguientes contenidos:

#!/usr/bin/env bash
sudo cgroups-mount
sudo service docker start

El primer comando sudo es montar cgroups (se ejecutará al reiniciar), y el segundo le da el servicio docker a systemd (este es el subsistema de Ubuntu para inicializar y administrar servicios).

Ahora deje que el script se ejecute y ejecútelo:

$ sudo chmod +x /usr/local/sbin/start_docker.sh
#  
$ sudo chmod 755 /usr/local/sbin/start_docker.sh
$ /bin/sh /usr/local/sbin/start_docker.sh

Sin embargo, el servicio Docker no se iniciará por dos razones:

  1. El script realiza llamadas como superusuario, por lo que el script en sí debe ejecutarse con privilegios de superusuario para que funcione según lo previsto. En teoría, hacer esto es tan simple como escribir cualquier comando sudo, pero para esto, el usuario debe ingresar sus datos después de cada descarga, lo cual es muy molesto.
  2. El primer comando para montar cgroups debe ejecutarse en bash con privilegios elevados. Para ejecutarlo sin la intervención del usuario, tenemos que usar el Programador de tareas de Windows.

¿Todo claro? Entonces al punto ...

Ejecutar un script con privilegios de root sin entrada del usuario


En la familia de sistemas operativos Linux, el archivo / etc / sudoers determina quién y qué puede ejecutarse con privilegios de superusuario. Modifíquelo para que su usuario pueda llamar al script sin tener que ingresar constantemente la contraseña de root. (¡Pero tenga mucho cuidado con este archivo! ¡Es muy fácil desconectarse del sistema si no sabe lo que está haciendo!)

$ sudo nano /etc/sudoers

Agregue una nueva línea al final del archivo. En este caso, debe conocer su nombre de usuario exactamente (ejecute echo $ USER, si no está seguro):

<your username here> ALL=(ALL:ALL) NOPASSWD: /bin/sh /usr/local/sbin/start_docker.sh

Ahora podemos iniciar el servicio Docker como root sin intervención del usuario:

$ sudo /bin/sh /usr/local/sbin/start_docker.sh 

¡Hurra, camaradas!

Inicio apropiado de Docker en el arranque de Windows


Ahora, cuando se inicia el sistema, podremos iniciar Docker como administrador utilizando un comando separado que no requiere la interacción del usuario.



Inicie el Programador de tareas de Windows y seleccione la Biblioteca del Programador de tareas en el panel izquierdo. Luego seleccione Crear tarea en el panel derecho.



A continuación, se le pedirá que edite la configuración básica de la tarea. Dé un nombre claro a su tarea y asegúrese de que el resto de la configuración coincida con la mía. Es importante que seleccione Ejecutar con los más altos privilegios .



En la pestaña Activadores , agregue un nuevo activador que comenzará la tarea tan pronto como el usuario local inicie sesión.



Cambiando a la pestaña Acciones , crea una nueva acción que ejecutará bash e inmediatamente ejecutará nuestro script con el modificador -c :

-c "sudo /bin/sh /usr/local/sbin/start_docker.sh"


Tenga en cuenta que esto debe hacerse con privilegios elevados, así que marque la casilla de verificación Ejecutar con los privilegios más altos en la pestaña General .



El resto de los parámetros dependen principalmente de las preferencias individuales, pero mostraré mi configuración. Si lo desea, puede copiarlos. Es posible que algunas configuraciones de energía no aparezcan si está sentado en un automóvil estacionario. Personalmente, uso una computadora portátil.



Bueno, todo sale como pretendíamos. Si no inició Docker en los pasos anteriores utilizando comandos con privilegios elevados, simplemente haga clic derecho en la tarea que creamos en el Programador de tareas y seleccione "Ejecutar". ¡Eso es todo!

Comprueba que todo funciona


Si quieres jugar de manera segura, reinicia tu máquina (sí, para esto tendrás que cerrar las pestañas de tu navegador por un tiempo) , comienza bash e ingresa:

$ docker run --rm hello-world

Si todo va bien, verá el saludo estándar de Docker. ¡El servicio se iniciará automática y directamente en WSL! ¡Felicidades!

Redondear


Acaba de instalar e iniciar Docker en WSL. Esto significa que sus contenedores ahora pueden compartir Ubuntu que ya se está ejecutando en su sistema. Por lo tanto, no es necesario implementar un nuevo sistema operativo (virtualizado), como lo hace un Docker normal para Windows.

El rendimiento de Docker en WSL hasta el momento [al momento de escribir el artículo original] deja mucho que desear, pero a medida que la plataforma se desarrolle y se publiquen las actualizaciones de Windows, solo mejorará.


  1. onomatopellan GitHub: https://github.com/Microsoft/WSL/issues/2291#issuecomment-383698720
  2. Official Docker Documentation: https://docs.docker.com/install/linux/docker-ce/ubuntu/
  3. cgroupfs-mount: https://github.com/tianon/cgroupfs-mount
  4. Bash Command Line Interface: https://docs.microsoft.com/en-us/windows/wsl/reference


All Articles