바인드 탑재 - Amazon Elastic Container Service

바인드 탑재

바인드 탑재로 호스트의 파일 또는 디렉터리(예: Amazon EC2 인스턴스 또는 AWS Fargate)가 컨테이너에 탑재됩니다. 바인드 탑재는 Fargate와 Amazon EC2 인스턴스 모두에서 호스팅되는 태스크에 지원됩니다. 기본적으로 바드 탑재는 해당 이를 사용하는 컨테이너의 수명주기와 연결됩니다. 바인드 탑재를 사용하는 모든 컨테이너가 중지되면(예: 태스크가 중지될 때) 데이터가 제거됩니다. Amazon EC2 인스턴스에서 호스팅되는 태스크의 경우, 태스크 정의에 hostsourcePath 값(선택 사항)을 지정하여 호스트 Amazon EC2 인스턴스의 수명 주기에 데이터를 연결할 수 있습니다. 자세한 내용은 Docker 설명서의 바인드 탑재 사용을 참조하세요.

바인드 탑재의 일반 사용 사례는 다음과 같습니다.

  • 하나 이상의 컨테이너에 마운트할 빈 데이터 볼륨을 제공합니다.

  • 하나 이상의 컨테이너에 호스트 데이터 볼륨을 마운트합니다.

  • 동일한 태스크의 다른 컨테이너에 소스 컨테이너의 데이터 볼륨을 공유합니다.

  • Dockerfile의 경로와 콘텐츠를 하나 이상의 컨테이너에 노출합니다.

바인드 탑재 사용 시 고려 사항

바인드 탑재를 사용할 때는 다음 사항을 고려해야 합니다.

  • 플랫폼 버전 1.4.0 이상을 사용하여 AWS Fargate에서 호스팅되는 태스크의 경우 기본적으로 바인트 탑재를 위해 최소 20GiB 이상의 임시 스토리지를 받습니다. 임시 스토리지의 총량은 태스크 정의에 ephemeralStorage 파라미터를 정의하면 최대 200GiB까지 높일 수 있습니다.

  • 태스크가 실행될 때 Dockerfile에서 데이터 볼륨으로 파일을 노출하기 위해 Amazon ECS 데이터 영역은 VOLUME 명령을 찾습니다. VOLUME 명령에 지정된 절대 경로가 태스크 정의에 지정된 containerPath와 동일한 경우 VOLUME 명령 경로의 데이터가 데이터 볼륨에 복사됩니다. 다음 Dockerfile 예제에서 /var/log/exported 디렉터리에 있는 examplefile이라는 파일이 호스트에 기록 된 다음 컨테이너 내부에 마운트됩니다.

    FROM public.ecr.aws/amazonlinux/amazonlinux:latest RUN mkdir -p /var/log/exported RUN touch /var/log/exported/examplefile VOLUME ["/var/log/exported"]

    기본적으로 볼륨 권한은 0755로 설정되고 소유자는 root로 설정됩니다. 이러한 권한은 Dockerfile에서 사용자 지정할 수 있습니다. 다음 예에서는 디렉터리의 소유자를 node로 정의합니다.

    FROM public.ecr.aws/amazonlinux/amazonlinux:latest RUN yum install -y shadow-utils && yum clean all RUN useradd node RUN mkdir -p /var/log/exported && chown node:node /var/log/exported RUN touch /var/log/exported/examplefile USER node VOLUME ["/var/log/exported"]
  • Amazon EC2 인스턴스에서 호스팅되는 태스크의 경우 hostsourcePath 값이 지정되지 않으면 Docker 데몬이 바인드 탑재를 관리합니다. 이 바인드 탑재를 참조하는 컨테이너가 없을 경우 Amazon ECS 컨테이너 에이전트 태스크 정리 서비스가 해당 볼륨을 삭제합니다(기본적으로 컨테이너 종료 후 3시간에 삭제되지만 ECS_ENGINE_TASK_CLEANUP_WAIT_DURATION 에이전트 변수를 사용하여 이 기간을 구성할 수 있음). 자세한 내용은 Amazon ECS 컨테이너 에이전트 구성 섹션을 참조하세요. 컨테이너의 수명 주기가 끝나더라도 이 데이터를 유지하려면 바인드 탑재에 sourcePath 값을 지정하세요.

태스크 정의에서 바인드 탑재 지정

