Docker 구성 - AWS Elastic Beanstalk

Docker 구성

이 섹션에서는 Elastic Beanstalk로 배포하기 위해 Docker 이미지 및 컨테이너를 준비하는 방법을 설명합니다.

Docker Compose를 사용하는 Docker 환경

이 섹션에서는 Elastic Beanstalk로 배포하기 위해 Docker 이미지 및 컨테이너를 준비하는 방법을 설명합니다. Docker Compose 도구도 사용하는 경우 Docker 환경에서 Elastic Beanstalk에 배포하는 모든 웹 애플리케이션에 docker-compose.yml 파일이 있어야 합니다. 다음 작업 중 하나를 수행하여 웹 애플리케이션을 Elastic Beanstalk에 컨테이너화된 서비스로 배포할 수 있습니다.

  • 호스팅되는 리포지토리에서 Elastic Beanstalk로 Docker 이미지를 배포하도록 docker-compose.yml 파일을 생성합니다. 모든 배포를 퍼블릭 리포지토리의 이미지에서 가져온 경우 다른 파일이 필요하지 않습니다. (배포 시 프라이빗 리포지토리의 이미지를 가져와야 하는 경우 인증을 위해 추가 구성 파일을 포함해야 합니다. 자세한 내용은 프라이빗 리포지토리에서 이미지 사용을 참조하세요.) docker-compose.yml 파일에 대한 자세한 내용은 Docker 웹 사이트에서 Compose 파일 참조를 확인하십시오.

  • Dockerfile을 생성하여 Elastic Beanstalk를 빌드하고 사용자 지정 이미지를 실행합니다. 이 파일은 배포 요구 사항에 따라 선택 사항입니다. Dockerfile에 대한 자세한 내용은 Docker 웹 사이트의 Dockerfile 참조를 확인하십시오.

  • 애플리케이션 파일, 모든 애플리케이션 파일 종속성, .zipDockerfile 파일이 포함된 docker-compose.yml 파일을 만듭니다. EB CLI를 사용하여 애플리케이션을 배포하면 .zip 파일이 생성됩니다. 두 파일은 루트에 있거나, .zip 아카이브의 최상위에 있어야 합니다.

    docker-compose.yml 파일만 사용하여 애플리케이션을 배포할 경우에는 .zip 파일을 생성할 필요가 없습니다.

이 주제에서는 구문 참조에 대해 설명합니다. Elastic Beanstalk를 사용하여 Docker 환경을 시작하는 자세한 절차는 단원을 참조하십시오Docker 플랫폼 브랜치 사용

Docker Compose에 대한 자세한 내용과 설치 방법은 Docker 사이트에서 Docker Compose 개요Docker Compose 설치를 참조하십시오.

참고

Docker Compose를 사용하여 Docker 환경을 구성하지 않으면 docker-compose.yml 파일을 사용하지 않아야 합니다. 대신 Dockerrun.aws.json 파일 또는 Dockerfile 파일을 사용하거나 둘 모두 사용하십시오.

자세한 내용은 Docker 플랫폼 구성(Docker Compose 미사용) 섹션을 참조하세요.

프라이빗 리포지토리의 이미지 사용

Elastic Beanstalk는 프라이빗 리포지토리에서 이미지를 가져오고 배포하기 전에 프라이빗 리포지토리를 호스팅하는 온라인 레지스트리로 인증해야 합니다. 리포지토리로 인증하기 위해 Elastic Beanstalk 환경에 대한 자격 증명을 저장하고 검색하는 두 가지 옵션이 있습니다.

  • AWS Systems Manager(SSM) 파라미터 스토어

  • Dockerrun.aws.json v3 파일

배포 프로세스를 시작하기 전에 프라이빗 리포지토리에 로그인하도록 Elastic Beanstalk를 구성할 수 있습니다. 이렇게 하면 Elastic Beanstalk에서 리포지토리의 이미지에 액세스하여 해당 이미지를 Elastic Beanstalk 환경에 배포할 수 있습니다.

이 구성은 Elastic Beanstalk 배포 프로세스의 미리 빌드 단계에서 이벤트를 시작합니다. 이는 .ebextentions 구성 디렉터리에서 설정합니다. 이 구성은 프라이빗 리포지토리를 호스팅하는 온라인 레지스트리로 인증하기 위해 docker login을 호출하는 플랫폼 후크 스크립트를 사용합니다. 이러한 구성 단계에 대한 자세한 분석은 다음과 같습니다.

