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

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

sudo で Docker を使用するには、次のコマンドを実行します。-E コマンドライン フラグを使用すると、Docker はルート ホーム ディレクトリではなく、ユーザーのホーム ディレクトリにある .docker/config.json ファイルを使用します。

Artifact Registry

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

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

Container Registry

sudo -E 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

cloud-init を使用してインスタンスを構成する方法については、Cloud Config 形式で cloud-init を使用するをご覧ください。

トラブルシューティング

Docker の daemon.json とフラグ間で生じるオプションの競合の解決

Docker デーモンを構成するときに、daemon.json ファイルとフラグを使用して同じオプションが設定されている場合、Docker は次のようなエラーにより起動に失敗します。

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:

この競合を解決するには、/etc/docker/daemon.json にあるデフォルトの daemon.json を変更することをおすすめします。このファイルを変更すると、他のデフォルト オプションを維持しながら、影響を受けるオプションのみを変更できます。これを行うには、cloud-init を使用します。たとえば、次のような cloud-config を使用します。

#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