Contenedores en Compute Engine


Los contenedores de software son una forma conveniente de ejecutar tus apps en varias instancias aisladas del espacio de usuario. Puedes ejecutar contenedores en imágenes de VM públicas de Linux o Windows Server, o en una imagen de Container-Optimized OS. Los contenedores permiten que tus apps se ejecuten con menos dependencias en la máquina virtual (VM) del host y se ejecuten de forma independiente de otras apps en contenedores que implementes en la misma instancia de VM. Estas características hacen que las apps en contenedores sean más portátiles y más fáciles de implementar y de mantener a gran escala.

En este documento, se describen algunas de las tecnologías de contenedor más comunes que se pueden usar para ejecutar contenedores en instancias de Compute Engine. Estas tecnologías se pueden usar en la mayoría de las imágenes públicas de VM que proporciona Compute Engine.

Ejecuta contenedores en Compute Engine cuando necesites el control total del entorno de contenedores y las herramientas de organización de contenedores. Como alternativa, puedes usar Google Kubernetes Engine para simplificar la administración de clústeres y las tareas de organización de contenedores, de modo que no necesites administrar las instancias de VM subyacentes.

Tecnologías de contenedores que se ejecutan en Compute Engine

En general, en las instancias de Compute Engine puede ejecutarse casi cualquier tecnología o herramienta de contenedor. Puedes ejecutar varios tipos diferentes de contenedores en los sistemas operativos Linux modernos y ejecutar Docker en Windows Server 2016 o en una versión posterior. En la lista siguiente, se incluyen varias herramientas comunes que puedes usar para ejecutar y administrar aplicaciones en contenedores:

  • Docker y Podman son dos tecnologías de contenedores populares que te permiten ejecutar apps en contenedores.
  • Kubernetes es una plataforma de organización de contenedores que puede usarse para administrar y escalar contenedores en ejecución en varias instancias o dentro de un entorno de nube híbrida.
  • Los contenedores en Compute Engine proporcionan una manera fácil de implementar contenedores en instancias de VM o grupos de instancias administrados de Compute Engine.
  • Puedes convertir tus sistemas existentes en imágenes LXD y ejecutar estas imágenes dentro de instancias de VM de Compute Engine para una solución de migración lift-and-shift. LXD se ejecuta en imágenes de Ubuntu.

Además, puedes usar Container Registry para administrar las versiones de imagen de contenedor. Container Registry sirve como ubicación central para almacenar y administrar tus imágenes de contenedor antes de implementarlas en Kubernetes, en Compute Engine o en clústeres de Google Kubernetes Engine.

Imágenes de VM optimizadas para contenedores

Compute Engine proporciona varias imágenes de VM públicas que puedes usar para crear instancias y ejecutar las cargas de trabajo de contenedores. Algunas de estas imágenes de VM públicas tienen un sistema operativo minimalista optimizado para contenedores que incluye versiones más nuevas de Docker, Podman o Kubernetes preinstaladas. Las siguientes familias de imágenes públicas están diseñadas para ejecutar contenedores:

  • Container-Optimized OS de Google
    • Incluye: Docker, Kubernetes
    • Proyecto de imagen: cos-cloud
    • Familia de imágenes: cos-stable
  • Fedora CoreOS
    • Incluye: Podman, Docker
    • Proyecto de imagen: fedora-coreos-cloud
    • Familia de imágenes: fedora-coreos-stable
  • Ubuntu
    • Incluye: LXD
    • Proyecto de imagen: ubuntu-os-cloud
    • Familia de imágenes: ubuntu-2004-lts
  • Windows
    • Incluye: Docker
    • Proyecto de imagen: windows-cloud
    • Familia de imágenes: windows-1909-core-for-containers

Si necesitas ejecutar herramientas y tecnologías de contenedor específicas en imágenes que no las incluyen de manera predeterminada, instala esas tecnologías de forma manual.

Instala tecnologías de contenedor en las instancias

Para iniciar un solo contenedor en una instancia, puedes especificar una imagen de contenedor cuando creas una instancia. Compute Engine proporciona de forma automática una imagen actualizada de Container-Optimized OS con Docker instalado y, luego, inicia el contenedor cuando se inicia la VM. Si deseas obtener más información, consulta la sección para implementar contenedores en VM.

Como alternativa, puedes ejecutar las cargas de trabajo de contenedor en Compute Engine mediante las tecnologías de contenedores y las herramientas de organización que necesites. Puedes crear una instancia desde una imagen de VM pública y, luego, instalar las tecnologías de contenedor que desees. Por ejemplo:

En algunas situaciones, es posible que necesites versiones específicas de estas tecnologías para asegurarte de que funcionen juntas de forma correcta. Por ejemplo, Kubernetes suele funcionar mejor con versiones específicas de Docker. Por lo general, puedes instalar las últimas versiones de estas tecnologías para obtener el mejor resultado.