AWS SSM을 사용하여 프라이빗 리포지토리로 인증하도록 Elastic Beanstalk를 구성하려면

참고

이 단계를 완료하려면 AWS Systems Manager를 설정해야 합니다. 자세한 내용은 AWS Systems Manager 사용 설명서를 참조하세요.

  1. 다음과 같이 .ebextensions 디렉터리 구조를 생성합니다.

    ├── .ebextensions │ └── env.config ├── .platform │ ├── confighooks │ │ └── prebuild │ │ └── 01login.sh │ └── hooks │ └── prebuild │ └── 01login.sh ├── docker-compose.yml
  2. 필요한 경우 Elastic Beanstalk에서 자격 증명을 검색할 수 있도록 AWS Systems Manager 파라미터 스토어를 사용하여 프라이빗 리포지토리의 자격 증명을 저장합니다. 이렇게 하려면 put-parameter 명령을 실행합니다.

    aws ssm put-parameter --name USER --type String --value "username" aws ssm put-parameter --name PASSWD --type String --value "passwd"
  3. 다음 env.config 파일을 생성하여 이전 디렉터리 구조에 표시된 대로 .ebextensions 디렉터리에 배치합니다.

    참고

    스크립트에서 USERPASSWD는 이전 ssm put-parameter 명령에서 사용되는 것과 동일한 문자열과 일치해야 합니다.

    option_settings: aws:elasticbeanstalk:application:environment: USER: '{{resolve:ssm:USER:1}}' PASSWD: '{{resolve:ssm:PASSWD:1}}'
  4. 다음 01login.sh 스크립트 파일을 생성하여 다음 디렉터리에 배치합니다(이전 디렉터리 구조에도 표시됨).

    • .platform/confighooks/prebuild

    • .platform/hooks/prebuild

    ### example 01login.sh #!/bin/bash USER=/opt/elasticbeanstalk/bin/get-config environment -k USER PASSWD=/opt/elasticbeanstalk/bin/get-config environment -k PASSWD docker login -u $USER -p $PASSWD

    01login.sh 스크립트는 먼저 get-config 도구를 호출하여 리포지토리 자격 증명을 검색한 다음 docker login을 호출하여 리포지토리로 인증합니다.

    참고
    • 모든 스크립트 파일에는 실행 권한이 있어야 합니다. 후크 파일에 대한 실행 권한을 설정하려면 chmod +x를 사용합니다. 2022년 4월 29일 이후에 릴리스된 모든 Amazon Linux 2 기반 플랫폼 버전의 경우 Elastic Beanstalk가 모든 플랫폼 후크 스크립트에 실행 권한을 자동으로 부여합니다. 이 경우 실행 권한을 수동으로 부여할 필요가 없습니다. 이러한 플랫폼 버전 목록은 AWS Elastic Beanstalk 릴리스 정보2022년 4월 29일 - Linux 플랫폼 릴리스 정보를 참조하세요.

    • 후크 파일은 이진 파일 또는 해당 인터프리터 경로를 포함하는 #! 줄(#!/bin/bash)로 시작하는 스크립트 파일일 수 있습니다.

    • 자세한 내용은 Elastic Beanstalk Linux 플랫폼 확장플랫폼 후크 단원을 참조하십시오.

Elastic Beanstalk가 프라이빗 리포지토리를 호스팅하는 온라인 레지스트리로 인증하면 이미지를 배포하고 가져올 수 있습니다.

이 섹션에서는 프라이빗 리포지토리로 Elastic Beanstalk를 인증하는 또 다른 접근 방식에 대해 설명합니다. 이 접근 방식을 사용하면 Docker 명령을 사용하여 인증 파일을 생성 한 다음 인증 파일을 Amazon S3 버킷에 업로드합니다. 또한 Dockerrun.aws.json v3 파일에 버킷 정보를 포함해야 합니다.

