본문 바로가기

AWS/Docker

[AWS/Docker] Amazon ECS용 도커 기본 사항

Amazon ECS용 도커 기본 사항

도커 파일의 작성과 이미지를 빌드하고 Amazon ECR 프라이빗 리포지토리에 Push하는 기본 단계를 소개합니다. 이번 포스트를 진행하기 위해서는 도커와 리눅스, AWS CLI 등에 대한 사용법을 기본적으로 숙지하고 있어야 합니다.

  • 도커 설치
  • 도커 파일 작성 및 도커 이미지를 빌드
  • AWS CLI를 사용하여 Amazon ECR 프라이빗 리포지토리 생성
  • Amazon ECR 프라이빗 리포지토리에 도커를 인증
  • AWS CLI를 사용하여 Amazon ECR 프라이빗 리포지토리에 도커 이미지를 Push
  • AWS CLI를 사용하여 Amazon ECR 프라이빗 리포지토리 삭제

도커 설치

우선 로컬 호스트에 도커가 설치되어 있는지 확인합니다. 터미널을 열어 다음 명령문을 실행합니다.

$ docker info

명령문으로 도커 정보가 출력되지 않으면 도커 공식 도큐먼트에서 설치를 진행합니다. Amazon EC2에 도커를 설치하는 경우라면 AWS 공식 도큐먼트에 따라서 진행합니다.

이번 섹션에서는 MacOS에서 로컬 호스트에 설치된 도커를 사용하여 진행합니다. 도커가 설치되었다는 가정하에 다음 섹션을 이어서 진행합니다.

도커 파일 작성 및 도커 이미지 빌드

도커는 도커 파일을 통해 이미지를 빌드 할 수 있습니다. 따라서 가장 먼저 도커 파일이 필요합니다.

$ touch DockerFile

도커 파일의 내용을 다음과 같이 채웁니다. ubuntu:18.04 이미지를 기본 이미지로 동작하며, 컨테이너를 통해 호스팅되는 서버에 연결하면 "Hello World!"를 출력합니다. 이미지에 사용되는 각 명령문을 모르더라도 이어지는 섹션을 진행하는데 문제는 없습니다.

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

도커 이미지를 빌드하기 위해 다음 명령문을 실행합니다. 이 명령문은 도커 파일이 위치한 경로에서 실행합니다. 

$ docker build -t [이미지 이름] .

명령문의 마지막에 마침표(.)가 포함되어 있음에 주의합니다. 명령문이 정상적으로 실행되면 콘솔은 다음과 같이 출력합니다.

$ docker build -t hello-world .
[+] Building 29.2s (9/9) FINISHED                                                                                      
 => [internal] load build definition from Dockerfile                                                              0.0s
 => => transferring dockerfile: 580B                                                                              0.0s
 => [internal] load .dockerignore                                                                                 0.0s
 => => transferring context: 2B                                                                                   0.0s
 => [internal] load metadata for docker.io/library/ubuntu:18.04                                                   3.8s
 => [auth] library/ubuntu:pull token for registry-1.docker.io                                                     0.0s
 => [1/4] FROM docker.io/library/ubuntu:18.04@sha256:d8ac28b7bec51664c6b71a9dd1d8f788127ff310b8af30820560973bcfc  2.9s
 => => resolve docker.io/library/ubuntu:18.04@sha256:d8ac28b7bec51664c6b71a9dd1d8f788127ff310b8af30820560973bcfc  0.0s
 => => sha256:d8ac28b7bec51664c6b71a9dd1d8f788127ff310b8af30820560973bcfc605a0 1.41kB / 1.41kB                    0.0s
 => => sha256:6b26a5e25e3b4d0337997ab73f28c67427d0aa9ff65c0efc1996c576b238502c 529B / 529B                        0.0s
 => => sha256:b67d6ac264e4841abb64519b1e85d19873214864b6102939196c8c00ead895ee 1.46kB / 1.46kB                    0.0s
 => => sha256:11323ed2c65349758e68a03a8e43825ec263dc9790daea93cf83b18ad0703109 26.71MB / 26.71MB                  1.2s
 => => extracting sha256:11323ed2c65349758e68a03a8e43825ec263dc9790daea93cf83b18ad0703109                         1.3s
 => [2/4] RUN apt-get update &&  apt-get -y install apache2                                                      20.8s
 => [3/4] RUN echo 'Hello World!' > /var/www/html/index.html                                                      0.4s 
 => [4/4] RUN echo '. /etc/apache2/envvars' > /root/run_apache.sh &&  echo 'mkdir -p /var/run/apache2' >> /root/  0.2s 
 => exporting to image                                                                                            0.9s 
 => => exporting layers                                                                                           0.9s 
 => => writing image sha256:69560fe450063a0edd46487d25f3bc390ee38b31be9e4e79b4481afc4bfc1b40                      0.0s 
 => => naming to docker.io/library/hello-world                                                                    0.0s

추가적으로 docker images 명령문으로 이미지 생성이 잘 되었는지 확인 할 수 있습니다.

$ docker images --filter reference=[이미지 이름]
REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
hello-world   latest    69560fe45006   15 seconds ago   199MB

이제 빌드된 이미지를 사용하여 컨테이너를 실행합니다.

$ docker run -t -i -p 80:80 [이미지 이름]
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message

Apache 웹 서버가 경고를 출력하더라도 무시해도 괜찮습니다. 이제 웹 브라우저를 열어 다음 링크 http://localhost/에 접속합니다. 웹 브라우저 페이지가 "Hello World!"를 출력하고 있다면 컨테이너가 정상적으로 실행된 상태입니다. Ctrl+c를 입력하여 Apache 웹 서버 프로세스를 종료합니다. 프로세스가 종료되면 자동으로 컨테이너가 종료됩니다.

