인스턴스에서 컨테이너 실행

docker run 명령어를 사용하여 대부분의 다른 노드 이미지 배포에서와 거의 동일한 방식으로 Container-Optimized OS를 실행하는 시스템에서 Docker 컨테이너를 실행할 수 있습니다. 예를 들면 다음과 같습니다.

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 로그인을 사용하여 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

Container Registry에서 cloud-init 사용

이 cloud-init 예시는 Cloud Config 형식을 사용하여 DockerHub라는 Docker Container Registry에 저장된 이미지에서 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 데몬 구성

registry-mirrors를 사용하여 레지스트리 캐시에서 이미지를 가져오도록 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 파일에서 "--registry-mirror=https://mirror.gcr.io"를 기존 DOCKER_OPTS에 추가합니다.
    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-config 형식에서 인스턴스의 메타데이터의 cloud-init 스크립트 또는 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