インスタンスでのコンテナの実行

Docker コンテナは、他のほとんどのノードイメージ ディストリビューションと同様の方法で、Container-Optimized OS を実行するマシン上で docker run コマンドを使用して実行できます。例:

docker run --rm busybox echo "hello world"

次の出力が表示されます。

Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
. . .
Status: Downloaded newer image for busybox:latest
hello world

メタデータで SSH 認証鍵を管理する場合、デフォルトでは、cos イメージ上で Compute Engine が管理するすべてのユーザー アカウントが docker グループに追加されます。これにより、どのユーザーもルート権限なしで docker コマンドを実行できます。OS Login を使用して SSH 認証鍵を管理する場合は、ユーザー アカウントを docker グループに手動で追加する必要があります。あるいは、ユーザーが docker コマンドごとに sudo を追加する必要があります。

Container Registry または Artifact Registry の公開イメージへのアクセス

Container Registry サポートは cos ノードイメージに組み込まれています。Container Registry からコンテナを起動するには、次のコマンドを実行します。

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

次の出力が表示されます。

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

Artifact Registry または Container Registry の非公開イメージにアクセスする

マイルストーン 60 リリース以降では、docker-credential-gcr が Container-Optimized OS イメージにプリインストールされています。これは、Artifact Registry または Container Registry の非公開イメージにアクセスするおすすめの方法です。

docker-credential-gcr を使用する場合は、次のコマンドを実行します。

Artifact Registry

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

LOCATION は、リポジトリのロケーションに置き換えます。

Container Registry

docker-credential-gcr configure-docker

次の出力が表示されます。

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

レジストリからイメージを実行するには、次のコマンドを使用します。

Artifact Registry

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

LOCATION は、リポジトリのロケーションに置き換えます。

Container Registry

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

サポート対象の Container Registry ホスト名は次のとおりです。

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

または、次の例のように、Compute Engine メタデータから適切な OAuth アクセス トークンを取得し、それらのトークンを docker login コマンドで手動入力します。

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

Container Registry での cloud-init の使用

cloud-init の例では、cloud-config 形式を使用して、DockerHub と呼ばれる Docker のコンテナ レジストリに保存されているイメージから Docker コンテナを起動します。下の例では、cloud-config 形式を使用して、Container Registry に保存されているイメージから Docker コンテナーを起動します。

#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

レジストリ キャッシュからイメージを pull するための Docker デーモンの構成

レジストリ ミラーを使用してレジストリ キャッシュからイメージを pull するように Docker デーモンを構成できます。

  1. 次のいずれかの方法で registry-mirror オプションを使用するようにデーモンを構成します。

    • /etc/default/docker ファイルで、レジストリに registry-mirror オプション(例: https://mirror.gcr.io)を追加します。
    echo 'DOCKER_OPTS="--registry-mirror=https://mirror.gcr.io"' | tee /etc/default/docker
    
    • /etc/default/docker ファイルで、既存の DOCKER_OPTS"--registry-mirror=https://mirror.gcr.io" を追加します。
    sed -i -e 's|"$| --registry-mirror=https://mirror.gcr.io"|' /etc/default/docker
    
  2. レジストリ ミラーを追加したら、Docker デーモンを再起動して変更を反映します。

    sudo systemctl daemon-reload
    sudo systemctl restart docker
    

/etc/default/docker に追加した構成は、再起動すると失われます。再起動後も Docker の構成が維持されるようにするには、コマンドをインスタンスのメタデータの cloud-init スクリプトに cloud-config 形式で追加するか、startup script に追加することを検討してください。

次の例では、cloud-config 形式を使用して registry-mirror を構成しています。

#cloud-config

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

Kubernetes クラスタの実行

Google Cloud で Kubernetes クラスタを実行する場合は、Google Kubernetes Engine(GKE)の使用をおすすめします。ただし、セルフマネージド型のオープンソース Kubernetes を実行したい場合は、次の手順に沿って操作します。

  1. ファイアウォールでポート 443 を開くことで、Kubernetes マスターにアクセスできることを確認します。
  2. Kubernetes リリース バイナリをダウンロードして解凍し、次のようにクラスタを設定します。

    # 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. 以上により、アプリケーションがクラスタで実行できます。たとえば、次のようにして Redis クラスタを起動できます。

    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
    

GKE クラスタの一部として実行されているインスタンスの場合、Docker と Kubelet のログも自動的に Google Cloud のオペレーション スイートのロギングにエクスポートされます。Docker、Kubelet、kube-proxy のログは、Google Cloud Console を使用している場合、Compute Engine VM インスタンスの Google Cloud のオペレーション スイートで利用できます。

クラスタが不要になったら、次のコマンドで破棄できます。

cluster/kube-down.sh