Configurar las opciones para ejecutar tu contenedor


Puedes ejecutar un solo contenedor en una VM o en cada VM de un grupo de instancias gestionado (MIG). Para ello, especifica una imagen de contenedor y los parámetros de configuración cuando crees una instancia de VM o una plantilla de instancia.

En este documento se describen las opciones de configuración para ejecutar contenedores en instancias de Compute Engine.

Antes de empezar

  • Si no tienes experiencia con los contenedores, consulta el artículo Contenedores en Compute Engine.
  • Si no conoces Docker, consulta su documentación.
  • Consulta información sobre cómo desplegar contenedores en Compute Engine.
  • Si aún no lo has hecho, configura la autenticación. La autenticación verifica tu identidad para acceder a Google Cloud servicios y APIs. Para ejecutar código o ejemplos desde un entorno de desarrollo local, puedes autenticarte en Compute Engine seleccionando una de las siguientes opciones:

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. Instala Google Cloud CLI. Después de la instalación, inicializa la CLI de Google Cloud ejecutando el siguiente comando:

      gcloud init

      Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

    2. Set a default region and zone.

Cuando crees una instancia o una plantilla de instancia para desplegar contenedores en máquinas virtuales y grupos de instancias gestionados, especifica la configuración del contenedor mediante la consola de Google Cloud o la CLI de Google Cloud.

En las siguientes secciones se describe cómo configurar contenedores en instancias de VM, pero también puede configurar las siguientes opciones al crear una plantilla de instancia. Usa la Google Cloud consola o la CLI de Google Cloud para configurar las opciones de las instancias de VM en una plantilla de instancia.

Puedes usar los comandos docker run para configurar un contenedor en una instancia de VM que ejecute Container-Optimized OS o especificar el comando docker run en una secuencia de comandos de inicio para crear y configurar una VM. Para obtener más información, consulta Usar secuencias de comandos de inicio para desplegar contenedores en VMs.

Especificar una política de reinicio

Puedes definir una política de reinicio para especificar si se debe reiniciar un contenedor al salir. La política predeterminada es reiniciar siempre. También puedes configurar la política para que se reinicie si falla o para que no se reinicie nunca.

docker run

Usa la marca --restart del comando docker run. Los intentos repetidos de reiniciar un contenedor se deben al comportamiento predeterminado de Docker, tal como se especifica en la referencia de Docker --restart.

Consola

  1. Ve a la página Crear una instancia.

    Ir a Crear una instancia

  2. En la sección Contenedor, haga clic en Implementar contenedor.

  3. En la página Configurar contenedor, haga lo siguiente:

    1. Especifica un nombre de imagen de contenedor.
    2. En la sección Política de reinicio, seleccione la política de reinicio del contenedor.
    3. Para confirmar los detalles del contenedor, haz clic en Seleccionar.
  4. Continúa con el proceso de creación de la VM.

gcloud

Usa la marca --container-restart-policy para especificar una política de reinicio del contenedor:

  • always (predeterminado)
  • on-failure
  • never

En el siguiente ejemplo se inicia un contenedor con la política de reinicio on-failure, lo que significa que el reinicio solo se produce cuando el código de salida del contenedor es distinto de cero:

gcloud compute instances create-with-container busybox-vm \
  --container-image docker.io/busybox:1.27 \
  --container-restart-policy on-failure

Usa el comando gcloud compute instances update-container con la marca --container-restart-policy para la política de reinicio de un contenedor que se ejecuta en una VM.

Ejecutar un contenedor en modo con privilegios

Puedes ejecutar un contenedor en modo con privilegios para permitir el acceso a todos los dispositivos del host. Los contenedores se ejecutan como "sin privilegios" de forma predeterminada y no tienen permiso para acceder a ningún dispositivo.

docker run

Usa la marca --privileged del comando docker run. Para obtener más información, consulta Privilegios de tiempo de ejecución y funciones de Linux.

