컨테이너 실행을 위한 옵션 구성

Compute Engine에서 컨테이너 실행에 사용할 인스턴스 또는 인스턴스 템플릿을 만들 때 Google Cloud Console 또는 gcloud 명령줄 도구를 사용하여 컨테이너 구성을 지정합니다.

시작하기 전에

재시작 정책 지정

재시작 정책을 설정하여 종료 시 컨테이너를 다시 시작할지 여부를 지정할 수 있습니다. 기본적으로 항상 다시 시작하도록 정책이 설정됩니다. 실패 시 다시 시작하거나 다시 시작하지 않도록 정책을 설정할 수도 있습니다.

Console

  1. VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스 페이지로 이동

  2. 인스턴스 만들기 버튼을 클릭하여 새 인스턴스를 만듭니다.
  3. 컨테이너 섹션에서 원하는 다시 시작 정책을 지정합니다.

gcloud

--container-restart-policy 플래그를 사용하여 컨테이너 재시작 정책을 지정합니다.

  • always(기본값)
  • on-failure
  • never

다음 예시에서는 on-failure 재시작 정책으로 컨테이너를 시작합니다. 이는 컨테이너 종료 코드가 0이 아닌 경우에만 다시 시작된다는 의미입니다.

gcloud compute instances create-with-container busybox-vm \
    --container-image docker.io/busybox:1.27 \
    --container-restart-policy on-failure

VM에서 실행 중인 컨테이너의 재시작 정책에 --container-restart-policy 플래그가 지정된 gcloud compute instances update-container 명령어를 사용합니다.

권한 모드에서 컨테이너 실행

권한 모드에서 컨테이너를 실행하면 호스트의 모든 기기에 대한 액세스를 허용할 수 있습니다. 컨테이너는 기본적으로 '권한 없음' 상태로 실행되며 기기 액세스가 허용되지 않습니다.

Console

  1. VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스 페이지로 이동

  2. 인스턴스 만들기 버튼을 클릭하여 새 인스턴스를 만듭니다.
  3. 컨테이너 섹션에서 컨테이너 이미지 배포를 선택합니다.
  4. 고급 컨테이너 옵션을 클릭합니다.
  5. 권한 모드로 실행을 선택합니다.

gcloud

런타임 권한으로 컨테이너를 실행하려면 --container-privileged 플래그를 사용합니다. 다음 예시에서는 busybox 컨테이너를 권한 모드에서 실행합니다.

gcloud compute instances create-with-container busybox-vm \
   --container-image docker.io/busybox:1.27 \
   --container-privileged

VM의 컨테이너를 업데이트하려면 --container-privileged 플래그가 지정된 gcloud compute instances update-container 명령어를 사용합니다. 권한 모드를 사용 중지하려면 --no-container-privileged 플래그를 사용합니다.

컨테이너 런타임에서 STDIN을 위한 버퍼 할당

컨테이너 런타임에서 STDIN을 위한 버퍼를 할당하여 컨테이너에서 스트림을 연 상태로 유지할 수 있습니다. 이것이 설정되지 않은 경우 컨테이너의 STDIN에서 읽기를 수행하면 항상 EOF가 발생합니다.

컨테이너에서 대화형 셸을 설정하고 컨테이너가 파이프에서 표준 입력을 수신하려면 유사 TTY를 할당하고 STDIN 스트림을 열어 두어야 합니다.

Console

  1. VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스 페이지로 이동

  2. 인스턴스 만들기 버튼을 클릭하여 새 인스턴스를 만듭니다.
  3. 컨테이너 섹션에서 컨테이너 이미지 배포를 선택합니다.
  4. 고급 컨테이너 옵션을 클릭합니다.
  5. STDIN용 버퍼 할당 을 선택합니다.

gcloud

컨테이너 런타임에서 STDIN에 대한 버퍼를 할당하려면 --container-stdin 플래그를 사용합니다. 다음 예시에서는 컨테이너를 시작하고 해당 STDIN을 연 상태로 유지합니다.

gcloud compute instances create-with-container busybox-vm \
    --container-image docker.io/busybox:1.27 \
    --container-stdin

VM의 컨테이너를 업데이트하려면 --container-stdin 플래그가 지정된 gcloud compute instances update-container 명령어를 사용합니다. STDIN의 버퍼 할당을 사용 중지하려면 --no-container-stdin 플래그를 사용하세요.

