在執行個體上執行容器

您可以在執行 Container-Optimized OS 的電腦上執行 Docker 容器,方法與在大多數其他節點映像檔發行版本上執行時大致相同,只要使用 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
在中繼資料中管理安全殼層金鑰時,根據預設,Compute Engine 在 cos 映像檔中管理的所有使用者帳戶都會新增至 docker 群組。這可讓任何登入使用者在不具備 root 權限的情況下執行 docker 指令。使用 OS 登入管理 SSH 金鑰時,您必須手動將使用者帳戶新增至 docker 群組。否則,使用者必須為每個 docker 指令新增 sudo

存取 Container Registry 或 Artifact Registry 中的公開映像檔

cos 節點映像檔內建了 Container Registry 支援功能。如要從 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

搭配使用 cloud-init 和 Container Registry

這個 cloud-init 範例使用 Cloud Config 格式,從儲存在 Docker 容器註冊中心 DockerHub 中的映像檔啟動 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

設定 Docker Daemon 從註冊資料庫快取中提取映像檔

您可以設定 Docker Daemon,讓它使用註冊資料庫鏡像,從註冊資料庫快取中提取映像檔。

  1. 請使用下列其中一種方式,設定 Daemon 使用 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 檔案中,將 "--registry-mirror=https://mirror.gcr.io" 附加至現有的 DOCKER_OPTS
    sed -i -e 's|"$| --registry-mirror=https://mirror.gcr.io"|' /etc/default/docker
  2. 新增註冊資料庫鏡像後,請重新啟動 Docker Daemon,讓變更生效:

    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-init 和 Cloud 設定格式」。

疑難排解

解決 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:

建議解決方案是修改預設的 daemon.json,位於 /etc/docker/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