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.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 デーモンを構成できます。
次のいずれかの方法で
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