Esecuzione dei container sulle istanze

Puoi eseguire un container Docker su una macchina che esegue Container-Optimized OS come faresti sulla maggior parte delle altre distribuzioni di immagini dei nodi, utilizzando il comando docker run. Ad esempio:

docker run --rm busybox echo "hello world"

Viene visualizzato il seguente output:

Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
. . .
Status: Downloaded newer image for busybox:latest
hello world
Quando si gestiscono le chiavi SSH nei metadati, tutti gli account utente gestiti da Compute Engine nell'immagine cos vengono aggiunti al gruppo docker per impostazione predefinita. Questo consente a qualsiasi utente che ha eseguito l'accesso di eseguire i comandi docker senza privilegi root. Se gestisci le chiavi SSH utilizzando OS Login, l'account utente deve essere aggiunto manualmente al gruppo docker. In caso contrario, l'utente deve aggiungere sudo per ogni comando docker.

Accesso alle immagini pubbliche in Container Registry o Artifact Registry

Il supporto di Container Registry è integrato nell'immagine del nodo cos. Per avviare un container da Container Registry, esegui:

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

Viene visualizzato il seguente output:

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

Accesso alle immagini private in Artifact Registry o Container Registry

A partire dalle release del traguardo 60, docker-credential-gcr è preinstallato nelle immagini di Container-Optimized OS. È il modo consigliato per accedere alle immagini private in Artifact Registry o Container Registry.

Per utilizzare docker-credential-gcr, esegui questo comando:

Artifact Registry

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

Sostituisci LOCATION con la località del tuo repository.

Container Registry

docker-credential-gcr configure-docker

Viene visualizzato il seguente output:

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

Per eseguire un'immagine dal registro, utilizza il seguente comando:

Artifact Registry

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

Sostituisci LOCATION con la località del tuo repository.

Container Registry

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

Puoi utilizzare i seguenti nomi host di Container Registry:

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

Per utilizzare docker con sudo, esegui questo comando. Il flag della riga di comando -E consente a Docker di utilizzare il file .docker/config.json dalla home directory dell'utente anziché dalla home directory principale.

Artifact Registry

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

Sostituisci LOCATION con la località del tuo repository.

Container Registry

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

I nomi host di Container Registry supportati sono:

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

In alternativa, puoi recuperare i token di accesso OAuth appropriati dai metadati di Compute Engine e utilizzarli manualmente con il comando docker login, come mostrato nell'esempio seguente:

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

Utilizzo di cloud-init con Container Registry

Questo esempio di cloud-init utilizza il formato Cloud Config per avviare un container Docker da un'immagine archiviata nel Container Registry di Docker denominato DockerHub. L'esempio seguente utilizza il formato Cloud Config per avviare un container Docker da un'immagine archiviata in 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

Configurazione del daemon Docker per il pull delle immagini dalla cache del registro

Puoi configurare il daemon Docker per eseguire il pull delle immagini da una cache del registro di sistema utilizzando i mirror del Registro di sistema.

  1. Configura il daemon per utilizzare l'opzione registry-mirror in uno dei seguenti modi:

    • Nel file /etc/default/docker, aggiungi l'opzione registry-mirror per il registro (ad esempio, https://mirror.gcr.io):
    echo 'DOCKER_OPTS="--registry-mirror=https://mirror.gcr.io"' | tee /etc/default/docker
    
    • Nel file /etc/default/docker, aggiungi "--registry-mirror=https://mirror.gcr.io" al DOCKER_OPTS esistente:
    sed -i -e 's|"$| --registry-mirror=https://mirror.gcr.io"|' /etc/default/docker
    
  2. Dopo aver aggiunto il mirroring del registro, riavvia il daemon Docker per applicare le modifiche:

    sudo systemctl daemon-reload
    sudo systemctl restart docker
    

L'aggiunta di una configurazione a /etc/default/docker non è persistente per tutta la durata del riavvio. Per assicurarti che la configurazione Docker rimanga permanente tra i riavvii, valuta la possibilità di aggiungere i comandi nello script cloud-init dei metadati dell'istanza in formato cloud-config o in startup script.

L'esempio seguente utilizza il formato cloud-config per configurare 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

Per saperne di più sulla configurazione di un'istanza con cloud-init, consulta Utilizzo di cloud-init con il formato di configurazione di Cloud.

Risoluzione dei problemi

Risoluzione dei conflitti tra le opzioni tra Docker daemon.json e flag

Durante la configurazione del daemon Docker, se la stessa opzione è impostata con un file daemon.json e con i flag, Docker non si avvia con un errore simile al seguente:

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 soluzione consigliata per risolvere il conflitto è modificare il valore predefinito daemon.json, che si trova all'indirizzo /etc/docker/daemon.json. La modifica di questo file consente di cambiare solo le opzioni interessate, mantenendo le altre opzioni predefinite. Questa operazione può essere eseguita utilizzando cloud-init, ad esempio utilizzando un cloud-config simile 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