Consola

  1. Ve a la página Crear una instancia.

    Ir a Crear una instancia

  2. En la sección Contenedor, haga clic en Implementar contenedor.

  3. En la página Configurar contenedor, haga lo siguiente:

    1. Especifica un nombre de imagen de contenedor.
    2. Selecciona Ejecutar como privilegiado.
    3. Para confirmar los detalles del contenedor, haz clic en Seleccionar.
  4. Continúa con el proceso de creación de la VM.

gcloud

Usa la marca --container-privileged para ejecutar un contenedor con privilegios de tiempo de ejecución. En el siguiente ejemplo se inicia un contenedor de busybox en modo privilegiado:

gcloud compute instances create-with-container busybox-vm \
  --container-image docker.io/busybox:1.27 \
  --container-privileged

Usa el comando gcloud compute instances update-container con la marca --container-privileged para actualizar un contenedor en una VM. Usa la marca --no-container-privileged para desactivar el modo con privilegios.

Asignación de un búfer para STDIN en el entorno de ejecución del contenedor

Puedes asignar un búfer para STDIN en el entorno de ejecución del contenedor para mantener el flujo de STDIN abierto en un contenedor. Si no se define, las lecturas de STDIN en el contenedor siempre dan como resultado EOF.

Además de asignar un pseudo-TTY, es necesario mantener abierto el flujo STDIN para establecer un shell interactivo en el contenedor y para que el contenedor reciba su entrada estándar de una tubería.

docker run

Usa la marca --interactive (-i) del comando docker run. Para obtener más información, consulta la documentación de la marca --interactive.

Consola

  1. Ve a la página Crear una instancia.

    Ir a Crear una instancia

  2. En la sección Contenedor, haga clic en Implementar contenedor.

  3. En la página Configurar contenedor, haga lo siguiente:

    1. Especifica un nombre de imagen de contenedor.
    2. Selecciona Asignar un búfer a STDIN.
    3. Para confirmar los detalles del contenedor, haz clic en Seleccionar.
  4. Continúa con el proceso de creación de la VM.

gcloud

Usa la marca --container-stdin para asignar un búfer a STDIN en el entorno de ejecución del contenedor. En el siguiente ejemplo se inicia un contenedor y se mantiene abierto su STDIN:

gcloud compute instances create-with-container busybox-vm \
  --container-image docker.io/busybox:1.27 \
  --container-stdin

Usa el comando gcloud compute instances update-container con la marca --container-stdin para actualizar un contenedor en una VM. Usa la marca --no-container-stdin para desactivar la asignación de un búfer para STDIN.

Asignación de un pseudo-TTY

Es necesario asignar un pseudo-TTY a un contenedor para establecer un shell interactivo en el contenedor (junto con la asignación de un búfer para STDIN).

docker run

Usa la marca --tty (-t) del comando docker run. Para obtener más información, consulta la marca --tty.

Consola

  1. Ve a la página Crear una instancia.

    Ir a Crear una instancia

  2. En la sección Contenedor, haga clic en Implementar contenedor.

  3. En la página Configurar contenedor, haga lo siguiente:

    1. Especifica un nombre de imagen de contenedor.
    2. Selecciona Asignar un pseudo-TTY.
    3. Para confirmar los detalles del contenedor, haz clic en Seleccionar.
  4. Continúa con el proceso de creación de la VM.

gcloud

Usa la marca --container-tty para asignar un pseudo-TTY. En el siguiente ejemplo se inicia un contenedor y se asigna un pseudo-TTY:

gcloud compute instances create-with-container busybox-vm \
  --container-image docker.io/busybox:1.27 \
  --container-stdin \
  --container-tty

Usa el comando gcloud compute instances update-container con la marca --container-tty para actualizar un contenedor en una VM. Usa la marca --no-container-tty para no asignar un pseudo-TTY.

Anular el comando predeterminado que se ejecuta al iniciar el contenedor

El ENTRYPOINT de una imagen de contenedor especifica qué ejecutable se debe ejecutar cuando se inicia el contenedor y te permite ejecutar el contenedor como si fuera ese archivo binario.

Puedes anular el comando ENTRYPOINT de la imagen del contenedor.

docker run

