Configurar opciones para ejecutar su contenedor


Antes de comenzar

Cuando crea una instancia o una plantilla de instancia para usar en la implementación de contenedores en VM y MIG , especifique la configuración del contenedor mediante la consola de Google Cloud o la CLI de Google Cloud.

Las siguientes secciones describen cómo configurar opciones para instancias de VM, pero también puede configurar las siguientes opciones al crear una plantilla de instancia. Utilice la consola de Google Cloud o la CLI de Google Cloud para configurar opciones para instancias de VM en una plantilla de instancia.

Consola

  1. Vaya a la página Crear una plantilla de instancia .

    Vaya a Crear una plantilla de instancia .

  2. En la sección Contenedor , seleccione la casilla Implementar una imagen de contenedor en esta instancia de VM y expanda Opciones avanzadas de contenedor .

nube de gcloud

  1. En la CLI de Google Cloud, use el comando gcloud compute instance-templates create-with-container como se muestra en los siguientes ejemplos.

Especificación de una política de reinicio

Puede establecer una política de reinicio para especificar si se debe reiniciar un contenedor al salir. La política predeterminada es reiniciar siempre. También puede configurar la política para que se reinicie en caso de error o para que no se reinicie nunca.

Consola

  1. Vaya 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. Especifique un nombre de imagen de contenedor.
    2. En la sección Política de reinicio , seleccione la política de reinicio para el contenedor.
    3. Para confirmar los detalles del contenedor, haga clic en Seleccionar .
  4. Continúe con el proceso de creación de VM.

nube de gcloud

Utilice el indicador --container-restart-policy para especificar una política de reinicio del contenedor:

  • always (predeterminado)
  • on-failure
  • never

El siguiente ejemplo inicia un contenedor con una política de reinicio on-failure , lo que significa que el reinicio solo ocurre 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 en un contenedor que se ejecuta en una máquina virtual.

Ejecutar un contenedor en modo privilegiado

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

Consola

  1. Vaya 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. Especifique un nombre de imagen de contenedor.
    2. Seleccione Ejecutar como privilegiado .
    3. Para confirmar los detalles del contenedor, haga clic en Seleccionar .
  4. Continúe con el proceso de creación de VM.

nube de gcloud

Utilice el indicador --container-privileged para ejecutar un contenedor con privilegios de tiempo de ejecución. El siguiente ejemplo lanza 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. Utilice la marca --no-container-privileged para desactivar el modo privilegiado.

Asignar un búfer para STDIN en el tiempo de ejecución del contenedor

Puede asignar un búfer para STDIN en el tiempo de ejecución del contenedor para mantener la secuencia STDIN abierta en un contenedor. Si esto no está configurado, las lecturas de STDIN en el contenedor siempre resultan en 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 desde una tubería.

Consola

  1. Vaya 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. Especifique un nombre de imagen de contenedor.
    2. Seleccione Asignar un búfer para STDIN .
    3. Para confirmar los detalles del contenedor, haga clic en Seleccionar .
  4. Continúe con el proceso de creación de VM.

nube de gcloud

Utilice el indicador --container-stdin para asignar un búfer para STDIN en el tiempo de ejecución del contenedor. El siguiente ejemplo inicia un contenedor y 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. Utilice el indicador --no-container-stdin para desactivar la asignación de un búfer para STDIN .

Asignar un pseudo-TTY

Es necesario asignar un pseudo-TTY para un contenedor para establecer un shell interactivo en el contenedor (además de asignar un búfer para STDIN ).

Consola

  1. Vaya 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. Especifique un nombre de imagen de contenedor.
    2. Seleccione Asignar un pseudo-TTY .
    3. Para confirmar los detalles del contenedor, haga clic en Seleccionar .
  4. Continúe con el proceso de creación de VM.

nube de gcloud

Utilice el indicador --container-tty para asignar un pseudo-TTY. El siguiente ejemplo inicia un contenedor y 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. Utilice la marca --no-container-tty para no asignar un pseudo-TTY.

Anulación del comando predeterminado para ejecutar al iniciar el contenedor

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

Puede anular el comando ENTRYPOINT de la imagen del contenedor.