유사 TTY 할당

컨테이너에서 대화형 셸을 설정하려면 컨테이너의 유사 TTY를 할당해야 합니다(STDIN을 위한 버퍼 할당 포함).

Console

  1. VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스 페이지로 이동

  2. 인스턴스 만들기 버튼을 클릭하여 새 인스턴스를 만듭니다.
  3. 컨테이너 섹션에서 컨테이너 이미지 배포를 선택합니다.
  4. 고급 컨테이너 옵션을 클릭합니다.
  5. 유사 TTY 할당을 선택합니다.

gcloud

유사 TTY를 할당하려면 --container-tty 플래그를 사용합니다. 다음 예시에서는 컨테이너를 시작하고 유사 TTY를 할당합니다.

 gcloud compute instances create-with-container busybox-vm \
    --container-image docker.io/busybox:1.27 \
    --container-stdin \
    --container-tty

VM의 컨테이너를 업데이트하려면 --container-tty 플래그가 지정된 gcloud compute instances update-container 명령어를 사용합니다. 유사 TTY를 할당하지 않으려면 --no-container-tty 플래그를 사용합니다.

컨테이너 시작 시 실행할 기본 명령어 재정의

컨테이너 이미지의 ENTRYPOINT는 컨테이너가 시작될 때 실행할 실행 파일을 지정하고 바이너리인 것처럼 컨테이너를 실행할 수 있게 해줍니다.

컨테이너 이미지의 ENTRYPOINT 명령어를 재정의할 수 있습니다.

Console

  1. VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스 페이지로 이동

  2. 인스턴스 만들기 버튼을 클릭하여 새 인스턴스를 만듭니다.
  3. 컨테이너 섹션에서 컨테이너 이미지 배포를 선택합니다.
  4. 고급 컨테이너 옵션을 클릭합니다.
  5. 명령어 상자에 실행 가능한 단일 명령어를 매개변수 없이 입력합니다(예: uptime).

gcloud

컨테이너 이미지 ENTRYPOINT를 재정의하려면 --container-command 플래그를 사용하세요. 다음 예시에서는 busybox 컨테이너에서 uptime 명령어를 실행하여 마지막 부팅 이후 경과한 시간을 표시합니다.

gcloud compute instances create-with-container busybox-vm \
   --container-image docker.io/busybox:1.27 \
   --container-command "uptime"

VM의 컨테이너에 대한 명령을 업데이트하려면 --container-command 플래그가 지정된 gcloud compute instances update-container 명령어를 사용하세요.

업데이트된 컨테이너의 기본 명령어를 지우려면 update-container 명령어에 --clear-container-command 플래그를 사용하세요.

컨테이너 ENTRYPOINT 명령어에 인수 전달

컨테이너 ENTRYPOINT 명령어에 인수를 전달(추가)하거나 기본 컨테이너 CMD 명령어를 재정의할 수 있습니다.

Console

  1. VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스 페이지로 이동

  2. 인스턴스 만들기 버튼을 클릭하여 새 인스턴스를 만듭니다.
  3. 컨테이너 섹션에서 컨테이너 이미지 배포를 선택합니다.
  4. 고급 컨테이너 옵션을 클릭합니다.
  5. 명령 인수 아래에서 인수 추가를 클릭합니다.
  6. 상자당 하나의 명령 인수를 입력합니다.

gcloud

--container-arg 플래그를 사용하여 컨테이너 이미지 ENTRYPOINT 명령어에 인수를 전달합니다. 각 인수마다 개별 플래그를 사용합니다.

다음 예시에서는 busybox를 자동으로 실행하도록 설정된 컨테이너에서 -c 'ls -l' 인수를 사용하여 /bin/ash 명령어를 실행합니다.

gcloud compute instances create-with-container busybox-vm \
   --container-image docker.io/busybox:1.27 \
   --container-command "/bin/ash" \
   --container-arg="-c" \
   --container-arg="ls -l"

VM에서 실행 중인 컨테이너의 명령어 인수를 업데이트하려면 --container-arg 플래그가 지정된 gcloud compute instances update-container 명령어를 사용합니다. 업데이트는 전체 인수 목록을 새 목록으로 바꿉니다.

컨테이너 선언에서 모든 인수를 삭제하려면 update-container 명령어에 --clear-container-args 플래그를 사용합니다.

