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

Wenn Sie SSH-Schlüssel in Metadaten verwalten, werden alle Nutzerkonten, die von Compute Engine im 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 mithilfe von OS Login verwalten, muss das Nutzerkonto der Gruppe docker manuell hinzugefügt werden. Oder der Nutzer muss für jeden docker-Befehl sudo 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

Verwenden Sie den folgenden Befehl, um ein Image aus der Registry auszuführen:

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

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 konfigurieren, um Images aus dem Registry-Cache abzurufen

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 für die Verwendung der Option registry-mirror 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 zum Konfigurieren einer Instanz mit cloud-init finden Sie unter cloud-init mit dem Cloud-Konfigurationsformat verwenden.

Kubernetes-Cluster ausführen

Zum Ausführen eines Kubernetes-Clusters in Google Cloud eignet sich Google Kubernetes Engine (GKE) am besten. Befolgen Sie diese Schritte, wenn Sie stattdessen eine selbstverwaltete Version des quelloffenen Kubernetes verwenden möchten.

  1. Prüfen Sie, ob der Kubernetes-Master durch Öffnen von Port 443 in Ihrer Firewall erreicht werden kann.
  2. Laden Sie die Release-Binärdateien von Kubernetes herunter, entpacken Sie diese und richten Sie den Cluster ein:

    # Download and extract the latest kubernetes release.
    cd <empty-dir>
    KUBERNETES_VERSION="v1.4.6"
    curl -sSL -o kubernetes.tar.gz https://github.com/kubernetes/kubernetes/releases/download/${KUBERNETES_VERSION}/kubernetes.tar.gz
    tar xzf kubernetes.tar.gz
    cd kubernetes
    
    # Configure environment to use Container-Optimized OS
    export KUBE_OS_DISTRIBUTION=cos
    
    # Start up a cluster and verify that it is running:
    cluster/kube-up.sh
    cluster/kubectl.sh get nodes
    cluster/kubectl.sh get pods --namespace=kube-system
    
  3. Jetzt können Sie Ihre Anwendung auf dem Cluster ausführen. Sie können beispielsweise einen Redis-Cluster wie im folgenden Beispiel starten:

    cluster/kubectl.sh create -f \
      examples/guestbook/all-in-one/guestbook-all-in-one.yaml
    cluster/kubectl.sh get pods
    cluster/kubectl.sh describe pods redis-master-pod-name
    

Bei Instanzen, die als Teil eines GKE-Clusters ausgeführt werden, werden Docker- und Kubelet-Logs automatisch in das Loggingmodul der Operations Suite von Google Cloud exportiert. Logs für Docker, Kubelet und kube-proxy sind in der Google Cloud-Operations-Suite unter Compute Engine-VM-Instanz verfügbar, wenn Sie die Google Cloud-Konsole verwenden.

Sobald der Cluster nicht mehr benötigt wird, können Sie ihn auflösen:

cluster/kube-down.sh

Fehlerbehebung

Optionskonflikte zwischen Docker daemon.json und Flags lösen

Wenn beim Konfigurieren des Docker-Daemon eine Option mit der Datei daemon.json und mit Flags festgelegt wird, schlägt Docker mit einem Fehler wie dem folgenden fehl:

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 zur Lösung dieses Konflikts besteht darin, den Standard-daemon.json zu ändern, der sich unter /etc/docker/daemon.json befindet. Wenn Sie diese Datei ändern, können nur die betroffenen Optionen geändert werden, während die anderen Standardoptionen beibehalten werden. 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

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

    opts = {}
    with open(DAEMON_OPTS_FILE) as f:
        opts = json.load(f)
    # 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