Ejecuta contenedores en instancias

Puedes ejecutar un contenedor de Docker en una máquina que ejecute Container-Optimized OS de la misma manera que lo harías en la mayoría de las demás distribuciones de imágenes de nodo, con el comando docker run. Por ejemplo:

docker run --rm busybox echo "hello world"

Aparece este resultado:

Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
. . .
Status: Downloaded newer image for busybox:latest
hello world
Cuando se administran las claves SSH en los metadatos, todas las cuentas de usuario que administra Compute Engine en la imagen cos se agregan al grupo docker de forma predeterminada. Esto permite que cualquier usuario que haya accedido ejecute comandos docker sin privilegios raíz. Cuando administras llaves SSH con el Acceso al SO, la cuenta de usuario debe agregarse al grupo docker de forma manual. De lo contrario, el usuario deberá agregar sudo para cada comando docker.

Accede a imágenes públicas en Container Registry o Artifact Registry

La compatibilidad de Container Registry está integrada en la imagen de nodo cos. Para iniciar un contenedor desde Container Registry, ejecuta el siguiente comando:

docker run --rm gcr.io/google-containers/busybox echo "hello world"

Aparece este resultado:

Unable to find image 'gcr.io/google-containers/busybox:latest' locally
Pulling repository gcr.io/google-containers/busybox
. . .
Status: Downloaded newer image for gcr.io/google-containers/busybox:latest
hello world

Accede a imágenes privadas en Artifact Registry o Container Registry

A partir de las actualizaciones del evento importante 60, docker-credential-gcr ya viene instalado en las imágenes de Container-Optimized OS. Es la forma recomendada para acceder a imágenes privadas en Artifact Registry o Container Registry.

Para usar docker-credential-gcr, ejecuta el siguiente comando:

Artifact Registry

docker-credential-gcr configure-docker --registries LOCATION-docker.pkg.dev

Reemplaza LOCATION por la ubicación de tu repositorio.

Container Registry

docker-credential-gcr configure-docker

Aparece este resultado:

/home/username/.docker/config.json configured to use this credential helper

Para ejecutar una imagen desde el registro, usa el siguiente comando:

Artifact Registry

docker run --rm LOCATION-docker.pkg.dev/your-project/repository/your-image

Reemplaza LOCATION por la ubicación de tu repositorio.

Container Registry

docker run --rm gcr.io/your-project/your-image

Puedes usar los siguientes nombres de host de Container Registry:

  • us.gcr.io
  • eu.gcr.io
  • asia.gcr.io

Para usar Docker con sudo, ejecuta el siguiente comando. La marca de línea de comandos -E hace que Docker use el archivo .docker/config.json del directorio principal de un usuario en lugar del directorio principal raíz.

Artifact Registry

sudo -E docker run --rm LOCATION-docker.pkg.dev/your-project/repository/your-image

Reemplaza LOCATION por la ubicación de tu repositorio.

Container Registry

sudo -E docker run --rm gcr.io/your-project/your-image

Los nombres de host admitidos de Container Registry son los siguientes:

  • us.gcr.io
  • eu.gcr.io
  • asia.gcr.io

De manera alternativa, puedes recuperar los tokens de acceso de OAuth adecuados en los metadatos de Compute Engine y usarlos con el comando docker login de forma manual, como se muestra en el siguiente ejemplo:

METADATA=http://metadata.google.internal/computeMetadata/v1
SVC_ACCT=$METADATA/instance/service-accounts/default
ACCESS_TOKEN=$(curl -H 'Metadata-Flavor: Google' $SVC_ACCT/token | cut -d'"' -f 4)
docker login -u oauth2accesstoken -p $ACCESS_TOKEN https://gcr.io
docker run … gcr.io/your-project/your-image

Usa cloud-init con Container Registry

Este ejemplo de cloud-init usa el formato de Cloud Config para iniciar un contenedor de Docker desde una imagen almacenada en el registro de contenedores de Docker, llamado DockerHub. En el siguiente ejemplo, se usa el formato de Cloud Config para iniciar un contenedor de Docker desde una imagen almacenada en Container Registry:

#cloud-config

write_files:
- path: /etc/systemd/system/cloudservice.service
  permissions: 0644
  owner: root
  content: |
    [Unit]
    Description=Start a simple docker container
    Wants=gcr-online.target
    After=gcr-online.target

    [Service]
    Environment="HOME=/home/cloudservice"
    ExecStartPre=/usr/bin/docker-credential-gcr configure-docker
    ExecStart=/usr/bin/docker run --rm --name=mycloudservice gcr.io/google-containers/busybox:latest /bin/sleep 3600
    ExecStop=/usr/bin/docker stop mycloudservice
    ExecStopPost=/usr/bin/docker rm mycloudservice

runcmd:
- systemctl daemon-reload
- systemctl start cloudservice.service

Configura el daemon de Docker para extraer imágenes de la caché de registro

Puedes configurar el daemon de Docker para extraer imágenes de una caché de registro mediante duplicaciones de registro.

  1. Configura el daemon para usar la opción registry-mirror de una de las siguientes maneras:

    • En el archivo /etc/default/docker, agrega la opción registry-mirror para el registro (por ejemplo, https://mirror.gcr.io):
    echo 'DOCKER_OPTS="--registry-mirror=https://mirror.gcr.io"' | tee /etc/default/docker
    
    • En el archivo /etc/default/docker, agrega "--registry-mirror=https://mirror.gcr.io" al DOCKER_OPTS existente:
    sed -i -e 's|"$| --registry-mirror=https://mirror.gcr.io"|' /etc/default/docker
    
  2. Después de agregar la duplicación del registro, reinicia el daemon de Docker para que se apliquen los cambios:

    sudo systemctl daemon-reload
    sudo systemctl restart docker
    

Agregar una configuración a /etc/default/docker no es persistente durante el reinicio. Para asegurarte de que la configuración de Docker permanezca persistente durante los reinicios, considera agregar los comandos ya sea en la secuencia de comandos cloud-init de los metadatos de la instancia en formato cloud-config o startup script.

En el siguiente ejemplo, se usa el formato cloud-config para configurar un registry-mirror:

#cloud-config

runcmd:
- echo 'DOCKER_OPTS="--registry-mirror=https://mirror.gcr.io"' | tee /etc/default/docker
- systemctl daemon-reload
- systemctl restart docker

Para obtener más información sobre cómo configurar una instancia con cloud-init, consulta Usa cloud-init con el formato de configuración de Cloud.

Soluciona problemas

Resuelve los conflictos de opciones entre las marcas y el daemon.json de Docker

Cuando configuras el daemon de Docker, si la misma opción se establece con un archivo daemon.json y con marcas, Docker no se iniciará con un error similar al siguiente:

unable to configure the Docker daemon with file /etc/docker/daemon.json:
the following directives are specified both as a flag and in the configuration file:

La solución recomendada para resolver este conflicto es modificar el daemon.json predeterminado, que se encuentra en /etc/docker/daemon.json. Modificar este archivo permite cambiar solo las opciones afectadas y mantener las otras opciones predeterminadas. Esto se puede hacer con cloud-init, por ejemplo, con un cloud-config similar a:

#cloud-config

write_files:
- path: /tmp/modify_docker_daemon_opts.py
  permissions: 0744
  owner: root
  content: |
    import json, sys, os, logging

    DAEMON_OPTS_FILE = '/etc/docker/daemon.json'

    opts = {}
    if os.path.exists(DAEMON_OPTS_FILE):
      with open(DAEMON_OPTS_FILE) as f:
          try:
            opts = json.load(f)
          except:
            logging.info("json parsing failed, starting with empty config.")
            pass
    # Add your daemon option modifications here
    # For example,
    # opts['log-opts']['max-size'] = '100m'
    with open(DAEMON_OPTS_FILE, 'w') as f:
        json.dump(opts, f)

runcmd:
- python /tmp/modify_docker_daemon_opts.py
- rm -f /tmp/modify_docker_daemon_opts.py
- systemctl restart docker.service