Consola

  1. Vaya 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. Especifique un nombre de imagen de contenedor.
    2. En el campo Comando , ingrese un único comando ejecutable sin parámetros, por ejemplo, uptime .
    3. Para confirmar los detalles del contenedor, haga clic en Seleccionar .
  4. Continúe con el proceso de creación de VM.

nube de gcloud

Utilice el indicador --container-command para anular la imagen del contenedor ENTRYPOINT . El siguiente ejemplo ejecuta el comando uptime en un contenedor de Busybox para mostrar el tiempo desde el último inicio:

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 para un contenedor en una máquina virtual.

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

Pasar argumentos al comando ENTRYPOINT del contenedor

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

Consola

  1. Vaya 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. Especifique un nombre de imagen de contenedor.
    2. En la sección Argumentos , haga clic en Agregar argumento .
    3. Ingrese un argumento de comando para cada cuadro.
    4. Para confirmar los detalles del contenedor, haga clic en Seleccionar .
  4. Continúe con el proceso de creación de VM.

nube de gcloud

Utilice el indicador --container-arg para pasar argumentos al comando ENTRYPOINT de una imagen de contenedor. Utilice una bandera separada para cada argumento.

El siguiente ejemplo 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"

Use el comando gcloud compute instances update-container con las marcas --container-arg para actualizar los argumentos del comando para un contenedor que se ejecuta en una máquina virtual. La actualización reemplaza toda la lista de argumentos con la nueva lista.

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

Configuración de opciones del controlador de registro

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

Por ejemplo, el siguiente script de inicio establece varias opciones (incluida una opción para limitar el tamaño de registro del contenedor) y luego 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

Configuración de variables de entorno

Puede establecer variables de entorno en un contenedor. Solo se toma el último valor de KEY cuando la KEY se repite más de una vez.

Consola

  1. Vaya 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. Especifique un nombre de imagen de contenedor.
    2. En la sección Variables de entorno , haga clic en Agregar variable .
    3. Agregue o elimine variables de entorno según sea necesario, una para cada línea.
    4. Para confirmar los detalles del contenedor, haga clic en Seleccionar .
  4. Continúe con el proceso de creación de VM.

nube de gcloud

Utilice el indicador --container-env para establecer variables de entorno en un contenedor. El siguiente ejemplo establece 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

Utilice el indicador --container-env-file para establecer variables de entorno desde un archivo local. El siguiente ejemplo establece 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:

# 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. Esto actualiza cualquier variable presente en la declaración del contenedor de la instancia de VM. Se agregan variables que no están en la declaración del contenedor.

Utilice el indicador --remove-container-env para eliminar variables de entorno al actualizar un contenedor en una VM. El siguiente ejemplo elimina las variables de entorno denominadas 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 silenciosamente.

Montar un directorio de host como volumen de datos

Puede montar un directorio desde una máquina virtual host en un contenedor.

Consola

  1. Vaya 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. Especifique un nombre de imagen de contenedor.
    2. En la sección Montajes de volumen , haga clic en Agregar volumen .
    3. En la lista Tipo de volumen , seleccione Directorio y haga lo siguiente:

      • En el campo Ruta de montaje , especifique una ruta de montaje en una estructura de directorio de contenedor en la que montar un directorio de host.
      • En el campo Ruta del host , especifique una ruta del host al directorio del host para montar.
      • En la lista Modo , especifique si desea montar el directorio en modo de lectura/escritura o de solo lectura.
    4. Para confirmar los detalles del contenedor, haga clic en Seleccionar .

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

nube de gcloud

Utilice la marca --container-mount-host-path para montar un directorio de máquina virtual host en un contenedor. El siguiente ejemplo monta el directorio de host /tmp en el contenedor en /logs en modo 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

Especifique 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 del directorio de host en un contenedor. Utilice la marca --remove-container-mounts para eliminar montajes de volumen con las rutas de montaje especificadas. El siguiente ejemplo 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 montaje especificada no existe, se ignora silenciosamente.

Montaje del sistema de archivos tmpfs como volumen de datos

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

