Introducción a los contenedores remotos de Docker en WSL 2

Esta guía paso a paso le ayudará a empezar a desarrollar con contenedores remotos mediante la configuración de Docker Desktop para Windows con WSL 2 (Subsistema de Windows para Linux, versión 2).

Docker Desktop para Windows proporciona un entorno de desarrollo para compilar, enviar y ejecutar aplicaciones dockerizadas. Al habilitar el motor basado en WSL 2, puede ejecutar contenedores de Linux y Windows en Docker Desktop en la misma máquina. (Docker Desktop es gratuito para uso personal y pequeñas empresas, para obtener información sobre los precios de Pro, Team o Business, consulte las Preguntas más frecuentes sobre el sitio de Docker).

Nota:

Se recomienda usar Docker Desktop debido a su integración con Windows y el Subsistema de Windows para Linux. Sin embargo, aunque Docker Desktop admite la ejecución de contenedores de Linux y Windows, no puede ejecutar ambos simultáneamente. Para ejecutar contenedores de Linux y Windows simultáneamente, tendría que instalar y ejecutar una instancia de Docker independiente en WSL. Si necesita ejecutar contenedores simultáneos o prefiere instalar un motor de contenedor directamente en la distribución de Linux, siga las instrucciones de instalación de Linux para ese servicio de contenedor, como Instalar el motor de Docker en Ubuntu o Instalar Podman para ejecutar contenedores de Linux.

Introducción a los contenedores de Docker

Docker es una herramienta que se usa para crear, implementar y ejecutar aplicaciones mediante contenedores. Los contenedores permiten a los desarrolladores empaquetar una aplicación con todas las partes que necesita (bibliotecas, marcos de trabajo, dependencias, etc.) y enviar todo como un paquete. El uso de un contenedor garantiza que la aplicación se ejecutará de la misma forma, independientemente de la configuración personalizada o de las bibliotecas instaladas anteriormente en el equipo en el que se ejecute, que podría diferir del equipo que se usó para escribir y probar el código de la aplicación. Esto permite a los desarrolladores centrarse en la escritura de código sin preocuparse por el sistema en el que se ejecutará el código.

Los contenedores de Docker son similares a las máquinas virtuales, pero no crean un sistema operativo virtual completo. En su lugar, Docker permite a la aplicación usar el mismo kernel de Linux que el sistema en el que se ejecuta. Esto permite que el paquete de la aplicación solo requiera partes que aún no existen en el equipo host, lo que reduce el tamaño del paquete y mejora el rendimiento.

La disponibilidad continua, mediante el uso de contenedores de Docker con herramientas como Kubernetes, es otro motivo para la popularidad de los contenedores. Esto permite crear varias versiones del contenedor de la aplicación en momentos diferentes. En lugar de tener que deshacer todo el sistema para las actualizaciones o el mantenimiento, cada contenedor (y sus microservicios específicos) se pueden reemplazar sobre la marcha. Puedes preparar un nuevo contenedor con todas las actualizaciones, configurar el contenedor para producción y simplemente apuntar al nuevo contenedor una vez que esté listo. También puedes archivar versiones diferentes de la aplicación mediante contenedores y mantenerlas en ejecución como reserva de seguridad si es necesario.

Para más información, consulte Introducción a los contenedores de Docker.

Requisitos previos

Para más información, consulte los requisitos del sistema de Docker para instalar Docker Desktop en Windows.

Para obtener información sobre cómo instalar Docker en Windows Server, consulte Introducción: Preparación de Windows para contenedores.

Nota:

WSL puede ejecutar distribuciones en modo WSL versión 1 o WSL 2. Para comprobarlo, abre PowerShell y escribe: wsl -l -v. Asegúrese de que la distribución está establecida para usar WSL 2 escribiendo: wsl --set-version <distro> 2. Reemplace <distro> por el nombre de la distribución (por ejemplo, Ubuntu 18.04).

En WSL versión 1, debido a diferencias fundamentales entre Windows y Linux, el motor de Docker no se pudo ejecutar directamente dentro de WSL, por lo que el equipo de Docker desarrolló una solución alternativa mediante máquinas virtuales de Hyper-V y LinuxKit. Sin embargo, dado que WSL 2 ahora se ejecuta en un kernel de Linux con capacidad de llamada completa del sistema, Docker puede ejecutarse completamente en WSL 2. Esto significa que los contenedores de Linux se pueden ejecutar de forma nativa sin emulación, lo que da lugar a un mejor rendimiento e interoperabilidad entre las herramientas de Windows y Linux.

Instalar Docker Desktop

Con el back-end de WSL 2 compatible con Docker Desktop para Windows, puede trabajar en un entorno de desarrollo basado en Linux y compilar contenedores basados en Linux, mientras usa Visual Studio Code para editar y depurar código y ejecutar el contenedor en el explorador Microsoft Edge en Windows.