Fargate 또는 Amazon EC2 인스턴스에서 호스팅되는 Amazon ECS의 경우 다음 태스크 정의 JSON 조각은 태스크 정의에 사용할 volumes, mountPoints, ephemeralStorage 객체의 구문을 나타냅니다.

{ "family": "", ... "containerDefinitions" : [ { "mountPoints" : [ { "containerPath" : "/path/to/mount_volume", "sourceVolume" : "string" } ], "name" : "string" } ], ... "volumes" : [ { "name" : "string" } ], "ephemeralStorage": { "sizeInGiB": integer } }

Amazon EC2 인스턴스에서 호스팅되는 Amazon ECS 태스크의 경우 선택적인 host 파라미터와 sourcePath(태스크 볼륨 세부 정보를 지정한 경우)를 사용할 수 있습니다. 이를 지정하면 컨테이너가 아닌 태스크의 수명 주기에 바인트 탑재를 연결합니다.

"volumes" : [ { "host" : { "sourcePath" : "string" }, "name" : "string" } ]

다음은 각 태스크 정의 파라미터에 대해 자세한 설명입니다.

name

유형: 문자열

필수 항목 여부: 아니요

볼륨의 이름입니다. 최대 255개의 문자(대문자 및 소문자), 숫자, 하이픈 및 밑줄이 허용됩니다. 이 이름은 컨테이너 정의 mountPointssourceVolume 파라미터에서 참조됩니다.

host

필수 항목 여부: 아니요

이 파라미터는 바인드 탑재를 사용할 때 지정됩니다. Docker 볼륨을 사용하려면 대신에 dockerVolumeConfiguration을 지정하세요. host 파라미터의 내용에 따라 바인드 탑재 데이터 볼륨이 호스트 컨테이너 인스턴스에서 유지될지 여부와 저장되는 위치가 결정됩니다. host 파라미터가 비어 있으면 Docker 데몬이 데이터 볼륨의 호스트 경로를 할당하지만 해당 볼륨과 연결된 컨테이너가 실행을 중지한 후 데이터 유지가 보장되지 않습니다.

바인드 탑재 호스트 볼륨은 EC2 또는 Fargate 시작 유형을 사용할 때 지원됩니다.

Windows 컨테이너는 전체 디렉터리를 동일한 드라이브에 $env:ProgramData로 마운트할 수 있습니다.

sourcePath

유형: 문자열

필수 항목 여부: 아니요

host 파라미터가 사용되는 경우 sourcePath를 지정하여 컨테이너에 제시되는 호스트 컨테이너 인스턴스 상의 경로를 선언합니다. 이 파라미터가 비어 있으면 Docker 데몬이 호스트 경로를 할당합니다. host 파라미터에 sourcePath 파일 위치가 들어 있으면, 사용자가 수동으로 삭제하지 않는 한 데이터 볼륨이 호스트 컨테이너 인스턴스 상에 지정된 위치를 유지합니다. sourcePath 값이 호스트 컨테이너 인스턴스에 없을 경우 Docker 데몬이 해당 경로를 생성합니다. 해당 위치가 있을 경우 소스 경로 폴더의 콘텐츠를 내보냅니다.

mountPoints

유형: 객체 배열

필수 항목 여부: 아니요

컨테이너에서 데이터 볼륨의 탑재 지점입니다.

이 파라미터는 Docker 원격 API컨테이너 생성 섹션에 있는 Volumesdocker run에 대한 --volume 옵션에 매핑됩니다.

Windows 컨테이너는 전체 디렉터리를 동일한 드라이브에 $env:ProgramData로 마운트할 수 있습니다. Windows 컨테이너는 디렉터리를 다른 드라이브에 마운트할 수 없으며, 마운트 지점이 여러 드라이브에 있을 수 없습니다.

sourceVolume

유형: 문자열

필수 여부: 예(mountPoints 사용 시)

탑재할 볼륨의 이름입니다.

containerPath

유형: 문자열

필수 여부: 예(mountPoints 사용 시)

볼륨을 탑재할 컨테이너의 경로입니다.

readOnly

유형: 부울

필수 항목 여부: 아니요

이 값이 true일 경우 컨테이너에는 볼륨에 대한 읽기 전용 액세스가 부여됩니다. 이 값이 false일 경우 컨테이너는 볼륨에 쓸 수 있습니다. 기본 값은 false입니다.

ephemeralStorage

유형: 객체

필수 항목 여부: 아니요