AWS CLI를 사용하여 Amazon ECR 프라이빗 리포지토리 생성

이번 섹션에서는 사전에 AWS CLI가 설치되어 있어야 하며 IAM 사용자에 대한 구성 및 증명 파일 설정이 필요합니다. 터미널에서 다음 명령문을 실행했을 때 AWS CLI 버전이 출력되는지 확인합니다.

$ aws --v
aws-cli/2.4.11 Python/3.8.8 Darwin/20.6.0 exe/x86_64 prompt/off

AWS CLI가 설치되어 있다면 IAM 사용자에 대한 구성이 되어있는지 확인합니다. 사용자 구성에 따라서 출력 값은 상이합니다.

$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************4UU6 shared-credentials-file    
secret_key     ****************bncg shared-credentials-file    
    region           ap-northeast-2      config-file    ~/.aws/config

이제 AWS CLI를 사용하여 Amazon ECR 프라이빗 리포지토리를 생성할 준비가 되었습니다. 다음 명령문을 실행하여 리포지토리 생성을 요청합니다. 서울 리전의 경우 AWS 리전 코드는 ap-northeast-2입니다. 리포지토리 이름은 임의로 지정합니다.

$ aws ecr create-repository --repository-name [리포지토리 이름] --region [AWS 리전 코드]

실행이 완료되면 Aamzon ECR 콘솔에서 추가된 리포지토리가 보여집니다. 출력문의 repositoryUriAWS 계정 ID 등은 다음 섹션에서도 사용되니 기억하고 있어야 합니다.

{
    "repository": {
        "registryId": [AWS 계정 ID],
        "repositoryName": [리포지토리 이름],
        "repositoryArn": arn:aws:ecr:region:[AWS 계정 ID]:repository/[리포지토리 이름],
        "createdAt": 1505337806.0,
        "repositoryUri": [AWS 계정 ID].dkr.ecr.[AWS 리전 코드].amazonaws.com/[리포지토리 이름]
    }
}

 

리포지토리는 aws ecr create-repository 명령문으로 지정한 리포지토리 이름으로 생성됩니다. 리포지토리에서 관리 중인 이미지를 확인하려면 Amazon ECR > 리포지토리 > [리포지토리 이름]을 클릭합니다. 아직 리포지토리에 Push된 것이 없으므로 비어 있습니다.

Amazon ECR 프라이빗 리포지토리에 도커를 인증

도커 CLI는 AWS IAM 인증 방법을 지원하지 않습니다. Amazon ECR에 도커 CLI를 사용하여 Push와 Pool 등의 기능을 사용하려면 리포지토리에 도커를 인증해야합니다. 터미널로 돌아와 다음 명령문을 실행합니다.

$ aws ecr get-login-password | docker login --username AWS --password-stdin [AWS 계정 ID].dkr.ecr.[AWS 리전 코드].amazonaws.com

aws ecr get-login-password 명령은 인증 토큰을 docker login 명령에 전달할 때 사용자 이름으로 AWS를 사용하고, 인증하려는 Amazon ECR 레지스트리 URI를 지정합니다. 만약 여러 레지스트리에 대해서 인증이 필요한 경우 각 레지스트리에 대해 명령문을 반복 실행해야합니다.

$ aws ecr get-login-password | docker login --username AWS --password-stdin 011808493152.dkr.ecr.ap-northeast-2.amazonaws.com
Login Succeeded

Logging in with your password grants your terminal complete access to your account. 
For better security, log in with a limited-privilege personal access token. Learn more at https://docs.docker.com/go/access-tokens/

AWS CLI를 사용하여 Amazon ECR 프라이빗 리포지토리에 도커 이미지를 Push

이미지를 리포지토리에 Push하기 전에 이미지 태그를 repositoryUri로 지정합니다.

$ docker tag [이미지 이름] [AWS 사용자 ID].dkr.ecr.[AWS 리전 코드].amazonaws.com/[리포지토리 이름]

도커 CLI를 사용하여 repositoryUri로 이미지를 Push합니다.

$ docker push [AWS 사용자 ID].dkr.ecr.[AWS 리전 코드].amazonaws.com/[리포지토리 이름]

다음 출력처럼 Push가 성공하였다면 Amazon ECR 콘솔에 로그인합니다.

$ docker push 011808493152.dkr.ecr.ap-northeast-2.amazonaws.com/hello-repo
Using default tag: latest
The push refers to repository [011808493152.dkr.ecr.ap-northeast-2.amazonaws.com/hello-repo]
89f74eb35326: Pushed 
f7d205ecbaa8: Pushed 
40513d2a4151: Pushed 
9d6787a516e7: Pushed 
latest: digest: sha256:dcbb7230b4f087aa45e7c59221194af0420e2b6a41c4f09f2ce42514e96401f1 size: 1155

리포지토리에서 관리 중인 이미지를 확인하기 위해 Amazon ECR > 리포지토리 > [리포지토리 이름]을 클릭합니다. 방금 Push한 이미지가 목록에 보입니다.

AWS CLI를 사용하여 Amazon ECR 프라이빗 리포지토리 삭제

테스트가 끝난 리포지토리는 외부에 노출되거나 실수로 사용되어 비용이 책정되지 않도록 삭제합니다. AWS CLI에서 다음 명령문을 실행합니다.

$ aws ecr delete-repository --repository-name [리포지토리 이름] --region [AWS 리전 코드] --force

또는 Amazon ECR 콘솔에서 대상 리포지토리 선택 > 삭제 버튼을 클릭하여 리포지토리를 삭제합니다.