Para instalar Docker (después de instalar WSL):

  1. Descargue Docker Desktop y siga las instrucciones de instalación.

  2. Una vez instalado, inicie Docker Desktop desde el menú Inicio de Windows y, a continuación, seleccione el icono de Docker en el menú de iconos ocultos de la barra de tareas. Haga clic con el botón derecho en el icono para mostrar el menú de comandos de Docker y seleccione "Configuración". Icono del panel de Docker Desktop

  3. Asegúrese de que "Usar el motor basado en WSL 2" esté activado en Configuración>General. Configuración general de Docker Desktop

  4. Seleccione entre las distribuciones de WSL 2 instaladas en las que desea habilitar la integración de Docker; para ello, vaya a: Configuración>Recursos>Integración de WSL. Configuración de recursos de Docker Desktop

  5. Para confirmar que Docker se ha instalado, abra una distribución de WSL (por ejemplo, Ubuntu) y muestre la versión y el número de compilación escribiendo: docker --version

  6. Compruebe que la instalación funciona correctamente mediante la ejecución de una imagen de Docker integrada simple mediante: docker run hello-world

Sugerencia

Aquí tiene algunos comandos de Docker útiles que debe conocer:

  • Enumerar los comandos disponibles en la CLI de Docker, para lo que debes escribir: docker
  • Enumerar información de un comando específico con: docker <COMMAND> --help
  • Enumerar las imágenes de Docker en el equipo (que es simplemente la imagen de Hola mundo en este momento), con: docker image ls --all
  • Enumere los contenedores de la máquina, con: docker container ls --all o docker ps -a (sin la marca -a show all, solo se mostrarán los contenedores en ejecución).
  • Enumere la información de todo el sistema relativa a la instalación de Docker, incluidas las estadísticas y los recursos (memoria y CPU) a su disposición en el contexto de WSL 2, con: docker info

Desarrollo en contenedores remotos mediante VS Code

Para empezar a desarrollar aplicaciones mediante Docker con WSL 2, se recomienda usar VS Code, junto con las extensiones WSL, Dev Containers y Docker.

  • Instalar la extensión de WSL en VS Code. Esta extensión le permite abrir el proyecto de Linux que se ejecuta en WSL en VS Code (no es necesario preocuparse por problemas de ruta de acceso, compatibilidad binaria u otros desafíos entre sistemas operativos).

  • Instalar la extensión Dev Containers de Visual Studio Code. Esta extensión le permite abrir la carpeta o repositorio del proyecto dentro de un contenedor, aprovechando el conjunto de características completo de Visual Studio Code para realizar el trabajo de desarrollo dentro del contenedor.

  • Instalar la extensión de Docker en VS Code. Esta extensión agrega la funcionalidad para compilar, administrar e implementar aplicaciones en contenedor desde VS Code. (Necesita la extensión Dev Containers para usar realmente el contenedor como entorno de desarrollo).