Elastic Beanstalk에 인증 파일을 생성하고 제공하려면

  1. docker login 명령으로 인증 파일을 생성합니다. Docker Hub의 리포지토리의 경우, docker login을 실행합니다.

    $ docker login

    다른 레지스트리의 경우, 레지스트리 서버의 URL을 포함시킵니다.

    $ docker login registry-server-url
    참고

    Elastic Beanstalk 환경에서 Amazon Linux AMI Docker 플랫폼 버전(이전 Amazon Linux 2)을 사용하는 경우 Amazon Linux AMI(이전 Amazon Linux 2)에서 Docker 구성의 관련 정보를 읽어 보십시오.

    인증 파일에 대한 자세한 내용은 Docker Hub에서의 이미지 저장과 Docker 웹 사이트의 docker login을 참조하십시오.

  2. 이름이 .dockercfg인 인증 파일의 복사본을 안전한 Amazon S3 버킷에 업로드합니다.

    • Amazon S3 버킷은 이를 사용 중인 환경과 동일한 AWS 리전에 호스팅되어야 합니다. Elastic Beanstalk는 다른 리전에 호스팅된 Amazon S3 버킷에서 파일을 다운로드할 수 없습니다.

    • 인스턴스 프로파일의 IAM 역할에 s3:GetObject 작업에 대한 권한을 부여합니다. 자세한 내용은 Elastic Beanstalk 인스턴스 프로파일 관리 섹션을 참조하세요.

  3. Authentication 파일의 Dockerrun.aws.json v3 파라미터에 Amazon S3 버킷 정보를 포함합니다.

    다음은 Dockerrun.aws.json v3 파일의 예제입니다.

    { "AWSEBDockerrunVersion": "3", "Authentication": { "bucket": "DOC-EXAMPLE-BUCKET", "key": "mydockercfg" } }
    참고

    AWSEBDockerrunVersion 파라미터는 Dockerrun.aws.json 파일의 버전을 나타냅니다.

    • Docker Amazon Linux 2 플랫폼은 Docker Compose를 사용하는 환경에서 Dockerrun.aws.json v3 파일을 사용합니다. Docker Compose를 사용하지 않는 환경에는 Dockerrun.aws.json v1 파일을 사용합니다.

    • 멀티컨테이너 Docker Amazon Linux AMI 플랫폼은 Dockerrun.aws.json v2 파일을 사용합니다.

Elastic Beanstalk가 프라이빗 리포지토리를 호스팅하는 온라인 레지스트리로 인증하면 이미지를 배포하고 가져올 수 있습니다.

Dockerfile을 사용하여 사용자 지정 이미지 빌드

리포지토리에서 호스팅되는 기존 이미지가 아직 없는 경우 Dockerfile을 생성해야 합니다.

다음은 코드 조각은 Dockerfile의 예입니다. Docker 플랫폼 브랜치 사용의 지침을 따르는 경우 이 Dockerfile을 덮어쓰도록 업로드할 수 있습니다. 이 Dockerfile을 사용하는 경우 Elastic Beanstalk에서는 게임 2048을 실행합니다.

Dockerfile에 포함시킬 수 있는 명령에 대한 자세한 내용은 Docker 웹 사이트의 Dockerfile Reference를 참조하십시오.

FROM ubuntu:12.04 RUN apt-get update RUN apt-get install -y nginx zip curl RUN echo "daemon off;" >> /etc/nginx/nginx.conf RUN curl -o /usr/share/nginx/www/master.zip -L https://codeload.github.com/gabrielecirulli/2048/zip/master RUN cd /usr/share/nginx/www/ && unzip master.zip && mv 2048-master/* . && rm -rf 2048-master master.zip EXPOSE 80 CMD ["/usr/sbin/nginx", "-c", "/etc/nginx/nginx.conf"]
참고

단일 Dockerfile에서 다단계 빌드를 실행하여 복잡성을 크게 줄이면서 작은 크기의 이미지를 생성할 수 있습니다. 자세한 내용은 Docker 문서 웹 사이트에서 다단계 빌드 사용을 참조하세요.

Docker 플랫폼 구성(Docker Compose 미사용)

Elastic Beanstalk Docker 환경에서 Docker Compose를 사용하지 않는 경우 다음 섹션의 추가 정보를 참조하십시오.