환경 변수 설정

컨테이너에서 환경 변수를 설정할 수 있습니다. [KEY]가 두 번 이상 반복될 경우 [KEY]의 마지막 값만 사용됩니다.

Console

  1. VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스 페이지로 이동

  2. 인스턴스 만들기 버튼을 클릭하여 새 인스턴스를 만듭니다.
  3. 컨테이너 섹션에서 컨테이너 이미지 배포를 선택합니다.
  4. 고급 컨테이너 옵션을 클릭합니다.
  5. 환경 변수 아래에서 변수 추가를 클릭합니다.
  6. 필요에 따라 한 줄에 하나씩 환경 변수를 추가하거나 삭제합니다.

gcloud

컨테이너에서 환경 변수를 설정하려면 --container-env 플래그를 사용합니다. 다음 예시에서는 HOME, MODE, OWNER의 세 가지 환경 변수를 설정합니다.

gcloud compute instances create-with-container busybox-vm \
    --container-image docker.io/busybox:1.27 \
    --container-env HOME=/home,MODE=test,OWNER=admin

로컬 파일에서 환경 변수를 설정하려면 --container-env-file 플래그를 사용합니다. 다음 예시에서는 env.txt 파일에서 두 환경 변수를 설정합니다.

gcloud compute instances create-with-container busybox-vm \
    --container-image docker.io/busybox:1.27 \
    --container-env-file ./env.txt

env.txt 파일의 내용은 다음과 같습니다.

# this is a comment
HOME=/home
MODE=test
OWNER=admin

VM의 컨테이너에 대한 환경 변수를 업데이트하려면 --container-env 또는 --container-env-file 플래그가 지정된 gcloud compute instances update-container 명령어를 사용합니다. 그러면 VM 인스턴스의 컨테이너 선언에 있는 모든 변수가 업데이트됩니다. 컨테이너 선언에 없는 변수는 추가됩니다.

VM에서 컨테이너를 업데이트할 때 환경 변수를 삭제하려면 --remove-container-env 플래그를 사용합니다. 다음 예시에서는 MODEOWNER라는 환경 변수를 삭제합니다.

gcloud compute instances update-container busybox-vm \
    --remove-container-env MODE,OWNER

지정된 환경 변수가 존재하지 않을 경우에는 자동으로 무시됩니다.

호스트 디렉토리를 데이터 볼륨으로 마운트

호스트 VM에서 컨테이너로 디렉터리를 마운트할 수 있습니다.

Console

  1. VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스 페이지로 이동

  2. 인스턴스 만들기 버튼을 클릭하여 새 인스턴스를 만듭니다.
  3. 컨테이너 섹션에서 컨테이너 이미지 배포를 선택합니다.
  4. 고급 컨테이너 옵션을 클릭합니다.
  5. 호스트 디렉토리 마운트에서 볼륨 추가를 클릭합니다.
  6. 다음을 지정합니다.

    • 마운트 경로. 컨테이너 디렉터리 구조에서 호스트 디렉터리를 마운트할 경로입니다.
    • 호스트 경로. 마운트할 호스트 디렉터리의 경로입니다.
    • 디렉터리를 읽기/쓰기 모드로 마운트할지, 읽기 전용 모드로 마운트할지 지정합니다.

gcloud

호스트 VM 디렉터리를 컨테이너에 마운트하려면 --container-mount-host-path 플래그를 사용합니다. 다음 예시에서는 /logs의 컨테이너에 읽기-쓰기 모드로 호스트 디렉터리 /tmp를 마운트합니다.

gcloud compute instances create-with-container busybox-vm \
    --container-image docker.io/busybox:1.27 \
    --container-mount-host-path mount-path=/logs,host-path=/tmp,mode=rw

읽기 전용 모드로 호스트 디렉터리를 마운트하려면 mode=ro를 지정합니다.

컨테이너의 호스트 디렉터리 마운트를 업데이트하려면 --container-mount-host-path 플래그가 지정된 gcloud compute instances update-container 명령어를 사용합니다. 지정된 마운트 경로를 사용하는 볼륨 마운트를 삭제하려면 --remove-container-mounts 플래그를 사용합니다. 다음 예시에서는 mount-path=/logs를 사용하는 호스트 경로 마운트를 삭제합니다.

