Container auf Instanzen ausführen

Mit dem Befehl docker run können Sie einen Docker-Container auf einem Computer ausführen, auf dem Container-Optimized OS ausgeführt wird, ähnlich wie auf den meisten anderen Knotenimagedistributionen. Beispiel:

docker run --rm busybox echo "hello world"

Die Ausgabe sieht so aus:

Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
. . .
Status: Downloaded newer image for busybox:latest
hello world
Beim Verwalten von SSH-Schlüsseln in Metadaten werden alle Nutzerkonten, die von Compute Engine auf dem Image cos verwaltet werden, standardmäßig der Gruppe docker hinzugefügt. Dadurch kann jeder angemeldete Nutzer docker-Befehle ohne Root-Berechtigungen ausführen. Wenn Sie SSH-Schlüssel mit OS Login verwalten, muss das Nutzerkonto der Gruppe docker manuell hinzugefügt werden. Andernfalls muss der Nutzer sudo für jeden docker-Befehl hinzufügen.

Auf öffentliche Images in Container Registry oder Artifact Registry zugreifen

Unterstützung für Google Container Registry ist in das cos-Knoten-Image integriert. Führen Sie Folgendes aus, um einen Container über die Container Registry zu starten:

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

Die Ausgabe sieht so aus:

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

Auf private Images in Container Registry oder Artifact Registry zugreifen

Bei Versionen ab Meilenstein 60 ist in Container-Optimized OS-Images docker-credential-gcr vorinstalliert. Für den Zugriff auf private Images in Artifact Registry oder Container Registry wird diese Methode empfohlen.

Führen Sie den folgenden Befehl aus, um docker-credential-gcr zu verwenden:

Artifact Registry

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

Ersetzen Sie LOCATION durch den Standort Ihres Repositorys.

Container Registry

docker-credential-gcr configure-docker

Die Ausgabe sieht so aus:

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

Führen Sie mit folgendem Befehl ein Image aus der Registry aus:

Artifact Registry

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

Ersetzen Sie LOCATION durch den Standort Ihres Repositorys.

Container Registry

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

Sie können die folgenden Container Registry-Hostnamen verwenden:

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

Führen Sie den folgenden Befehl aus, um Docker mit sudo zu verwenden. Das Befehlszeilen-Flag -E sorgt dafür, dass Docker die Datei .docker/config.json aus dem Basisverzeichnis eines Nutzers anstelle des Stammverzeichnisses verwendet.

Artifact Registry

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

Ersetzen Sie LOCATION durch den Standort Ihres Repositorys.

Container Registry

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

Folgende Container Registry-Hostnamen werden unterstützt:

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

Alternativ können Sie die entsprechenden OAuth-Zugriffstoken aus Compute Engine-Metadaten abrufen und diese manuell mit dem Befehl docker login verwenden, wie im folgenden Beispiel gezeigt:

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

cloud-init mit Container Registry verwenden

Dieses Beispiel für cloud-init verwendet das Cloud Config-Format, um einen Docker-Container aus einem Image zu starten, das in der Container-Registry von Docker namens DockerHub gespeichert ist. In dem Beispiel wird das Cloud Config-Format verwendet, um einen Docker-Container aus einem in der Container Registry gespeicherten Image zu starten:

#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

Docker-Daemon so konfigurieren, dass er Images aus dem Registry-Cache abruft

Sie können den Docker-Daemon so konfigurieren, dass Images mithilfe von Registry-Spiegelungen aus einem Registry-Cache abgerufen werden.

  1. Konfigurieren Sie den Daemon zur Verwendung der registry-mirror-Option auf eine der folgenden Arten:

    • Fügen Sie in der Datei /etc/default/docker die Option registry-mirror für die Registry hinzu (z. B. https://mirror.gcr.io):
    echo 'DOCKER_OPTS="--registry-mirror=https://mirror.gcr.io"' | tee /etc/default/docker
    
    • Hängen Sie in der Datei /etc/default/docker "--registry-mirror=https://mirror.gcr.io" an das vorhandene DOCKER_OPTS an:
    sed -i -e 's|"$| --registry-mirror=https://mirror.gcr.io"|' /etc/default/docker
    
  2. Nachdem Sie die Registry-Spiegelung hinzugefügt haben, starten Sie den Docker-Daemon neu, damit die Änderungen wirksam werden:

    sudo systemctl daemon-reload
    sudo systemctl restart docker
    

Das Hinzufügen einer Konfiguration zu /etc/default/docker wird beim Neustart nicht beibehalten. Damit Ihre Docker-Konfiguration auch bei Neustarts beibehalten wird, sollten Sie die Befehle entweder im cloud-init-Skript der Instanz-Metadaten im cloud-config-Format einfügen oder in startup script.

Im folgenden Beispiel wird das Format cloud-config für die Konfiguration einer registry-mirror verwendet:

#cloud-config

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

Weitere Informationen zur Konfiguration einer Instanz mit cloud-init finden Sie unter cloud-init mit dem Cloud-Konfigurationsformat verwenden.

Fehlerbehebung

Optionskonflikte zwischen Docker daemon.json und Flags beheben

Wenn beim Konfigurieren des Docker-Daemon für eine Option gleichzeitig eine daemon.json-Datei und Flags festgelegt sind, startet Docker nicht. Dabei wird ein Fehler ausgegeben, der folgendem ähnelt:

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:

Die empfohlene Lösung für diesen Konflikt besteht darin, die Standard-daemon.json zu ändern, die sich in /etc/docker/daemon.json befindet. Durch das Ändern dieser Datei können Sie nur die betroffenen Optionen ändern, während Sie die anderen Standardoptionen beibehalten. Dies kann mit cloud-init erfolgen, beispielsweise mit einer cloud-config, die in etwa so aussieht:

#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