Docker 환경에서 Elastic Beanstalk에 배포한 웹 애플리케이션에는 Dockerfile 또는 Dockerrun.aws.json 파일이 포함되어 있어야 합니다. 다음 작업 중 하나를 수행하여 Docker 컨테이너에서 Elastic Beanstalk로 웹 애플리케이션을 배포할 수 있습니다.

  • Dockerfile을 생성하여 Elastic Beanstalk를 빌드하고 사용자 지정 이미지를 실행합니다.

  • 호스팅되는 리포지토리에서 Elastic Beanstalk로 Docker 이미지를 배포하도록 Dockerrun.aws.json 파일을 생성합니다.

  • 애플리케이션 파일, 모든 애플리케이션 파일 종속성, .zipDockerfile 파일이 포함된 Dockerrun.aws.json 파일을 만듭니다. EB CLI를 사용하여 애플리케이션을 배포하면 .zip 파일이 생성됩니다.

    Dockerfile 또는 Dockerrun.aws.json 파일만 사용하여 애플리케이션을 배포할 경우에는 .zip 파일을 생성할 필요가 없습니다.

이 주제에서는 구문 참조에 대해 설명합니다. Docker 환경을 시작하는 자세한 절차는 단원을 참조하십시오Docker 플랫폼 브랜치 사용