gcloud compute instances update-container busybox-vm \
    --remove-container-mounts /logs

지정된 마운트 경로가 존재하지 않으면 자동으로 무시됩니다.

tmpfs 파일 시스템을 데이터 볼륨으로 마운트

비어 있는 tmpfs 파일 시스템을 컨테이너에 마운트할 수 있습니다.

Console

  1. VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스 페이지로 이동

  2. 인스턴스 만들기 버튼을 클릭하여 새 인스턴스를 만듭니다.
  3. 컨테이너 섹션에서 컨테이너 이미지 배포를 선택합니다.
  4. 고급 컨테이너 옵션을 클릭합니다.
  5. Tmpfs 마운트에서 볼륨 추가를 클릭합니다.
  6. tmpfs 볼륨을 마운트하려는 컨테이너 디렉터리 구조의 경로인 마운트 경로를 지정합니다. tmpfs 볼륨은 읽기/쓰기 모드로 마운트됩니다.

gcloud

비어 있는 tmpfs 파일 시스템을 컨테이너에 마운트하려면 --container-mount-tmpfs 플래그를 사용합니다. 다음 예시에서는 /cache의 컨테이너에 읽기-쓰기 모드로 tmpfs 파일 시스템을 마운트합니다.

gcloud compute instances create-with-container busybox-vm \
   --container-image docker.io/busybox:1.27 \
   --container-mount-tmpfs mount-path=/cache

컨테이너의 tmpfs 마운트를 업데이트하려면 --container-mount-tmpfs 플래그가 지정된 gcloud compute instances update-container 명령어를 사용합니다. 업데이트 시 지정된 마운트 경로를 사용하는 tmpfs 마운트를 삭제하려면 --remove-container-mounts 플래그를 사용합니다. 다음 예시에서는 mount-path=/cache를 사용하는 tmpfs 마운트를 삭제합니다.

gcloud compute instances update-container busybox-vm \
    --remove-container-mounts /cache

지정된 마운트 경로가 존재하지 않으면 자동으로 무시됩니다.

영구 디스크를 데이터 볼륨으로 마운트

컨테이너 최적화 OS 69 이상을 사용하는 경우 호스트 VM의 영구 디스크를 컨테이너로 마운트할 수 있습니다.

기본 요건

  • 디스크에 ext4 파일 시스템이 있거나 파일 시스템이 아예 없어야 합니다. 초기 파일 시스템이 없으면 컨테이너 시작 에이전트가 디스크를 ext4로 포맷하며, 읽기/쓰기 연결 및 마운트만 지원됩니다.
  • 디스크가 VM에 연결되어 있어야 합니다.
  • 파티션 없는 기기와 파티션이 모두 지원됩니다. 파티션 마운트의 경우 기존 파티션 테이블이 포함되어야 하므로 디스크가 비어 있을 수 없습니다.

Console

  1. VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스 페이지로 이동

  2. 인스턴스 만들기 버튼을 클릭하여 새 인스턴스를 만듭니다.
  3. 컨테이너 섹션에서 컨테이너 이미지 배포를 선택합니다.
  4. 고급 컨테이너 옵션을 클릭합니다.
  5. 볼륨 마운트에서 볼륨 추가를 클릭합니다.
  6. 볼륨 유형에서 Disk를 선택합니다.
  7. 영구 디스크를 마운트하려는 컨테이너 디렉터리 구조의 경로인 마운트 경로를 지정합니다.
  8. 디스크 이름에서 마운트할 기존 디스크를 선택하거나 새 디스크를 연결합니다.
  9. 디스크에 파티션 테이블이 있는 경우, 마운트하려는 파티션 번호를 지정합니다. 디스크에 파티션이 없으면 이 필드를 비워 둡니다.
  10. 디렉토리를 읽기/쓰기 모드로 마운트할지 읽기 전용 모드로 마운트할지 지정합니다.

gcloud

영구 디스크를 컨테이너에 마운트하려면 --container-mount-disk 플래그가 지정된 gcloud compute instances create-with-container 명령어 또는 gcloud compute instances update-container 명령어를 사용합니다.

다음 예시에서는 /disks/data-disk/disks/scratch-disk 마운트 경로의 컨테이너에 my-data-diskmy-scratch-disk라는 두 개의 디스크를 마운트합니다.