Usa la marca --entrypoint (solo el comando, sin argumentos) del comando docker run. Consulta información sobre ENTRYPOINT y la marca --entrypoint.

Consola

  1. Ve a la página Crear una instancia.

    Ir a Crear una instancia

  2. En la sección Contenedor, haga clic en Implementar contenedor.

  3. En la página Configurar contenedor, haga lo siguiente:

    1. Especifica un nombre de imagen de contenedor.
    2. En el campo Comando, introduce un solo comando ejecutable sin parámetros (por ejemplo, uptime).
    3. Para confirmar los detalles del contenedor, haz clic en Seleccionar.
  4. Continúa con el proceso de creación de la VM.

gcloud

Usa la marca --container-command para anular la imagen del contenedor ENTRYPOINT. En el siguiente ejemplo se ejecuta el comando uptime en un contenedor de busybox para mostrar el tiempo transcurrido desde el último arranque:

gcloud compute instances create-with-container busybox-vm \
  --container-image docker.io/busybox:1.27 \
  --container-command "uptime"

Usa el comando gcloud compute instances update-container con la marca --container-command para actualizar un comando de un contenedor en una VM.

Usa la marca --clear-container-command con el comando update-container para borrar el comando predeterminado del contenedor actualizado.

Transferir argumentos al comando ENTRYPOINT del contenedor

Puedes transferir (añadir) argumentos al contenedor ENTRYPOINT o anular el comando predeterminado del contenedor CMD.

.

Consola

  1. Ve a la página Crear una instancia.

    Ir a Crear una instancia

  2. En la sección Contenedor, haga clic en Implementar contenedor.

  3. En la página Configurar contenedor, haga lo siguiente:

    1. Especifica un nombre de imagen de contenedor.
    2. En la sección Argumentos, haz clic en Añadir argumento.
    3. Introduce un argumento de comando en cada cuadro.
    4. Para confirmar los detalles del contenedor, haz clic en Seleccionar.
  4. Continúa con el proceso de creación de la VM.

gcloud

Usa la marca --container-arg para transferir argumentos a un comando de imagen de contenedor ENTRYPOINT. Usa un indicador independiente para cada argumento.

En el siguiente ejemplo, se ejecuta el comando /bin/ash con los argumentos -c 'ls -l' en un contenedor que se ha configurado para ejecutar busybox automáticamente:

gcloud compute instances create-with-container busybox-vm \
  --container-image docker.io/busybox:1.27 \
  --container-command "/bin/ash" \
  --container-arg="-c" \
  --container-arg="ls -l"

Usa el comando gcloud compute instances update-container con las marcas --container-arg para actualizar los argumentos de un contenedor que se esté ejecutando en una VM. La actualización sustituye toda la lista de argumentos por la nueva.

Usa la marca --clear-container-args con el comando update-container para quitar todos los argumentos de la declaración del contenedor.

Configurar las opciones del controlador de registro

Si necesitas configurar las opciones del controlador de registro, puedes crear un script de inicio de la VM para actualizar el archivo de configuración de Docker con las opciones de registro que necesites. Estas opciones se aplican a todos los contenedores que se ejecutan en la máquina virtual y que no especifican opciones de controlador de registro.

Por ejemplo, la siguiente secuencia de comandos de inicio define varias opciones, incluida una opción para limitar el tamaño del registro del contenedor, y, a continuación, reinicia Docker en la VM:

cat <<EOF > /etc/docker/daemon.json
{
  "live-restore": true,
  "storage-driver": "overlay2",
  "log-opts": {
    "max-size": "10m"
  }
}
EOF
systemctl restart docker

Configurar variables de entorno

Puedes definir variables de entorno en un contenedor. Solo se tiene en cuenta el último valor de KEY cuando KEY se repite más de una vez.

docker run

Usa la marca --env del comando docker run. Consulta cómo el motor de Docker permite definir variables de entorno.

