Introducción a los contenedores remotos de Docker en WSL 2
Artículo
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.
Windows 11 de 64 bits: Home o Pro versión 21H2 o posteriores, o Enterprise o Education versión 21H2 o posteriores.
Windows 10 de 64 bits (recomendado): Home o Pro 22H2 (compilación 19045) o posteriores, o Enterprise o Education 22H2 (compilación 19045) o posteriores. (Mínimo): Inicio o Pro 21H2 (compilación 19044) o posteriores, o Enterprise o Education 21H2 (compilación 19044) o posteriores. Actualización de-Windows
Instalación de Visual Studio Code(opcional). Esto proporcionará la mejor experiencia, incluida la capacidad de codificar y depurar dentro de un contenedor remoto de Docker y conectado a la distribución de Linux.
Instalación de Terminal Windows(opcional). Esto proporcionará la mejor experiencia, incluida la capacidad de personalizar y abrir varios terminales en la misma interfaz (incluidos Ubuntu, Debian, PowerShell, la CLI de Azure o lo que prefiera usar).
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.
Descargue Docker Desktop y siga las instrucciones de instalación.
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".
Asegúrese de que "Usar el motor basado en WSL 2" esté activado en Configuración>General.
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.
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
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.
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.
Desde el terminal WSL, cambie los directorios a la carpeta de código fuente de este proyecto:
cd helloworld-django
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.
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.
Seleccione la carpeta del proyecto que desea incluir en contenedores. En mi caso, esto es \\wsl\Ubuntu-20.04\home\mattwojo\repos\helloworld-django\
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.
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.
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.
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.
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.
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.
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.
El origen de este contenido se puede encontrar en GitHub, donde también puede crear y revisar problemas y solicitudes de incorporación de cambios. Para más información, consulte nuestra guía para colaboradores.
Comentarios de Windows Subsystem for Linux
Windows Subsystem for Linux es un proyecto de código abierto. Seleccione un vínculo para proporcionar comentarios:
Cree y configure un entorno de desarrollo con todas las características basado en contenedores con la extensión Dev Containers de Visual Studio Code. Abra cualquier carpeta o repositorio de un contenedor, y aproveche las ventajas del conjunto completo de características de Visual Studio Code, como IntelliSense (finalizaciones), navegación por código y depuración.