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
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.devLOCATION は、リポジトリのロケーションに置き換えます。
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-imageLOCATION は、リポジトリのロケーションに置き換えます。
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-imageLOCATION は、リポジトリのロケーションに置き換えます。
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/v1SVC_ACCT=$METADATA/instance/service-accounts/defaultACCESS_TOKEN=$(curl -H 'Metadata-Flavor: Google' $SVC_ACCT/token | cut -d'"' -f 4)docker login -u oauth2accesstoken -p $ACCESS_TOKEN https://gcr.iodocker 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 デーモンを構成できます。
次のいずれかの方法で
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レジストリ ミラーを追加したら、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