Vamos a usar Docker para crear un contenedor de desarrollo para un proyecto de aplicación existente.

  1. En este ejemplo, usaré el código fuente de mi tutorial de Hola mundo para Django en los documentos de configuración del entorno de desarrollo de Python. Puede omitir este paso si prefiere usar su propio código fuente del proyecto. Para descargar mi aplicación web HelloWorld-Django desde GitHub, abra un terminal WSL (Ubuntu por ejemplo) y escriba: git clone https://github.com/mattwojo/helloworld-django.git

    Nota:

    Almacene siempre el código en el mismo sistema de archivos en el que está usando las herramientas. Esto dará como resultado un rendimiento de acceso a archivos más rápido. En este ejemplo, usamos una distribución de Linux (Ubuntu) y queremos almacenar nuestros archivos de proyecto en el sistema de archivos WSL \\wsl\. El almacenamiento de archivos de proyecto en el sistema de archivos de Windows ralentizaría considerablemente el uso de herramientas de Linux en WSL para acceder a esos archivos.

  2. Desde el terminal WSL, cambie los directorios a la carpeta de código fuente de este proyecto:

    cd helloworld-django
    
  3. Abra el proyecto en VS Code que se ejecuta en el servidor de extensión WSL local escribiendo:

    code .
    

    Confirme que está conectado a la distribución de Linux de WSL comprobando el indicador remoto verde en la esquina inferior izquierda de la instancia de VS Code.

    Indicador remoto de WSL en VS Code

  4. En la paleta de comandos de VS Code (Ctrl + Mayús + P), escriba: Dev Containers: Volver a abrir en contenedor, ya que vamos a usar una carpeta ya abierta con la extensión WSL. Otra opción es usar Dev Containers: Abrir carpeta en contenedor... para elegir una carpeta de WSL mediante el recurso compartido \\wsl$ local (desde Windows). Consulte Inicio rápido: Abrir una carpeta existente en un contenedor de Visual Studio Code para obtener más detalles. Si estos comandos no se muestran al empezar a escribir, compruebe que ha instalado la extensión Dev Containers vinculada anteriormente.

    Comando de Dev Containers en VS Code

  5. Seleccione la carpeta del proyecto que desea incluir en contenedores. En mi caso, esto es \\wsl\Ubuntu-20.04\home\mattwojo\repos\helloworld-django\

    Carpeta de Dev Containers en VS Code

  6. Aparecerá una lista de definiciones de contenedor, ya que todavía no hay ninguna configuración de dev container en la carpeta del proyecto (repositorio). La lista de definiciones de configuración de contenedor que aparece se filtra en función del tipo de proyecto. Para mi proyecto de Django, seleccionaré Python 3.

    Definiciones de configuración de Dev Containers en VS Code

  7. Se abrirá una nueva instancia de VS Code, se empezará a compilar nuestra nueva imagen y, una vez completada la compilación, se iniciará el contenedor. Verá que ha aparecido una nueva carpeta de .devcontainer con información de configuración de contenedor dentro de un archivo Dockerfile y devcontainer.json.

    Carpeta .devcontainer en VS Code

  8. Para confirmar que el proyecto todavía está conectado a WSL y dentro de un contenedor, abra el terminal integrado de VS Code (Ctrl + Mayús + ~). Para comprobar el sistema operativo, escriba: uname y la versión de Python con: python3 --version. Puede ver que el uname volvió como "Linux", por lo que aún está conectado al motor de WSL 2 y el número de versión de Python se basará en la configuración del contenedor que puede diferir de la versión de Python instalada en la distribución de WSL.

  9. Para ejecutar y depurar la aplicación dentro del contenedor mediante Visual Studio Code, abra primero el menú Ejecutar (Ctrl+Mayús+D o seleccione la pestaña de la barra de menús de la izquierda). Luego, seleccione Ejecutar y depurar para seleccionar una configuración de depuración y elija la configuración que mejor se adapte al proyecto (en nuestro ejemplo, será "Django"). Esto creará un archivo launch.json en la carpeta .vscode del proyecto con instrucciones sobre cómo ejecutar la aplicación.

    Ejecutar configuración de depuración en VS Code

  10. En VS Code, seleccione Ejecutar>Iniciar depuración (o simplemente presione la tecla F5). Esto abrirá un terminal dentro de VS Code y verá un resultado que dice algo parecido a: "Iniciando el servidor de desarrollo en http://127.0.0.1:8000/ Salga del servidor con CONTROL-C". Mantenga presionada la tecla Control y seleccione la dirección que se muestra para abrir la aplicación en el explorador web predeterminado y ver el proyecto que se ejecuta dentro de su contenedor.

    Ejecución de un contenedor de Docker en VS Code

Ahora ha configurado correctamente un contenedor de desarrollo remoto mediante Docker Desktop, con tecnología del back-end de WSL 2, que puede codificar, compilar, ejecutar, implementar o depurar mediante VS Code.

Solucionar problemas

Contexto de Docker de WSL en desuso

Si usaba una versión preliminar técnica anterior de Docker para WSL, es posible que tenga un contexto de Docker denominado "wsl" que ahora está en desuso. Puede comprobar esto con el comando: docker context ls. Puede quitar este contexto de "wsl" para evitar errores con el comando: docker context rm wsl ya que desea usar el contexto predeterminado tanto para Windows como para WSL2.

Entre los posibles errores que puede encontrar con este contexto de wsl en desuso se incluyen: docker wsl open //./pipe/docker_wsl: The system cannot find the file specified. o error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_wsl/v1.40/images/json?all=1: open //./pipe/docker_wsl: The system cannot find the file specified.

Para obtener más información sobre este problema, consulte Configuración de Docker en el sistema Windows para Linux (WSL2) en Windows 10.

Problemas para encontrar la carpeta de almacenamiento de imágenes de Docker

Docker crea dos carpetas de distribución para almacenar datos:

  • \wsl$\docker-desktop
  • \wsl$\docker-desktop-data

Puede encontrar estas carpetas abriendo la distribución de Linux de WSL y escribiendo: explorer.exe . para ver la carpeta en el Explorador de archivos de Windows. Escriba: \\wsl\<distro name>\mnt\wsl y reemplace <distro name> por el nombre de la distribución (es decir, Ubuntu-20.04) para ver estas carpetas.

Obtenga más información sobre la localización de ubicaciones de almacenamiento de Docker en WSL. Consulte este problema desde el repositorio de WSL o esta publicación de StackOverflow.

Para obtener más ayuda con problemas generales de solución de problemas en WSL, consulte el documento solución de problemas.

Recursos adicionales