단원

    Dockerrun.aws.json 파일은 원격 Docker 이미지를 Elastic Beanstalk 애플리케이션으로서 배포하는 방법을 설명합니다. 이 JSON 파일은 Elastic Beanstalk에 고유합니다. 애플리케이션이 호스팅되는 리포지토리에서 사용할 수 있는 이미지에서 실행되는 경우 Dockerrun.aws.json v1 파일에 해당 이미지를 지정하여 Dockerfile을 생략할 수 있습니다.

    Dockerrun.aws.json v1 파일에 유효한 키 및 값에는 다음 연산이 포함됩니다.

    AWSEBDockerrunVersion

    (필수) 버전 번호를 단일 컨테이너 Docker 환경에 대한 값 1로 지정합니다.

    인증

    (프라이빗 리포지토리의 경우에만 필수) .dockercfg 파일을 저장하는 Amazon S3 객체를 지정합니다.

    프라이빗 리포지토리의 이미지 사용 단원을 참조하십시오.

    이미지

    기존 Docker 리포지토리에서 Docker 컨테이너를 구축할 Docker 기본 이미지를 지정합니다. Name 키의 값을 Docker 허브의 이미지의 경우에는 <organization>/<image name> 형식으로, 다른 사이트의 경우에는 <site>/<organization name>/<image name> 형식으로 지정합니다.

    Dockerrun.aws.json 파일에서 이미지를 지정하면 Elastic Beanstalk 환경의 각 인스턴스가 docker pull을 실행하여 이미지를 실행합니다. 경우에 따라 Update 키를 포함합니다. 기본값은 true로, Elastic Beanstalk에 리포지토리를 확인하고 이미지에 대한 모든 업데이트를 가져와 캐시된 이미지를 덮어쓰도록 지시합니다.

    Dockerfile을 사용하는 경우에는 Dockerrun.aws.json 파일에서 Image 키를 지정하지 마십시오. Elastic Beanstalk는 Dockerfile이 있는 경우 이 파일에 명시된 이미지를 빌드하여 사용합니다.

    포트

    (Image 키를 지정하는 경우 필수) Docker 컨테이너에서 노출할 포트를 나열합니다. Elastic Beanstalk에서는 ContainerPort 값을 사용하여 호스트에서 실행 중인 역방향 프록시에 Docker 컨테이너를 연결합니다.

    컨테이너 포트를 여러 개 지정할 수 있지만 Elastic Beanstalk는 첫 번째 포트만 사용합니다. 이 포트를 사용하여 컨테이너를 호스트의 역방향 프록시에 연결하고 퍼블릭 인터넷에서 요청을 라우팅합니다. Dockerfile을 사용할 경우, 첫 번째 ContainerPort 값은 DockerfileEXPOSE 목록 내 첫 번째 항목과 일치해야 합니다.

    경우에 따라서는 HostPort 내 포트 목록 지정도 가능합니다. HostPort 항목은 ContainerPort 값이 매핑되는 호스트 포트를 지정합니다. HostPort 값을 지정하지 않으면 ContainerPort 값으로 기본 지정됩니다.

    { "Image": { "Name": "image-name" }, "Ports": [ { "ContainerPort": 8080, "HostPort": 8000 } ] }
    볼륨

    EC2 인스턴스의 볼륨을 Docker 컨테이너로 매핑합니다. 매핑할 볼륨 어레이를 하나 이상 지정합니다.

    { "Volumes": [ { "HostDirectory": "/path/inside/host", "ContainerDirectory": "/path/inside/container" } ] ...
    로깅

    컨테이너에 애플리케이션에서 로그를 쓸 디렉터리를 지정합니다. 테일 또는 번들 로그를 요청하면 Elastic Beanstalk에서는 이 디렉터리의 로그를 Amazon S3에 업로드합니다. 로그를 이 디렉터리 내의 rotated 폴더로 교체하는 경우 영구 저장을 위해 교체된 로그를 Amazon S3로 업로드하도록 Elastic Beanstalk를 구성할 수도 있습니다. 자세한 내용은 Elastic Beanstalk 환경에서 Amazon EC2 인스턴스의 로그 보기 섹션을 참조하세요.

    Command

    컨테이너에서 실행할 명령을 지정합니다. 진입점을 지정하고 나면 명령진입점에 대한 인수로서 추가됩니다. 자세한 내용은 Docker 설명서의 CMD를 참조하십시오.

    진입점

    컨테이너 시작 시 실행할 기본 명령을 지정합니다. 자세한 내용은 Docker 설명서의 진입점을 참조하십시오.

    다음 코드 조각은 단일 컨테이너에 대한 Dockerrun.aws.json 파일의 구문을 보여 주는 예입니다.

    { "AWSEBDockerrunVersion": "1", "Image": { "Name": "janedoe/image", "Update": "true" }, "Ports": [ { "ContainerPort": "1234" } ], "Volumes": [ { "HostDirectory": "/var/app/mydb", "ContainerDirectory": "/etc/mysql" } ], "Logging": "/var/log/nginx", "Entrypoint": "/app/bin/myapp", "Command": "--argument" }

    Elastic Beanstalk에 Dockerrun.aws.json 파일만 제공하거나, .zip 파일과 Dockerrun.aws.json 파일을 모두 포함하는 Dockerfile 아카이브를 제공할 수 있습니다. 이 섹션의 뒷부분에서 설명하는 것처럼 두 파일을 모두 제공하는 경우 Dockerfile은 Docker 이미지를 명시하고, Dockerrun.aws.json 파일은 배포에 대한 추가 정보를 제공합니다.

    참고

    두 파일은 루트에 있거나, .zip 아카이브의 최상위에 있어야 합니다. 파일을 포함하는 디렉터리에서 아카이브를 빌드하지 마십시오. 해당 디렉터리로 이동한 후 아카이브를 빌드하십시오.

    두 파일을 모두 제공하는 경우 Dockerrun.aws.json 파일에 이미지를 지정하지 마십시오. Elastic Beanstalk는 Dockerfile에 명시된 이미지를 빌드하여 사용하고 Dockerrun.aws.json 파일에 지정된 이미지는 무시합니다.

    Authentication 파일의 Dockerrun.aws.json v1 파라미터에 인증 파일이 포함되어 있는 Amazon S3 버킷에 대한 정보를 추가합니다. Authentication 파라미터에 유효한 Amazon S3 버킷과 키가 포함되어 있는지 확인하십시오. Amazon S3 버킷은 이를 사용 중인 환경과 동일한 AWS 리전에 호스팅되어야 합니다. Elastic Beanstalk는 다른 리전에 호스팅된 Amazon S3 버킷에서 파일을 다운로드할 수 없습니다.

    인증 파일을 생성하고 업로드하는 방법에 대한 자세한 내용은 프라이빗 리포지토리의 이미지 사용 단원을 참조하십시오.

    다음 예제는 mydockercfg 버킷에 있는 인증 파일 DOC-EXAMPLE-BUCKET를 사용하여 타사 레지스트리에서 프라이빗 이미지를 사용하는 방법을 보여줍니다.

    { "AWSEBDockerrunVersion": "1", "Authentication": { "Bucket": "DOC-EXAMPLE-BUCKET", "Key": "mydockercfg" }, "Image": { "Name": "quay.io/johndoe/private-image", "Update": "true" }, "Ports": [ { "ContainerPort": "1234" } ], "Volumes": [ { "HostDirectory": "/var/app/mydb", "ContainerDirectory": "/etc/mysql" } ], "Logging": "/var/log/nginx" }