Amazon Elastic Container Service
개발자 안내서 (API 버전 2014-11-13)

Amazon ECS의 도커 기본 사항

도커는 사용자가 Linux 컨테이너를 기반으로 하는 분산 애플리케이션을 빌드, 실행, 테스트 및 배포할 수 있도록 해주는 기술입니다. Amazon ECS는 작업 정의에 도커 이미지를 사용하여 클러스터의 Amazon EC2 인스턴스에 있는 컨테이너를 시작합니다. Amazon ECS 제품 세부 정보, 주요 고객 사례 연구 및 FAQ에 대해서는 Amazon Elastic Container Service 제품 세부 정보 페이지를 참조하십시오.

이 안내서에서는 독자가 도커가 무엇인지 및 작동 방식에 대해 기본적인 이해를 하고 있다고 가정합니다. 도커에 대한 자세한 내용은 도커란 무엇인가?도커 개요를 참조하십시오.

Amazon Linux 2에 Docker 설치

참고

이미 도커가 설치되어 있으면 도커 이미지 생성 단계로 건너뜁니다.

도커는 최신 Linux 배포 버전(Ubuntu 등)을 비롯하여 Mac OSX 및 Windows 등 다양한 운영 체제에서 사용할 수 있습니다. 특정 운영 체제에 도커를 설치하는 방법에 대한 자세한 내용은 도커 설치 안내서를 참조하십시오.

도커를 사용하는 데는 로컬 개발 시스템도 필요하지 않습니다. Amazon EC2를 이미 사용 중인 경우 Amazon Linux 2 인스턴스를 시작하고 Docker를 설치하면 시작할 수 있습니다.

Amazon EC2 인스턴스에 Docker를 설치하려면

  1. Amazon Linux 2 AMI로 인스턴스를 시작합니다. 자세한 내용은 Linux 인스턴스용 Amazon EC2 사용 설명서에서 인스턴스 시작을 참조하십시오.

  2. 인스턴스에 연결합니다. 자세한 내용은 Linux 인스턴스용 Amazon EC2 사용 설명서에서 Linux 인스턴스에 연결을 참조하십시오.

  3. 인스턴스에 설치한 패키지 및 패키지 캐시를 업데이트합니다.

    sudo yum update -y
  4. 최신 Docker Community Edition 패키지를 설치합니다.

    sudo amazon-linux-extras install docker
  5. 도커 서비스를 시작합니다.

    sudo service docker start
  6. ec2-user를 사용하지 않고도 도커 명령을 실행할 수 있도록 docker 그룹에 sudo를 추가합니다.

    sudo usermod -a -G docker ec2-user
  7. 로그아웃하고 다시 로그인해서 새 docker 그룹 권한을 선택합니다. 이를 위해 현재 SSH 터미널 창을 닫고 새 창에서 인스턴스를 다시 연결할 수 있습니다. 새 SSH 세션은 해당되는 docker 그룹 권한을 갖게 됩니다.

  8. ec2-user 없이도 sudo가 도커 명령을 실행할 수 있는지 확인합니다.

    docker info

    참고

    경우에 따라서는 ec2-user가 도커 데몬에 액세스할 수 있는 권한을 제공하기 위해 인스턴스를 재부팅해야 할 수도 있습니다. 다음 오류가 표시될 경우 인스턴스를 재부팅해 보십시오.

    Cannot connect to the Docker daemon. Is the docker daemon running on this host?

도커 이미지 생성

Amazon ECS 작업 정의는 도커 이미지를 사용하여 클러스터의 컨테이너 인스턴스에서 컨테이너를 시작합니다. 이 단원에서는 간단한 웹 애플리케이션의 도커 이미지를 생성하여 이를 로컬 시스템이나 EC2 인스턴스에서 테스트한 다음, 컨테이너 레지스트리(Amazon ECR 또는 Docker Hub 같은)에 푸시하여 ECS 작업 정의에서 사용할 수 있도록 합니다.