Consola

  1. Ve a la página Crear una instancia.

    Ir a Crear una instancia

  2. En la sección Contenedor, haga clic en Implementar contenedor.

  3. En la página Configurar contenedor, haga lo siguiente:

    1. Especifica un nombre de imagen de contenedor.
    2. En la sección Variables de entorno, haga clic en Añadir variable.
    3. Añade o elimina variables de entorno según sea necesario (una por línea).
    4. Para confirmar los detalles del contenedor, haz clic en Seleccionar.
  4. Continúa con el proceso de creación de la VM.

gcloud

Usa la marca --container-env para definir variables de entorno en un contenedor. En el siguiente ejemplo se definen tres variables de entorno: HOME, MODE y OWNER:

gcloud compute instances create-with-container busybox-vm \
  --container-image docker.io/busybox:1.27 \
  --container-env HOME=/home,MODE=test,OWNER=admin

Usa la marca --container-env-file para definir variables de entorno desde un archivo local. En el siguiente ejemplo se definen las dos variables de entorno del archivo env.txt:

gcloud compute instances create-with-container busybox-vm \
  --container-image docker.io/busybox:1.27 \
  --container-env-file ./env.txt

El contenido del archivo env.txt es el siguiente:

# this is a comment
HOME=/home
MODE=test
OWNER=admin

Usa el comando gcloud compute instances update-container con la marca --container-env o --container-env-file para actualizar las variables de entorno de un contenedor en una VM. De esta forma, se actualizan las variables presentes en la declaración del contenedor de la instancia de VM. Se añaden las variables que no están en la declaración del contenedor.

Usa la marca --remove-container-env para quitar variables de entorno al actualizar un contenedor en una VM. En el siguiente ejemplo se eliminan las variables de entorno llamadas MODE y OWNER:

gcloud compute instances update-container busybox-vm \
  --remove-container-env MODE,OWNER

Si una variable de entorno especificada no existe, se ignora de forma silenciosa.

Montar un directorio de host como volumen de datos

Puedes montar un directorio de una máquina virtual host en un contenedor.

docker run

Usa las marcas --volume y --mount con el montaje type=bind del comando docker run. Consulta cómo monta un directorio de host el motor de Docker como volumen de datos.

Consola

  1. Ve a la página Crear una instancia.

    Ir a Crear una instancia

  2. En la sección Contenedor, haga clic en Implementar contenedor.

  3. En la página Configurar contenedor, haga lo siguiente:

    1. Especifica un nombre de imagen de contenedor.
    2. En la sección Montajes de volúmenes, haz clic en Añadir volumen.
    3. En la lista Tipo de volumen, selecciona Directorio y haz lo siguiente:

      • En el campo Ruta de montaje, especifica una ruta de montaje en una estructura de directorios de un contenedor en la que se montará un directorio de host.
      • En el campo Ruta del host, especifica una ruta del host al directorio del host que se va a montar.
      • En la lista Modo, especifica si quieres montar el directorio en modo de lectura/escritura o de solo lectura.
    4. Para confirmar los detalles del contenedor, haz clic en Seleccionar.

  4. Continúa con el proceso de creación de la VM.

gcloud

Usa la marca --container-mount-host-path para montar un directorio de una máquina virtual host en un contenedor. En el siguiente ejemplo, se monta el directorio host /tmp en el contenedor en /logs en modo de lectura/escritura:

gcloud compute instances create-with-container busybox-vm \
  --container-image docker.io/busybox:1.27 \
  --container-mount-host-path mount-path=/logs,host-path=/tmp,mode=rw

Especifica mode=ro para montar un directorio de host en modo de solo lectura.

Usa el comando gcloud compute instances update-container con la marca --container-mount-host-path para actualizar los montajes de directorios de host en un contenedor. Usa la marca --remove-container-mounts para quitar los volúmenes montados con las rutas de montaje especificadas. En el siguiente ejemplo se elimina un montaje de ruta de host con mount-path=/logs:

gcloud compute instances update-container busybox-vm \
  --remove-container-mounts /logs

Si la ruta de activación especificada no existe, se ignora de forma silenciosa.

Montar el sistema de archivos tmpfs como volumen de datos

