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. Damit kann jeder angemeldete Nutzer docker-Befehle ohne Root-Berechtigungen ausführen. Beim Verwalten von SSH-Schlüsseln mithilfe von OS Login 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

Mit dem folgenden Befehl führen Sie 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

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 Images aus dem Registry-Cache abgerufen werden

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

  1. Sie können den Daemon so konfigurieren, dass er die Option registry-mirror verwendet:

    • 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

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