Instala Docker en imágenes de Windows Server

Windows Server 2016 y las versiones posteriores son compatibles con contenedores. Si planeas ejecutar contenedores de Docker en una instancia de Windows Server, Google recomienda comenzar con la imagen pública de Windows Server for Containers. Esta imagen tiene los componentes instalados siguientes:

Si deseas instalar Docker en la imagen base de Windows Server y ejecutar aplicaciones en contenedores, en lugar de usar la imagen de Windows Server for Containers, sigue los pasos descritos a continuación.

Para comenzar, crea una instancia de Windows Server con una imagen pública de Windows Server 2016 o una versión posterior. Para obtener la mejor compatibilidad con contenedores, te recomendamos usar la versión semestral más reciente de Windows Server, como la versión 1909.

Instala Docker

  1. Conéctate a la instancia de Windows.

  2. Ejecuta PowerShell como administrador.

  3. Instala Docker desde los repositorios de Microsoft:

    PS C:\> Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
    
    PS C:\> Install-Package -Name docker -ProviderName DockerMsftProvider
    
  4. Ejecuta los comandos siguientes para resolver problemas conocidos con los contenedores de Windows en Compute Engine:

    • Inhabilita la fusión de segmentos de recepción:

      PS C:\> netsh netkvm setparam 0 *RscIPv4 0
      
    • Habilita IPv6:

      PS C:\> reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters `
      /v DisabledComponents /t REG_DWORD /d 0x0 /f
      
  5. Reinicia la instancia:

    PS C:\> Restart-Computer -Force
    

Pasos de configuración adicionales

En este punto, puedes usar Docker para ejecutar contenedores en la instancia. Por ejemplo, con el siguiente comando, se descarga la imagen de contenedor nanoserver de Windows y se ejecuta un símbolo del sistema dentro de un contenedor nanoserver:

PS C:\> docker run -it mcr.microsoft.com/windows/nanoserver:1909 cmd.exe

Ten en cuenta que existe un problema conocido con la MTU de la red predeterminada de Docker que afecta la conectividad a la instancia y la conectividad de los contenedores a Internet. Para solucionar este problema, primero configura la MTU de todas las interfaces de red (Ethernet y vEthernet) como 1460 mediante la ejecución de los siguientes comandos en una terminal de PowerShell en la instancia:

PS C:\> Get-NetAdapter | Where-Object Name -like "*Ethernet*" | ForEach-Object {
  & netsh interface ipv4 set subinterface $_.InterfaceIndex mtu=1460 store=persistent
}
PS C:\> netsh interface ipv4 show subinterfaces
   MTU  MediaSenseState   Bytes In  Bytes Out  Interface
------  ---------------  ---------  ---------  -------------
4294967295                1          0          0  Loopback Pseudo-Interface 1
  1460                1     306804     668688  Ethernet
  1460                1          0       1282  vEthernet (nat)

Incluso después de reparar la MTU de la instancia, la conectividad de los contenedores a Internet puede ser inestable porque, de forma predeterminada, la interfaz de red del contenedor también usa una MTU de 1500. Si quieres obtener los comandos para configurar la MTU de forma correcta en cada contenedor, consulta la sección MTU de contenedores.

Es posible que debas volver a ejecutar estos comandos de MTU de manera periódica mientras configuras las redes de Docker. Para obtener más información, consulta la sección de problemas conocidos.

Ejecuta contenedores de Windows

Los siguientes son algunos de los recursos disponibles para comenzar a usar los contenedores de Windows:

Problemas conocidos con contenedores de Windows

Los contenedores no son compatibles entre versiones de Windows

Los contenedores compilados en versiones anteriores de Windows no funcionan en las instancias de Compute Engine que se ejecutan en versiones más recientes de Windows. Docker extrae la versión de Windows Server 2016 de un contenedor de forma predeterminada. Esto significa que la ejecución del comando siguiente en una instancia que ejecuta Windows Server, versión 1709 o posterior, generará el error siguiente:

PS C:\> docker run -it mcr.microsoft.com/windows/nanoserver cmd.exe
docker: Error response from daemon: container
9a1eb8bbcba4e91792be65f3c40b5a1aee062f02fbc60a78444b47d043438069 encountered an
error during CreateContainer: failure in a Windows system call: The operating
system of the container does not match the operating system of the host.
(0xc0370101)

La página sobre compatibilidad de versiones de contenedor de Windows de Microsoft contiene más información. Para evitar las incompatibilidades de versiones de contenedores de Windows, especifica la etiqueta correspondiente a tu versión de Windows cuando extraigas y ejecutes contenedores. Por ejemplo, en una instancia de Windows Server, versión 1909, usa el siguiente comando para ejecutar un símbolo del sistema en el contenedor nanoserver de la versión 1909, en lugar del contenedor predeterminado, versión 2016:

PS C:\> docker run -it mcr.microsoft.com/windows/nanoserver:1909 cmd.exe

Las incompatibilidades de MTU afectan la conectividad de instancias y contenedores

Cuando creas una red de contenedores en una instancia de Windows mediante los comandos docker network create o New-VMSwitch, la MTU de la interfaz de red de la instancia suele establecerse de manera forzada en 1500. La interfaz de red predeterminada dentro de un contenedor de Docker nuevo también suele usar una MTU de 1500. Google Cloud admite una MTU de solo 1460; por lo tanto, cuando la MTU se establece de manera forzada en 1500, es posible que experimentes los siguientes problemas:

  • La sesión RDP puede detenerse y es posible que no puedas volver a conectarte. Se sabe que esto sucede cuando se crea una red de contenedores transparente.

  • Es posible que falle la resolución de DNS dentro del contenedor.

  • La resolución de DNS es exitosa, pero el proceso de establecer una conexión HTTP desde el contenedor a Internet puede generar errores.

Para eludir estas limitaciones, se deben realizar dos pasos: configurar la MTU para las interfaces de red de la instancia y configurar la MTU para las interfaces de red del contenedor.

1. Configura la MTU para las interfaces de red de la instancia de Windows

Ejecuta este comando en una terminal de PowerShell en la instancia de Windows a fin de configurar la MTU para todas las interfaces de red (tanto Ethernet como vEthernet):

PS C:\> Get-NetAdapter | Where-Object Name -like "*Ethernet*" | ForEach-Object {
  & netsh interface ipv4 set subinterface $_.InterfaceIndex mtu=1460 store=persistent
}

Comprueba que las MTU de la interfaz Ethernet y vEthernet de la instancia estén configuradas como 1460 mediante el comando siguiente:

PS C:\> netsh interface ipv4 show subinterfaces
   MTU  MediaSenseState   Bytes In  Bytes Out  Interface
------  ---------------  ---------  ---------  -------------
4294967295                1          0          0  Loopback Pseudo-Interface 1
  1460                1  628295912    2613170  Ethernet
  1460                1      37793     223909  vEthernet (nat)

Si no puedes ejecutar estos comandos porque ya no puedes conectarte a una instancia mediante RDP, puedes conectarte a la instancia a través de la consola en serie, iniciar un símbolo del sistema cmd y ejecutar los comandos netsh para reparar la MTU. Si no deseas hacer esto, te recomendamos ejecutar cualquier comando docker network ... o New-VMSwitch como parte de una secuencia de comandos que también ejecute el comando de reparación de la MTU.

2. Configura la MTU para las interfaces de red del contenedor de Windows

La MTU de un contenedor de Windows debe configurarse mientras el contenedor está en ejecución, ya sea desde el interior del contenedor o desde la instancia que lo aloja. Si PowerShell está disponible en el contenedor, puedes ejecutar este comando de forma interactiva o desde una secuencia de comandos en el contenedor para configurar la MTU de manera correcta:

PS C:\> Get-NetAdapter | Where-Object Name -like "vEthernet*" | ForEach-Object {
  & netsh interface ipv4 set subinterface $_.InterfaceIndex mtu=1460 store=persistent
}

O bien, puedes ejecutar este comando en la instancia de Windows a fin de configurar la MTU para todos los contenedores en ejecución:

PS C:\> Get-NetIPInterface -IncludeAllCompartments |
  Where-Object InterfaceAlias -like "vEthernet*" |
  Set-NetIPInterface -IncludeAllCompartments -NlMtuBytes 1460

No se pueden iniciar los contenedores de Docker

Si inicias un contenedor con docker run, es posible que falle con el error siguiente:

C:\Program Files\Docker\docker.exe: Error response from daemon: container ...
encountered an error during CreateContainer: failure in a Windows system call:
Element not found. (0x490)

Este problema ocurre en instancias de Windows Server 2016 con Windows Update KB4015217 instalado. Para solucionarlo, habilita IPv6 en la instancia mediante el siguiente comando de PowerShell:

PS C:\> reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters `
/v DisabledComponents /t REG_DWORD /d 0x0 /f

Después de habilitar IPv6, reinicia la instancia:

PS C:\> Restart-Computer -Force

Si este problema se corrige en futuras actualizaciones del sistema operativo, puedes restablecer la configuración original de IPv6:

PS C:\> reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters `
/v DisabledComponents /t REG_DWORD /d 0xff /f

No se pueden iniciar contenedores de Hyper-V

Los contenedores de Hyper-V no son compatibles con Compute Engine en este momento.

Próximos pasos