Puedes montar un sistema de archivos tmpfs vacío en un contenedor.

Un sistema de archivos tmpfs vacío es similar a un volumen EmptyDir de Google Kubernetes Engine con medium:Memory. A diferencia de Docker, donde los datos de tmpfs se eliminan al reiniciar el contenedor, con tmpfs en un contenedor de Compute Engine, el volumen y sus datos se conservan al reiniciar el contenedor y solo se eliminan al reiniciar la VM.

Consola

  1. Ve a la página Crear una instancia.

    Ir a Crear una instancia

  2. En la sección Contenedor, haga clic en Implementar contenedor.

  3. En la página Configurar contenedor, haga lo siguiente:

    1. Especifica un nombre de imagen de contenedor.
    2. En la sección Montajes de volúmenes, haz clic en Añadir volumen.
    3. En la lista Tipo de volumen, selecciona TmpFS.
    4. En el campo Ruta de montaje, especifica una ruta de montaje en una estructura de directorio de contenedor en la que quieras montar un volumen de TmpFS.
    5. En la lista Modo, especifica si quieres montar el volumen de TmpFS en modo de lectura/escritura o de solo lectura.
    6. Para confirmar los detalles del contenedor, haz clic en Seleccionar.
  4. Continúa con el proceso de creación de la VM.

gcloud

Usa la marca --container-mount-tmpfs para montar un sistema de archivos tmpfs vacío en un contenedor. En el siguiente ejemplo se monta un sistema de archivos tmpfs en el contenedor en /cache en modo de lectura/escritura:

gcloud compute instances create-with-container busybox-vm \
  --container-image docker.io/busybox:1.27 \
  --container-mount-tmpfs mount-path=/cache
 

Usa el comando gcloud compute instances update-container con la marca --container-mount-tmpfs para actualizar los montajes de tmpfs en un contenedor. Usa la marca --remove-container-mounts para quitar un montaje de tmpfs con la ruta de montaje especificada al actualizar. En el siguiente ejemplo se elimina el montaje de tmpfs con mount-path=/cache:

gcloud compute instances update-container busybox-vm \
  --remove-container-mounts /cache

Si la ruta de activación especificada no existe, se ignora de forma silenciosa.

Montar un disco persistente como volumen de datos

Con Container-Optimized OS 69 o una versión posterior, puedes montar discos persistentes de una VM host en un contenedor.

Requisitos previos

  • El disco debe tener un sistema de archivos ext4 o no tener ninguno. Si no hay ningún sistema de archivos inicial, el agente de inicio del contenedor formatea el disco en ext4 y solo se admiten la adjunción y el montaje de lectura/escritura.
  • El disco debe estar vinculado a la VM.
  • Se admiten tanto dispositivos sin particiones como particiones. En el caso de los montajes de particiones, el disco no puede estar en blanco, sino que debe contener una tabla de particiones.

Consola

  1. Ve a la página Crear una instancia.

    Ir a Crear una instancia

  2. En la sección Contenedor, haga clic en Implementar contenedor.

  3. En la página Configurar contenedor, haga lo siguiente:

    1. Especifica un nombre de imagen de contenedor.
    2. En la sección Montajes de volúmenes, haz clic en Añadir volumen.
    3. En la lista Tipo de volumen, selecciona Disco.
    4. En el campo Ruta de montaje, especifica una ruta en la estructura de directorios del contenedor donde quieras montar el disco persistente.
    5. En la lista Nombre del disco, selecciona un disco que ya tengas para montarlo.
    6. En el campo Partición, especifica el número de partición que quieres montar si el disco tiene una tabla de particiones. Si el disco no tiene particiones, deja este campo en blanco.
    7. En la lista Modo, especifica si quieres montar el directorio en modo de lectura/escritura o de solo lectura.
    8. Para confirmar los detalles del contenedor, haz clic en Seleccionar.
  4. Continúa con el proceso de creación de la VM.

gcloud

Usa el comando gcloud compute instances create-with-container o el comando gcloud compute instances update-container con la marca --container-mount-disk para montar un disco persistente en un contenedor.