간단한 웹 애플리케이션의 도커 이미지를 생성하려면

  1. Dockerfile이라는 파일을 생성합니다. Dockerfile은 도커 이미지에 사용할 기본 이미지 및 이를 설치하고 실행할 항목을 설명하는 매니페스트입니다. Dockerfile에 대한 자세한 내용은 Dockerfile 참조를 참조하십시오.

    touch Dockerfile
  2. 방금 만든 Dockerfile을 수정하고 다음 내용을 추가합니다.

    FROM ubuntu:18.04 # Install dependencies RUN apt-get update && \ apt-get -y install apache2 # Install apache and write hello world message RUN echo 'Hello World!' > /var/www/html/index.html # Configure apache RUN echo '. /etc/apache2/envvars' > /root/run_apache.sh && \ echo 'mkdir -p /var/run/apache2' >> /root/run_apache.sh && \ echo 'mkdir -p /var/lock/apache2' >> /root/run_apache.sh && \ echo '/usr/sbin/apache2 -D FOREGROUND' >> /root/run_apache.sh && \ chmod 755 /root/run_apache.sh EXPOSE 80 CMD /root/run_apache.sh

    이 Dockerfile은 Ubuntu 18.04 이미지를 사용합니다. RUN 지침은 패키지 캐시를 업데이트하고, 웹 서버 및 PHP 지원의 일부 소프트웨어 패키지를 설치하고, 웹 서버의 문서 루트에 "Hello World!" 콘텐츠를 씁니다. EXPOSE 지침은 컨테이너에 포트 80을 노출하고 CMD 지침은 웹 서버를 시작합니다.

  3. Dockerfile에서 도커 이미지를 빌드합니다.

    참고

    아래의 명령에서 도커의 일부 버전에서는 아래 보이는 상대 경로 대신에 Dockerfile의 전체 경로가 필요할 수 있습니다.

    docker build -t hello-world .
  4. docker images를 실행하여 이미지가 올바로 생성되었는지 확인합니다.

    docker images --filter reference=hello-world

    결과:

    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    hello-world         latest              e9ffedc8c286        4 minutes ago       241MB
  5. 새로 빌드된 이미지를 실행합니다. -p 80:80 옵션은 컨테이너에 있는 노출된 포트 80을 호스트 시스템에 있는 포트 80에 매핑합니다. docker run에 대한 자세한 내용을 보려면 도커 실행 참조를 참조하십시오.

    docker run -t -i -p 80:80 hello-world

    참고

    Apache 웹 서버로부터의 출력이 터미널 창에 표시됩니다. "Could not reliably determine the server's fully qualified domain name" 메시지는 무시해도 됩니다.

  6. 브라우저를 열고 도커를 실행하고 컨테이너를 호스팅하고 있는 서버를 가리킵니다.

    • EC2 인스턴스를 사용하고 있는 경우 서버의 Public DNS 값이며, 이는 SSH로 인스턴스에 연결할 때 사용하는 주소와 동일합니다. 인스턴스의 보안 그룹에서 포트 80에 인바운드 트래픽을 허용해야 합니다.

    • Docker를 로컬에서 실행하고 있는 경우, 브라우저에서 http://localhost/를 가리킵니다.

    • Windows 또는 Mac 컴퓨터에서 docker-machine을 사용하는 경우, docker-machine ip 명령을 사용하여 도커를 호스팅하고 있는 VirtualBox VM의 IP 주소를 찾고, 사용하고 있는 도커 머신의 이름으로 machine-name을 바꿉니다.

      docker-machine ip machine-name

    "Hello, World!"라고 표시된 웹 페이지가 나타납니다.

  7. Ctrl + c를 입력하여 도커 컨테이너를 중지합니다.

(선택 사항) Amazon Elastic Container Registry에 이미지 푸시

Amazon ECR은 관리형 AWS 도커 레지스트리 서비스입니다. 고객은 친숙한 도커 CLI를 사용하여 이미지를 푸시, 가져오기 및 관리할 수 있습니다. Amazon ECR 제품 세부 정보, 주요 고객 사례 연구 및 FAQ에 대해서는 Amazon Elastic Container Registry 제품 세부 정보 페이지를 참조하십시오.