Consola

  1. Vaya 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. Especifique un nombre de imagen de contenedor.
    2. En la sección Montajes de volumen , haga clic en Agregar volumen .
    3. En la lista Tipo de volumen , seleccione TmpFS .
    4. En el campo Ruta de montaje , especifique una ruta de montaje en una estructura de directorio de contenedor donde le gustaría montar un volumen TmpFS.
    5. En la lista Modo , especifique si desea montar el volumen TmpFS en modo de lectura/escritura o de solo lectura.
    6. Para confirmar los detalles del contenedor, haga clic en Seleccionar .
  4. Continúe con el proceso de creación de VM.

nube de gcloud

Utilice el indicador --container-mount-tmpfs para montar un sistema de archivos tmpfs vacío en un contenedor. El siguiente ejemplo monta un sistema de archivos tmpfs en el contenedor en /cache en modo 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. Utilice el indicador --remove-container-mounts para eliminar un montaje tmpfs con la ruta de montaje especificada al actualizar. El siguiente ejemplo elimina el montaje tmpfs con mount-path=/cache :

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

Si la ruta de montaje especificada no existe, se ignora silenciosamente.

Montar un disco persistente como volumen de datos

Con Container-Optimized OS 69 o posterior, puede montar discos persistentes desde una máquina virtual host en un contenedor.

Requisitos previos

  • El disco debe tener un sistema de archivos ext4 o no tener ningún sistema de archivos. Sin un sistema de archivos inicial, el agente de inicio del contenedor formatea el disco en ext4 y solo se admiten archivos adjuntos de lectura/escritura y montaje.
  • El disco debe estar conectado a la VM.
  • Se admiten tanto dispositivos sin particiones como particiones. Para montajes de particiones, el disco no puede estar en blanco; debe contener una tabla de particiones existente.

Consola

  1. Vaya 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. Especifique un nombre de imagen de contenedor.
    2. En la sección Montajes de volumen , haga clic en Agregar volumen .
    3. En la lista Tipo de volumen , seleccione Disco .
    4. En el campo Ruta de montaje , especifique una ruta en la estructura del directorio del contenedor donde desea montar el disco persistente.
    5. En la lista Nombre del disco , seleccione un disco existente para montar.
    6. En el campo Partición , especifique el número de partición a montar si el disco tiene una tabla de particiones. Si el disco no tiene particiones, deje este campo en blanco.
    7. En la lista Modo , especifique si desea montar el directorio en modo de lectura/escritura o de solo lectura.
    8. Para confirmar los detalles del contenedor, haga clic en Seleccionar .
  4. Continúe con el proceso de creación de VM.

nube de 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.

El siguiente ejemplo monta 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

Tenga en cuenta que el indicador --disk adjunta my-data-disk , el indicador --create-disk crea y adjunta my-scatch-disk y el indicador --container-mount-disk monta los discos conectados al contenedor. Debido a que no se especifica un mode para my-scratch-disk , ese disco se monta en el contenedor en modo lectura/escritura de forma predeterminada.

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

Utilice la marca --remove-container-mounts para eliminar un montaje de volumen de disco con la ruta de montaje especificada. El siguiente ejemplo cambia el modo de montaje de my-data-disk a lectura/escritura y 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 montaje que pasa al indicador --remove-container-mounts no existe, se ignora silenciosamente.

Publicación de puertos de contenedores

Las máquinas virtuales con contenedores utilizan el modo de red de host , donde un contenedor comparte la pila de red del host y todas las interfaces del host están disponibles para el contenedor.

Los puertos de contenedores tienen una asignación uno a uno con los puertos de la VM del host. Por ejemplo, un puerto de contenedor 80 se asigna al puerto 80 de la máquina virtual host. Compute Engine no admite el indicador de publicación de puertos ( -p ) y no es necesario especificarlo para que la asignación funcione.

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

Ejemplo: publicación del puerto 80 para un contenedor NGINX

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

  1. Cree 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 utiliza como etiqueta de destino para la regla de firewall, creada en el siguiente paso.

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

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

    El contenedor comienza a recibir tráfico automáticamente en el puerto 80. No es necesario realizar ninguna configuración adicional.

    Puede crear reglas de firewall para combinaciones de puerto y protocolo de VM del host donde el protocolo es tcp o udp . Estas reglas gobiernan efectivamente el acceso desde fuera de la VM a los puertos de contenedores correspondientes.

¿Qué sigue?