Compartir a través de


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 del sitio de Docker).

Nota:

Se recomienda usar Docker Desktop debido a su integración con Windows y subsistema de Windows para Linux. Sin embargo, aunque Docker Desktop admite la ejecución de contenedores de Linux y Windows, no se pueden ejecutar simultáneamente. Para ejecutar contenedores de Linux y Windows simultáneamente, tendría que instalar y ejecutar una instancia independiente de Docker en WSL. Si necesita ejecutar contenedores simultáneos o simplemente 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, dependencias, etc.) y enviarlo todo como un paquete. El uso de un contenedor garantiza que la aplicación se ejecute igual independientemente de cualquier configuración personalizada o bibliotecas instaladas previamente en el equipo que lo ejecute que podría diferir de la máquina que se usó para escribir y probar el código de la aplicación. Esto permite a los desarrolladores centrarse en escribir 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 que la aplicación use el mismo kernel de Linux que el sistema en el que se ejecuta. Esto permite que el paquete de la aplicación solo requiera elementos que aún no están en el equipo host, lo que reduce el tamaño del paquete y mejora el rendimiento.

La disponibilidad continua, mediante contenedores de Docker con herramientas como Kubernetes, es otra razón por la popularidad de los contenedores. Esto permite crear varias versiones del contenedor de aplicaciones en momentos diferentes. En lugar de necesitar quitar todo un sistema para actualizaciones o mantenimiento, cada contenedor (y sus microservicios específicos) se puede reemplazar sobre la marcha. Puede 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 puede archivar diferentes versiones de la aplicación mediante contenedores y mantenerlos en ejecución como reserva de seguridad si es necesario.

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

Prerrequisitos

Para obtener más información, consulte los requisitos del sistema de Docker docs 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, abra PowerShell y escriba: 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 distribución (por ejemplo, Ubuntu 18.04).

En la versión 1 de WSL, 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 Hyper-V máquinas virtuales 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.

Instalación de 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ú iconos ocultos de la barra de tareas. Haga clic con el botón derecho en el icono para mostrar el menú comandos de Docker y seleccione "Configuración". Icono del panel de Docker Desktop

  3. Asegúrese de que la opción "Usar el motor basado en WSL 2" está activada 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>de recursos>WSL Integration. 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. Pruebe que la instalación funciona correctamente mediante la ejecución de una imagen de Docker integrada sencilla mediante: docker run hello-world

Sugerencia

Estos son algunos comandos útiles de Docker para saber:

  • Para enumerar los comandos disponibles en la CLI de Docker, escriba: docker
  • Enumerar la información de un comando específico con: docker <COMMAND> --help
  • Enumere las imágenes de Docker en tu máquina (que es solo la imagen "hello-world" 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 el -a mostrar toda la marca, solo se mostrarán los contenedores en ejecución).
  • Enumere la información de todo el sistema con respecto a la instalación de Docker, incluidas estadísticas y recursos (CPU y memoria) disponibles para usted en el contexto de WSL 2, con: docker info

Desarrollo en contenedores remotos mediante VS Code

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

  • Instale la extensión WSL de 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).

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

  • Instale la extensión docker de 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 Hello World para Django en la documentación de configuración del entorno de desarrollo de Python. Puede omitir este paso si prefiere usar el código fuente de su propio proyecto. Para descargar mi aplicación web de 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 herramientas. Esto dará lugar a un rendimiento de acceso a archivos más rápido. En este ejemplo, estamos usando una distribución de Linux (Ubuntu) y queremos almacenar nuestros archivos de proyecto en el sistema \\wsl\de archivos WSL . Almacenar archivos de proyecto en el sistema de archivos de Windows ralentizaría significativamente las cosas al usar 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 de VS Code

  4. En la paleta de comandos de VS Code (Ctrl + Mayús + P), escriba: Contenedores de desarrollo: Volver a abrir en contenedor porque estamos usando una carpeta que ya se ha abierto con la extensión WSL. Como alternativa, use Contenedores de desarrollo: Abrir carpeta en contenedor... para elegir una carpeta WSL mediante el recurso compartido local \\wsl$ (desde el lado de Windows). Consulte el inicio rápido de Visual Studio Code : Abrir una carpeta existente en un contenedor para obtener más detalles. Si estos comandos no se muestran al empezar a escribir, compruebe para asegurarse de que ha instalado la extensión Dev Containers vinculada anteriormente.

    Comando Dev Containers de 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

  6. Aparecerá una lista de definiciones de contenedor, ya que todavía no hay ninguna configuración de contenedor de desarrollo 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. En mi proyecto de Django, seleccionaré Python 3.

    Definiciones de configuración de contenedores de desarrollo de VS Code

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

    Carpeta .devcontainer de 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 se mostró como "Linux", por lo que todavía está conectado al motor de WSL 2, y el número de versión de Python se basará en la configuración del contenedor, la cual puede diferir de la versión de Python instalada en su 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 en la barra de menús de la izquierda). A continuación, seleccione Ejecutar y depurar para seleccionar una configuración de depuración y elija la configuración que mejor se adapte a su proyecto (en mi ejemplo, será "Django"). Esto creará un launch.json archivo en la .vscode carpeta del proyecto con instrucciones sobre cómo ejecutar la aplicación.

    Configuración de ejecución y depuración de VS Code

  10. En VS Code, seleccione Ejecutar>inicio de 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: "Iniciar el servidor de desarrollo en http://127.0.0.1:8000/ Salir 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.

    VS Code ejecutando un contenedor de Docker

¡Ahora ha configurado correctamente un contenedor de desarrollo remoto utilizando Docker Desktop, impulsado por el backend de WSL 2, en el que puede codificar, compilar, ejecutar, desplegar o depurar mediante VS Code!

Solución de problemas

Contexto de Docker de WSL obsoleto

Si estaba usando una versión preliminar técnica temprana de Docker para WSL, puede tener un contexto de Docker denominado "wsl" que ahora está en desuso y ya no se usa. Puede comprobar con el comando : docker context ls. Puede quitar este contexto de "wsl" para evitar errores ejecutando 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 reemplace <distro name> por el nombre de la distribución (es decir, . Ubuntu-20.04) para ver estas carpetas.

Para obtener más información sobre cómo localizar 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