이 섹션에는 다음 사항이 필수입니다.

  • AWS CLI를 설치하고 구성합니다. 시스템에 AWS CLI를 설치하지 않았다면 AWS Command Line Interface 사용 설명서AWS Command Line Interface 설치 단원을 참조하십시오.

  • 사용자에게 Amazon ECR 서비스에 액세스하는 데 필요한 IAM 권한이 있습니다. 자세한 내용은 Amazon ECR 관리형 정책 단원을 참조하십시오.

이미지를 태그 지정하고 Amazon ECR에 푸시하려면

  1. hello-world 이미지를 저장할 Amazon ECR 리포지토리를 생성합니다. 출력의 repositoryUri를 참고합니다.

    aws ecr create-repository --repository-name hello-repository --region region

    결과:

    {
        "repository": {
            "registryId": "aws_account_id",
            "repositoryName": "hello-repository",
            "repositoryArn": "arn:aws:ecr:region:aws_account_id:repository/hello-repository",
            "createdAt": 1505337806.0,
            "repositoryUri": "aws_account_id.dkr.ecr.region.amazonaws.com/hello-repository"
        }
    }
  2. hello-world 이미지를 이전 단계의 repositoryUri 값으로 태그 지정합니다.

    docker tag hello-world aws_account_id.dkr.ecr.region.amazonaws.com/hello-repository
  3. aws ecr get-login --no-include-email 명령을 실행하여 레지스트리에 대한 docker login 인증 명령 문자열을 가져옵니다.

    참고

    get-login 명령은 버전 1.9.15부터 AWS CLI에서 사용할 수 있습니다. 하지만 최신 버전의 도커(17.06 이상)의 경우에는 버전 1.11.91 이상을 권장합니다. AWS CLI 버전은 aws --version 명령을 통해 확인할 수 있습니다. 도커 버전 17.06 이상을 사용하는 경우 get-login 뒤에 --no-include-email 옵션을 포함합니다. Unknown options: --no-include-email 오류가 발생하는 경우 최신 버전의 AWS CLI를 설치합니다. 자세한 내용은 AWS Command Line Interface 사용 설명서AWS 명령줄 인터페이스 설치를 참조하십시오.

    aws ecr get-login --no-include-email --region region
  4. 이전 단계에서 반환된 docker login 명령을 실행합니다. 이 명령은 12시간 동안 유효한 인증 토큰을 제공합니다.

    중요

    docker login 명령을 실행할 때 시스템의 다른 사용자가 프로세스 목록(ps -e) 디스플레이에서 해당 명령 문자열을 볼 수 있습니다. docker login 명령에는 인증 자격 증명이 포함되므로, 시스템의 다른 사용자가 이러한 방식으로 이 자격 증명을 볼 수 있는 위험이 있습니다. 또한 다른 사용자가 이 자격 증명을 사용하여 리포지토리에 대한 푸시 및 풀 액세스 권한을 얻을 수 있습니다. 안전한 시스템이 아닐 경우 이 위험을 고려하여 -p password 옵션을 생략하고 요청 시 암호를 입력하는 대화형 방식으로 로그인해야 합니다.

  5. 이전 단계의 repositoryUri 값을 사용하여 Amazon ECR로 이미지를 푸시합니다.

    docker push aws_account_id.dkr.ecr.region.amazonaws.com/hello-repository

(선택 사항) 정리

Amazon ECR 이미지 실험이 끝나면 이미지 저장 비용을 물지 않도록 리포지토리를 삭제할 수 있습니다.

aws ecr delete-repository --repository-name hello-repository --region region --force

다음 단계

이제 Docker 이미지를 생성하여 Amazon ECR 리포지토리로 푸시했으므로 컨테이너 시작을 위한 Amazon ECS 리소스 생성을 시작할 수 있습니다. 계속하려면 다음 주제를 참조하십시오.