태스크에 할당되는 임시 스토리지 용량(GB)입니다. 이 파라미터는 플랫폼 버전 1.4.0 이상을 사용하는 AWS Fargate에서 호스팅되는 태스크에 대해 제공되는 임시 스토리지 총량을 기본 용량 이상으로 확장할 때 사용합니다.

Copilot CLI, CloudFormation,AWS SDK 또는 CLI를 사용하여 바인드 탑재에 대한 임시 스토리지를 지정할 수 있습니다.

바인드 탑재 예제

다음 예제에서는 컨테이너에 바인드 탑재를 사용하는 가장 일반적인 사용 사례를 다룹니다.

Fargate 태스크를 위한 임시 스토리지 공간의 증가된 양을 할당하는 방법

플랫폼 버전 1.4.0 이상을 사용하여 Fargate에서 호스팅되는 Amazon ECS 태스크의 경우 태스크의 컨테이너에 사용할 임시 스토리지 공간의 기본 양 이상을 할당할 수 있습니다. 이 예제는 다른 예제에 포함하여 Fargate 태스크에 더 많은 임시 스토리지를 할당할 수 있습니다.

  • 태스크 정의에서 ephemeralStorage 객체를 정의합니다. sizeInGiB21200 값 사이의 정수여야 하며 GiB로 표현합니다.

    "ephemeralStorage": { "sizeInGiB": integer }

하나 이상의 컨테이너에 빈 데이터 볼륨을 제공하는 방법

경우에 따라 태스크의 컨테이너에 스크래치 공간을 제공합니다. 예를 들어 태스크 도중 동일한 스크래치 파일 스토리지 위치에 액세스해야 하는 2개의 데이터베이스 컨테이너가 있을 수 있습니다. 이 태스크는 바인드 탑재를 사용하여 수행할 수 있습니다.

  1. 태스크 정의 volumes 섹션에서 이름이 database_scratch인 바인드 탑재를 정의합니다.

    "volumes": [ { "name": "database_scratch", } ]
  2. containerDefinitions 섹션에서 볼륨을 탑재하도록 데이터베이스 컨테이너 정의를 생성합니다.

    "containerDefinitions": [ { "name": "database1", "image": "my-repo/database", "cpu": 100, "memory": 100, "essential": true, "mountPoints": [ { "sourceVolume": "database_scratch", "containerPath": "/var/scratch" } ] }, { "name": "database2", "image": "my-repo/database", "cpu": 100, "memory": 100, "essential": true, "mountPoints": [ { "sourceVolume": "database_scratch", "containerPath": "/var/scratch" } ] } ]

Dockerfile의 경로와 콘텐츠를 컨테이너에 노출하는 방법

이 예제에서는 컨테이너 내부에 탑재할 데이터를 쓰는 Dockerfile이 있습니다. 이 예제는 Fargate 또는 Amazon EC2 인스턴세에서 호스팅되는 태스크에 적용됩니다.

  1. Dockerfile을 생성합니다. 다음 예제에서는 퍼블릭 Amazon Linux 2 컨테이너 이미지를 사용하고 /var/log/exported 디렉토리에서 컨테이너 내부에 탑재하려는 examplefile이라는 파일을 생성합니다. VOLUME 명령은 절대 경로를 지정해야 합니다.

    FROM public.ecr.aws/amazonlinux/amazonlinux:latest RUN mkdir -p /var/log/exported RUN touch /var/log/exported/examplefile VOLUME ["/var/log/exported"]

    기본적으로 볼륨 권한은 0755로 설정되고 소유자는 root로 설정됩니다. 이러한 권한은 Dockerfile에서 변경할 수 있습니다. 다음 예에서는 /var/log/exported 디렉터리의 소유자를 node로 정의합니다.

    FROM public.ecr.aws/amazonlinux/amazonlinux:latest RUN yum install -y shadow-utils && yum clean all RUN useradd node RUN mkdir -p /var/log/exported && chown node:node /var/log/exported RUN touch /var/log/exported/examplefile USER node VOLUME ["/var/log/exported"]
  2. 태스크 정의 volumes 섹션에서 이름이 application_logs인 볼륨을 정의합니다.

    "volumes": [ { "name": "application_logs", } ]
  3. containerDefinitions 섹션에서 스토리지를 탑재하도록 애플리케이션 컨테이너 정의를 생성합니다. containerPath 값은 Dockerfile의 VOLUME 명령에서 지정한 절대 경로와 일치해야 합니다.

    "containerDefinitions": [ { "name": "application1", "image": "my-repo/application", "cpu": 100, "memory": 100, "essential": true, "mountPoints": [ { "sourceVolume": "application_logs", "containerPath": "/var/log/exported" } ] }, { "name": "application2", "image": "my-repo/application", "cpu": 100, "memory": 100, "essential": true, "mountPoints": [ { "sourceVolume": "application_logs", "containerPath": "/var/log/exported" } ] } ]