En el siguiente ejemplo se montan dos discos, my-data-disk y my-scratch-disk, en el contenedor en las rutas de montaje /disks/data-disk y /disks/scratch-disk.

gcloud compute instances create-with-container busybox-vm \
  --disk name=my-data-disk \
  --create-disk name=my-scratch-disk,auto-delete=yes,image=ubuntu-1710-artful-v20180315,image-project=ubuntu-os-cloud \
  --container-image docker.io/busybox:1.27 \
  --container-mount-disk mount-path="/disks/data-disk",name=my-data-disk,mode=ro \
  --container-mount-disk mount-path="/disks/scratch-disk",name=my-scratch-disk

Ten en cuenta que la marca --disk adjunta my-data-disk, la marca --create-disk crea y adjunta my-scatch-disk, y la marca --container-mount-disk monta los discos adjuntos en el contenedor. Como no se ha especificado ningún mode para my-scratch-disk, ese disco se monta en el contenedor en modo de lectura/escritura de forma predeterminada.

Usa el comando gcloud compute instances update-container con la marca --container-mount-disk para montar discos adicionales conectados o para modificar los montajes de discos que ya tengas.

Usa la marca --remove-container-mounts para quitar el montaje de un volumen de disco con la ruta de montaje especificada. En el siguiente ejemplo se cambia el modo de montaje de my-data-disk a lectura/escritura y se elimina el montaje del disco con mount-path="/disks/scratch-disk".

gcloud compute instances update-container busybox-vm \
  --container-mount-disk mount-path="/disks/data-disk",name=my-data-disk,mode=rw \
  --remove-container-mounts "/disks/scratch-disk"

Si la ruta de activación que pasas a la marca --remove-container-mounts no existe, se ignora de forma silenciosa.

Publicar puertos de contenedores

Las VMs con contenedores usan el modo de red de host, en el que un contenedor comparte la pila de red del host y todas las interfaces del host están disponibles para el contenedor.

Los puertos de los contenedores se asignan de forma individual a los puertos de la máquina virtual host. Por ejemplo, el puerto 80 de un contenedor se asigna al puerto 80 de la VM host. Compute Engine no admite la marca de publicación de puertos (-p), por lo que no es necesario especificarla para que la asignación funcione.

Para publicar los puertos de un contenedor, configura reglas de cortafuegos para habilitar el acceso a los puertos de la VM host. Los puertos correspondientes del contenedor son accesibles automáticamente, según las reglas del cortafuegos.

Ejemplo: Publicar el puerto 80 de un contenedor NGINX

docker run

Configura la marca --network="host" al usar el comando docker run. Consulta más información sobre los ajustes de red de contenedores y el modo de anfitrión.

gcloud

En el siguiente ejemplo se muestra cómo crear una instancia de VM con un contenedor NGINX y permitir el tráfico al puerto 80 del contenedor.

  1. Crea una instancia de VM con un contenedor NGINX:

    gcloud compute instances create-with-container nginx-vm \
    --container-image gcr.io/cloud-marketplace/google/nginx1:1.15 \
    --tags http-server
    

    El contenedor comparte la pila de red de la VM host y el puerto 80 del contenedor se publica en el puerto 80 de la VM host. La etiqueta http-server se usa como etiqueta de destino de la regla de firewall, que se crea en el siguiente paso.

  2. Crea una regla de cortafuegos para habilitar las conexiones al puerto 80 de la instancia de VM. La siguiente regla de cortafuegos permite las conexiones HTTP a las instancias de VM con la etiqueta http-server.

    gcloud compute firewall-rules create allow-http \
    --allow tcp:80 --target-tags http-server
    

    El contenedor empieza a recibir tráfico automáticamente en el puerto 80. No tienes que hacer ninguna configuración adicional.

    Puedes crear reglas de cortafuegos para combinaciones de protocolo y puerto de la VM host en las que el protocolo sea tcp o udp. Estas reglas rigen el acceso desde fuera de la VM a los puertos de contenedor correspondientes.

Siguientes pasos