Contenedores en Compute Engine

Los contenedores de software son una forma conveniente de ejecutar tus aplicaciones 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. En los contenedores, tus aplicaciones pueden ejecutarse con menos dependencias en la máquina virtual del host y de manera independiente de otras aplicaciones en contenedores que implementes en la misma instancia de máquina virtual. Estas características hacen que las aplicaciones 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 de tu entorno de contenedores y de las herramientas de organización de contenedores. De manera alternativa, puedes usar Google Kubernetes Engine a fin de simplificar las tareas de administración de clústeres y de organización de contenedores para que no tengas que administrar las instancias de máquinas virtuales 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 rkt son dos tecnologías de contenedores populares que te permiten ejecutar fácilmente aplicaciones 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 son una manera fácil de implementar contenedores en instancias de VM de Compute Engine o en grupos de instancias administrados.
  • Puedes convertir tus sistemas existentes en imágenes LXD y ejecutarlas en instancias de máquinas virtuales de Compute Engine para una solución de migración simple de tipo 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 contenedor

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, rkt 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
  • CoreOS
    • Incluye: Docker, rkt, Kubernetes
    • Proyecto de imagen: coreos-cloud
    • Familia de imágenes: coreos-stable
  • Ubuntu
    • Incluye: LXD
    • Proyecto de imagen: ubuntu-os-cloud
    • Familia de imágenes: ubuntu-1604-lts
  • Windows
    • Incluye: Docker
    • Proyecto de imagen: windows-cloud
    • Familia de imágenes: windows-1809-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 contenedor 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 los 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 1809.

Instala Docker

  1. Conéctate a la instancia de Windows.

  2. Abre una terminal de PowerShell como administrador.

  3. Instala Docker desde los repositorios de Microsoft siguientes:

    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 comando siguiente, 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:1809 cmd.exe

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

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 la interfaz de red del contenedor también usa una MTU de 1500 de forma predeterminada. Lee la sección sobre MTU de contenedor a fin de obtener instrucciones para configurar la MTU de forma correcta en cada contenedor.

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

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 microsoft/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 la versión del contenedor 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 1809, usa el comando siguiente para ejecutar un símbolo del sistema en el contenedor nanoserver, versión 1809, en lugar del contenedor predeterminado, versión 2016:

PS C:\> docker run -it microsoft/nanoserver:1809 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 forzarse a 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 fuerza a 1500, es posible que experimentes los problemas siguientes:

  • 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 establecimiento de una conexión HTTP desde el contenedor a Internet puede tener 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 a través de RDP, puedes conectarte a la instancia a través de la consola en serie, iniciar un símbolo del sistema de cmd y ejecutar los comandos netsh ahí para reparar la MTU. Si no deseas tener que 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 solucionar el problema, habilita IPv6 en la instancia con 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