호스트 Amazon EC2 인스턴스의 수명 주기에 연결된 컨테이너에 빈 데이터 볼륨을 제공하는 방법

Amazon EC2 인스턴스에서 호스팅되는 태스크의 경우 바인드 탑재를 사용하여 볼륨을 참조하는 컨테이너가 아닌 호스트 Amazon EC2 인스턴스의 수명 주기에 데이터를 연결할 수 있습니다. 이 태스크는 host 파라미터를 사용하고 sourcePath 값을 지정하여 수행합니다. sourcePath에 존재하는 모든 파일이 containerPath 값의 컨테이너에 제공되며, containerPath 값에 기록한 모든 파일은 호스트 Amazon EC2 인스턴스의 sourcePath 값에 기록됩니다.

중요

Amazon ECS는 Amazon EC2 인스턴스에 스토리지를 동기화하지 않습니다. 영구 스토리지를 사용하는 태스크는 클러스터에서 가용 용량이 있는 어떤 Amazon EC2 인스턴스에도 배치할 수 있습니다. 태스크 중단 및 재시작 후 영구 스토리지가 필요한 경우에는 항상 AWS CLI start-task 명령을 사용하여 태스크 시작 시 동일한 Amazon EC2 인스턴스를 지정해야 합니다. 영구 스토리지용 Amazon EFS 볼륨을 사용할 수도 있습니다. 자세한 내용은 Amazon EFS 볼륨 섹션을 참조하세요.

  1. 태스크 정의 volumes 섹션에서 namesourcePath 값을 사용하여 바인드 탑재를 정의합니다. 다음 예에서 호스트 Amazon EC2 인스턴스에는 컨테이너 내부에 탑재하려는 /ecs/webdata의 데이터가 포함됩니다.

    "volumes": [ { "name": "webdata", "host": { "sourcePath": "/ecs/webdata" } } ]
  2. containerDefinitions 섹션에서 바인드 탑재 이름과 컨테이너에서 바인드 탑재를 탑재할 mountPoints 값을 참조하는 containerPath 값을 사용하여 컨테이너를 정의합니다.

    "containerDefinitions": [ { "name": "web", "image": "nginx", "cpu": 99, "memory": 100, "portMappings": [ { "containerPort": 80, "hostPort": 80 } ], "essential": true, "mountPoints": [ { "sourceVolume": "webdata", "containerPath": "/usr/share/nginx/html" } ] } ]

정의된 볼륨을 여러 위치에 있는 여러 컨테이너에 탑재하는 방법

태스크 정의에서 데이터 볼륨을 정의하여 해당 볼륨을 여러 컨테이너의 여러 위치에 탑재할 수 있습니다. 예를 들어 호스트 컨테이너가 /data/webroot에 웹 사이트 데이터 폴더가 있고, 해당 데이터 볼륨을 문서 루트가 서로 다른 두 웹 서버에 읽기 전용으로 탑재하기를 원할 수 있습니다.

  1. 태스크 정의 volumes 섹션에서 이름 webroot 및 소스 경로 /data/webroot를 사용하여 데이터 볼륨을 정의합니다.

    "volumes": [ { "name": "webroot", "host": { "sourcePath": "/data/webroot" } } ]
  2. containerDefinitions 섹션에서 mountPoints 볼륨을 해당 컨테이너의 문서 루트를 가리키는 webroot 값과 연결하는 containerPath 값을 사용하여 각 웹 서버의 컨테이너를 정의합니다.

    "containerDefinitions": [ { "name": "web-server-1", "image": "my-repo/ubuntu-apache", "cpu": 100, "memory": 100, "portMappings": [ { "containerPort": 80, "hostPort": 80 } ], "essential": true, "mountPoints": [ { "sourceVolume": "webroot", "containerPath": "/var/www/html", "readOnly": true } ] }, { "name": "web-server-2", "image": "my-repo/sles11-apache", "cpu": 100, "memory": 100, "portMappings": [ { "containerPort": 8080, "hostPort": 8080 } ], "essential": true, "mountPoints": [ { "sourceVolume": "webroot", "containerPath": "/srv/www/htdocs", "readOnly": true } ] } ]

