Exécuter des conteneurs sur des instances

Vous pouvez exécuter un conteneur Docker sur une machine exécutant unContainer-Optimized OS de la même manière que vous le feriez sur la plupart des autres distributions d'images de noeud, en utilisant la commande docker run. Exemple :

docker run --rm busybox echo "hello world"

Le résultat suivant s'affiche :

Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
. . .
Status: Downloaded newer image for busybox:latest
hello world
Lorsque vous gérez des clés SSH dans les métadonnées, tous les comptes utilisateur gérés par Compute Engine sur l'image cos sont ajoutés par défaut au groupe docker. Cela permet à tout utilisateur connecté d'exécuter des commandes docker sans droits racine. Lors de la gestion des clés SSH à l'aide d'OS Login, le compte utilisateur doit être ajouté manuellement au groupe docker. Sinon, l'utilisateur doit ajouter sudo pour chaque commande docker.

Accéder aux images publiques dans Container Registry ou Artifact Registry

L'assistance Container Registry est intégrée à l'image de nœud cos. Pour démarrer un conteneur à partir de Container Registry, exécutez :

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

Le résultat suivant s'affiche :

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

Accéder aux images privées dans Artifact Registry ou Container Registry

À partir des versions intermédiaire 60, docker-credential-gcr est préinstallé dans les images Container-Optimized OS. C'est la méthode recommandée pour accéder aux images privées dans Artifact Registry ou Container Registry.

Pour utiliser docker-credential-gcr, exécutez la commande suivante :

Artifact Registry

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

Remplacez LOCATION par l'emplacement de votre dépôt.

Container Registry,

docker-credential-gcr configure-docker

Le résultat suivant s'affiche :

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

Pour exécuter une image à partir du registre, utilisez la commande suivante :

Artifact Registry

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

Remplacez LOCATION par l'emplacement de votre dépôt.

Container Registry,

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

Vous pouvez utiliser les noms d'hôte Container Registry suivants:

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

Pour utiliser Docker avec sudo, exécutez la commande suivante. L'option de ligne de commande -E oblige Docker à utiliser le fichier .docker/config.json du répertoire d'accueil d'un utilisateur au lieu du répertoire d'accueil racine.

Artifact Registry

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

Remplacez LOCATION par l'emplacement de votre dépôt.

Container Registry,

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

Les noms d'hôte acceptés de Container Registry sont les suivants :

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

Vous pouvez également récupérer les jetons d'accès OAuth appropriés à partir des métadonnées Compute Engine et les utiliser manuellement avec la commande docker login, comme illustré dans l'exemple suivant :

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

Utiliser cloud-init avec Container Registry

Cet exemple cloud-init utilise le format Cloud Config pour démarrer un conteneur Docker à partir d'une image stockée dans l'instance Container Registry de Docker appelé DockerHub. Cet exemple utilise le format Cloud Config pour démarrer un conteneur Docker à partir d'une image stockée dans 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

Configurer le daemon Docker pour extraire des images du cache du registre

Vous pouvez configurer le daemon Docker pour extraire des images d'un cache de registre à l'aide de miroirs de registre.

  1. Configurez le daemon pour utiliser l'option registry-mirror de l'une des manières suivantes :

    • Dans le fichier /etc/default/docker, ajoutez l'option registry-mirror pour le registre (par exemple, https://mirror.gcr.io) :
    echo 'DOCKER_OPTS="--registry-mirror=https://mirror.gcr.io"' | tee /etc/default/docker
    
    • Dans le fichier /etc/default/docker, ajoutez "--registry-mirror=https://mirror.gcr.io" au fichier DOCKER_OPTS existant :
    sed -i -e 's|"$| --registry-mirror=https://mirror.gcr.io"|' /etc/default/docker
    
  2. Une fois le miroir de registre ajouté, redémarrez le daemon Docker pour que les modifications prennent effet :

    sudo systemctl daemon-reload
    sudo systemctl restart docker
    

L'ajout d'une configuration à /etc/default/docker n'est pas persistant lors du redémarrage. Pour vous assurer que votre configuration Docker reste persistante lors des redémarrages, envisagez d'ajouter les commandes au format cloud-config dans le script cloud-init des métadonnées de l'instance ou startup script.

L'exemple suivant utilise le format cloud-config pour configurer registry-mirror :

#cloud-config

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

Pour en savoir plus sur la configuration d'une instance avec cloud-init, consultez la page Utiliser cloud-init avec le format de configuration Cloud.

Dépannage

Résoudre les conflits d'options entre le fichier daemon.json Docker et les options

Lors de la configuration du daemon Docker, si la même option est définie avec un fichier daemon.json et avec des options, Docker ne démarre pas avec une erreur semblable à celle-ci :

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 solution recommandée pour résoudre ce conflit consiste à modifier la valeur par défaut daemon.json, qui se trouve dans /etc/docker/daemon.json. La modification de ce fichier vous permet de ne modifier que les options concernées, tout en conservant les autres options par défaut. Vous pouvez effectuer cette opération à l'aide de cloud-init, par exemple en utilisant un cloud-config semblable à :

#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