gcloud compute instances create-with-container busybox-vm \
    --disk name=my-data-disk \
    --create-disk name=my-scratch-disk,auto-delete=yes,image=ubuntu-1710-artful-v20180315,image-project=ubuntu-os-cloud \
    --container-image docker.io/busybox:1.27 \
    --container-mount-disk mount-path="/disks/data-disk",name=my-data-disk,mode=ro \
    --container-mount-disk mount-path="/disks/scratch-disk",name=my-scratch-disk

--disk 플래그는 my-data-disk를 연결하고 --create-disk 플래그는 my-scatch-disk를 만들고 연결하며 --container-mount-disk 플래그는 연결된 디스크를 컨테이너에 마운트합니다. my-scratch-disk에는 mode가 지정되지 않았으므로 해당 디스크는 기본적으로 읽기/쓰기 모드로 컨테이너에 마운트됩니다.

연결된 추가 디스크를 마운트하거나 기존 디스크 마운트를 수정하려면 --container-mount-disk 플래그가 지정된 gcloud compute instances update-container 명령어를 사용합니다.

지정된 마운트 경로를 사용하는 디스크 마운트를 삭제하려면 --remove-container-mounts 플래그를 사용합니다. 다음 예시에서는 my-data-disk의 마운트 모드를 읽기/쓰기로 변경하고 mount-path="/disks/scratch-disk"를 사용하는 디스크 마운트를 삭제합니다.

gcloud compute instances update-container busybox-vm \
    --container-mount-disk mount-path="/disks/data-disk",name=my-data-disk,mode=rw \
    --remove-container-mounts "/disks/scratch-disk"

--remove-container-mounts 플래그에 전달한 마운트 경로가 존재하지 않으면 자동으로 무시됩니다.

컨테이너 포트 게시

컨테이너를 포함하는 VM은 컨테이너가 호스트의 네트워크 스택을 공유하고 호스트의 모든 인터페이스가 컨테이너에 제공되는 호스트 네트워크 모드를 사용합니다.

컨테이너 포트는 호스트 VM 포트에 일대일로 매핑됩니다. 예를 들어 컨테이너 포트 80은 호스트 VM 포트 80에 매핑됩니다. Compute Engine은 포트 게시(-p) 플래그를 지원하지 않으며, 사용자가 매핑 작동을 위해 이를 지정할 필요가 없습니다.

컨테이너의 포트를 게시하려면 호스트 VM 인스턴스의 포트에 액세스할 수 있도록 방화벽 규칙을 구성합니다. 방화벽 규칙에 따라 컨테이너의 해당 포트에 자동으로 액세스할 수 있습니다.

예: NGINX 컨테이너에 대해 포트 80 게시

다음 예시는 NGINX 컨테이너로 VM 인스턴스를 만들고 컨테이너 포트 80에 대한 트래픽을 허용하는 방법을 보여줍니다.

  1. NGINX 컨테이너가 포함된 VM 인스턴스를 만듭니다.

    gcloud compute instances create-with-container nginx-vm \
        --container-image gcr.io/cloud-marketplace/google/nginx1:1.12 \
        --tags http-server
    

    이 컨테이너는 호스트 VM의 네트워크 스택을 공유합니다. 컨테이너의 포트 80은 호스트 VM의 포트 80에 게시됩니다. http-server 태그는 방화벽 규칙의 대상 태그로 사용되며 다음 단계에서 생성됩니다.

  2. VM 인스턴스의 포트 80에 연결할 수 있도록 방화벽 규칙을 만듭니다. 다음 방화벽 규칙은 http-server 태그를 사용하여 VM 인스턴스에 HTTP로 연결하도록 허용합니다.

    gcloud compute firewall-rules create allow-http \
        --allow tcp:80 --target-tags http-server
    

    컨테이너는 포트 80에서 자동으로 트래픽 수신을 시작합니다. 추가 구성은 수행할 필요가 없습니다.

    프로토콜이 tcp 또는 udp인 호스트 VM 프로토콜:포트 조합의 방화벽 규칙을 만들 수 있습니다. 이러한 규칙은 실질적으로 VM 외부에서 해당 컨테이너 포트로의 액세스를 제어합니다.

의견 및 질문

언제든지 의견과 질문을 보내주세요. Compute Engine 컨테이너팀으로 연락하여 질문을 하고, 문제를 보고하고, 새로운 기능을 요청하세요.

다음 단계