volumesFrom을 사용하여 다른 컨테이너로부터 볼륨을 탑재하는 방법

컨테이너에 하나 이상의 볼륨을 정의한 후 다른 컨테이너 정의(동일한 태스크 내)의 volumesFrom 파라미터를 사용하여 원래 정의된 탑재 지점에서 sourceContainer로부터 모든 볼륨을 탑재할 수 있습니다. volumesFrom 파라미터는 태스크 정의에 정의된 볼륨과 Dockerfile을 사용하여 이미지에 내장된 볼륨에 적용됩니다.

  1. (선택 사항) 이미지에 내장된 볼륨을 공유하려면 VOLUME 명령에 선언된 볼륨을 사용하여 이미지를 빌드해야 합니다. 다음 예제 Dockerfile은 httpd 이미지를 사용한 후 볼륨을 추가하고 Apache 문서 루트(dockerfile_volume 웹 서버가 사용하는 폴더)의 httpd에 이 볼륨을 마운팅합니다.

    FROM httpd VOLUME ["/usr/local/apache2/htdocs/dockerfile_volume"]

    이 Dockerfile을 사용하여 이미지를 만들어 Docker Hub와 같은 리포지토리에 푸시한 후 태스크 정의에서 사용할 수 있습니다. 다음 단계에서 사용된 예제 my-repo/httpd_dockerfile_volume 이미지는 위 Dockerfile을 사용하여 빌드된 것입니다.

  2. 컨테이너에 다른 볼륨 및 탑재 지점을 정의하는 태스크 정의를 생성합니다. 이 예제 volumes 섹션에서는 empty라는 빈 볼륨을 생성하며, Docker 데몬이 이 볼륨을 관리합니다. 또한 host_etc라는 호스트 볼륨도 정의되어 있습니다. 이 볼륨은 호스트 컨테이너 인스턴스의 /etc 폴더를 내보냅니다.

    { "family": "test-volumes-from", "volumes": [ { "name": "empty", "host": {} }, { "name": "host_etc", "host": { "sourcePath": "/etc" } } ],

    컨테이너 정의 섹션에서 앞서 정의한 볼륨을 탑재하는 컨테이너를 생성합니다. 이 예제에서는 web 컨테이너(Dockerfile의 볼륨을 사용하여 빌드된 이미지를 사용함)가 emptyhost_etc 볼륨을 탑재합니다.

    "containerDefinitions": [ { "name": "web", "image": "my-repo/httpd_dockerfile_volume", "cpu": 100, "memory": 500, "portMappings": [ { "containerPort": 80, "hostPort": 80 } ], "mountPoints": [ { "sourceVolume": "empty", "containerPath": "/usr/local/apache2/htdocs/empty_volume" }, { "sourceVolume": "host_etc", "containerPath": "/usr/local/apache2/htdocs/host_etc" } ], "essential": true },

    volumesFrom을 사용하여 web 컨테이너와 연결된 모든 볼륨을 탑재하는 다른 컨테이너를 생성합니다. web 컨테이너 상의 모든 볼륨 역시 busybox 컨테이너에 탑재됩니다(my-repo/httpd_dockerfile_volume 이미지를 빌드하는 데 사용된 Dockerfile에 지정된 볼륨을 포함).

    { "name": "busybox", "image": "busybox", "volumesFrom": [ { "sourceContainer": "web" } ], "cpu": 100, "memory": 500, "entryPoint": [ "sh", "-c" ], "command": [ "echo $(date) > /usr/local/apache2/htdocs/empty_volume/date && echo $(date) > /usr/local/apache2/htdocs/host_etc/date && echo $(date) > /usr/local/apache2/htdocs/dockerfile_volume/date" ], "essential": false } ] }

    이 태스크가 실행되면 두 컨테이너가 볼륨을 탑재하며, command 컨테이너의 busybox가 각 볼륨 폴더의 date 파일에 날짜 및 시간을 씁니다. 그러면 web 컨테이너가 표시하는 웹 사이트에 이 폴더가 표시됩니다.

    참고

    busybox 컨테이너는 빠른 명령을 실행한 후 종료하므로 컨테이너 정의에서 "essential": false를 설정해야 합니다. 그렇지 않으면 컨테이너 종료 후 전체 태스크가 중지됩니다.