본문 바로가기

Cloud AWS

Amazon AWS :: EC2 Container Service 이해


다루는 내용

  • Docker 이해
  • EC2 Container Service (ECS) 구성 이해
  • 마법사로 EC2 Container Service 시작하기
  • 커스텀 ECS 시작하기
  • 웹 서비스 이미지 만들기
  • ECS에서 S3이미지 사용하기

실습

Docker 이해

Docker는 오픈 소스 컨테이너 프로젝트이다. 반가상화보다 좀 더 경량화된 방식으로 게스트 OS를 설치하지 않고, Docker 이미지에 어플리케이션과 라이브러리만 격리해서 설치하여 OS자원은 호스트와 공유한다.

  • Docker Images : 읽기전용 템플릿으로 도커 컨테이너를 생성하기 위해 사용된다. 하나의 이미지를 수정하여 새로운 이미지를 만들 수 있다.
  • Docker Registries : 이미지를 보관하고, 업로드 다운로드 할 수 있는 퍼블릭 또는 프라이빗 저장소이다. 퍼블릭 도커 레지스터리는 도커 허브라고도 한다.
  • Docker Containers : 이미지로부터 실체화된 실행 컴포넌트이다. 어플리케이션, 라이브러리 등이 저장되어 있다.


EC2 Container Service (ECS) 구성 이해

ECS는 Docker를 기반으로 한 AWS 서비스이다. 실제로 docker 데몬에 의해 동작하지만 사용을 위해서 ECS의 구성요소에 대해서 이해가 필요하다.


  • Task Definition : Task를 어떻게 만들 것인지 정의한다. 어떤 도커 이미지를 사용할 것인지, 각 컨테이너의 CPU와 Memory 크기, 컨테이너 간의 연결성, 사용 포트 정보, 필수 컨테이너 명시, 컨테이너 시작시 실행될 스크립트, 컨테이너가 사용할 data volume 등이 포함된다.
  • Cluster : Container Instance의 그룹
  • Container Instance : Docker deamon과 ECS agent가 실행 중인 EC2 인스턴스이다.
  • Service : Task Definition으로부터 Task를 생성하고, 모니터링한다. Task가 중지되거나 응답이 없을 경우 새로운 Task를 생성하여 Desired count를 유지한다. ELB와 매핑된다.
  • Task : Task Definition의 정의대로 Container Instance내에 실행중인 단위 작업
  • Container : Task내에 생성된 리눅스 컨테이너
  • Scheduler : Task를 Container Instance에 생성할 때 사용되는 메소드. 서비스로 등록하는 방법과 배치로 한번 실행하는 방법이 있다.

마법사로 EC2 Container Service 시작하기

  1. 콘솔에서 EC2 Container Service 클릭
  2. Get started 클릭
  3. Amazon ECS sample 선택
  4. Next Step 클릭
  5. Create Task Definition from sample 페이지에서
    httpd와 busybox 이미지로 각각의 컨테이너를 만들도록 정의되어 있다.
    1) Next Step 클릭
  6. Schedule Tasks 페이지에서
    배치잡처럼 한번 실행할지 Service로 등록하여 Task에 대해서 지속적으로 관리할지 선택한다.
    1) Create a service 선택
    2) Desired number of Tasks : 1
    3) Service Name : sample-webapp
    4) Next Step 클릭
  7. Configure Cluster 페이지에서
    Container Instance에 대한 설정을 한다.
    1) Key pair name : arang-oregon-keypair 선택
    2) Create IAM Role 클릭
    3) View Details 클릭
    4) IAM Role : Create a new IAM Role 선택
    5) Role Name : ecsInstanceRole 입력
    6) Allow 클릭
    7) Review & Launch 클릭
  8. Review 페이지에서
    1) Launch Instance & Run Service 클릭
  9. Launch status 페이지에서
    1) View Service 클릭
  10. 왼쪽 메뉴에서 Clusters 클릭
  11. default 클러스터 클릭
  12. Tasks 탭 클릭
  13. Container Instance아래 값 클릭
  14. Public DNS 확인 : ec2-52-25-117-232.us-west-2.compute.amazonaws.com
  15. 브라우져 접속

커스텀 ECS 시작하기
Task Definitions 생성

  1. 왼쪽 메뉴에서 Task Definitions 클릭
  2. Create new Task Definition 클릭
  3. Task Definition Name : TaskDefinitionForLab 입력
  4. Add Container Definition 클릭
    1) Container name : ContainerLab 입력
    2) Image : centos 입력 (임의의 문자열이 아닌 지정된 이미지명이다. 그대로 입력하기 바란다.)
    3) Memory : 200 입력
    4) CPU Units : 10 입력
    5) Essential : 체크
    6) Add 클릭
  5. Create 클릭

Clusters 생성

  1. 왼쪽 메뉴에서 Clusters 클릭
  2. Create Cluster 클릭
    1) Cluster name : ClusterLab 입력
    2) Create 클릭
  3. ClusterLab 클러스트 클릭

Container Instance 생성

  1. 콘솔에서 EC2 클릭
  2. Launce Instance 클릭
  3. Step 1: Choose an Amazon Machine Image (AMI) 페이지에서
    Container Instance는 EC2 인스턴스에 Docker 데몬과 ECS agent를 실행한 것이다. 별도로 설치 후 실행해줘도 되지만, 포함된 AMI를 아마존에서 제공한다. 리전별로 AMI ID가 다르므로 참고하자.
    http://docs.aws.amazon.com/AmazonECS/latest/developerguide/launch_container_instance.html

    1) Community AMIs 클릭
    2) ami-db0306eb 검색
    3) Select 클릭
  4. Step 2: Choose an Instance Type 페이지에서
    1) Next: Configure Instance Details 클릭
  5. Step 3: Configure Instance Details 페이지에서
    Public IP가 할당될 수 있도록 설정한다.
    1) IAM Role : ecsInstanceRole 선택
    마법사에서 생성한 IAM Role이며, 아래와 같이 Policy가 정의되어 있다.

    2) User data :
    User data로 해당 인스턴스가 ClusterLab 클러스터에 포함되도록 설정해준다. 지정하지 않을 경우 default 클러스터에 Container Instance로 할당된다.
    3) Review and Launch 클릭
  6. Step 7: Review Instance Launch 페이지에서
    1) Launch 클릭
    2) key pair 선택 후 Launch Instances 클릭
  7. View Instances 클릭
  8. 콘솔에서 EC2 Container Service 클릭
  9. ClusterLab 클릭
  10. ECS Instances 탭 클릭
    수 분 후 새로고침하면 Container Instance가 나타난다.

Service 생성

  1. Services 탭 클릭
  2. Create 클릭
  3. Create Service 페이지에서
    1) Task Definition : TaskDefinitionForLab:1 선택
    2) Cluster : ClusterLab 선택
    3) Service name : ECSLab 입력
    4) Number of tasks : 1 입력
    5) Create Service 클릭

Task Definition 수정

서비스까지 생성을 마치게 되면 ECS는 서비스 상태가 된다. 정의된 Task Definition을 참조하여 Task를 만들게 되는데, 하나의 Task는 Instance에서 실행되는 Linux Container의 모음이다. 실습에서는 docker HUB에 있는 centos official 이미지를 사용하는데, 기본적으로 /bin/bash CMD를 실행하고 완료 후 STOP 상태가 된다. Service는 Desired count를 유지하기 위하여 새로운 Task를 띄우게 되고, 이 과정을 무한히 반복하게 된다.
[STOP된 Task 히스토리]

[생성되었다가 중지된 Container 히스토리]

  1. 왼쪽 메뉴에서 Task Definitions 클릭
  2. TaskDefinitionForLab 선택
  3. Create new revision 클릭
  4. Container Name 클릭

  5. Edit 창에서
    1) Command : sleep,360 입력
    2) Update 클릭
  6. Create 클릭
    새로운 Revision(TaskDefinitionForLab:2)이 생성된다.
  7. 왼쪽 메뉴에서 Clusters 클릭
  8. ClusterLab 클러스터 클릭
  9. ECSLab Service 선택 후 Update 클릭

  10. Update Service 페이지에서
    1) Task Definition : TaskDefinitionForLab:2 선택
    2) Update Service 클릭

확인
Service는 새로운 Task Definition으로 Task를 실행하려 하고, 잠시 후 RUNNING 상태의 Task를 확인 할 수 있다. 이는 Container가 sleep 360 커맨드를 실행 중이며, 아직 완료되지 않았으므로 STOP 상태로 변경되지 않는다.

  1. Container Instance에 SSH 접속
  2. 권한 상승
    Docker는 루트 권한으로 실행된다.

  3. 실행 중인 컨테이너 목록 출력

    centos:latest와 ECS agent 컨테이너가 실행 중이다.
     
  4. Docker Hub에서 이미지 검색

    실습에서 사용한 이미지는 centos official 이미지이다.
     
  5. 이미지 목록 출력


     
  6. 이미지로 컨테이너 생성


     
  7. 호스트 OS에서 컨테이너 안의 명령 실행


웹 서비스 이미지 만들기
도커 허브에는 다양한 이미지들이 공개되어 있다. Official하게 제공된 이미지 외에도 사용자들이 만들어서 공개한 이미지들도 있다. jdeathe/centos-ssh-apache-php도 그 중 하나이다.

Task Definitions의 Image 부분에 해당 이미지 명을 입력하고, 포트 매핑을 해주는 것만으로 컨테이너에서 웹 서비스가 되는 것을 확인 할 수 있다.

이번 실습에서는 Base 이미지에 직접 작업하여 간단한 웹 서비스가 가능한 이미지를 만들어 본다.

이미지 만들기

  1. 컨테이너 실행
    베이스 이미지인 centos로 컨테이너를 만들고, 해당 컨테이너에 attach 명령어로 표준입력과 표준출력을 연결한다. (컨테이너에 쉘 접속하는 것과 비슷하다)
  2. 웹 서버 설치 및 소스 넣기
    yum으로 아파치 설치 후 웹 서버 소스를 위치 시킨다. 
  3. 스크립트 작성
    /var/www/html/docker_loop.sh 파일을 만들고 수정한다.
    아파치 데몬을 띄우고, 컨테이너를 유지하기 위한 스크립트이다. ECS 콘솔에서 Command 파라미터로 실행할 예정이다.
  4. Attach 명령 종료
    Ctrl+P, Ctrl+Q 를 차례대로 눌러 Attach 명령어 모드를 종료한다. 컨테이너 상에서 exit 명령어를 입력하면 컨테이너가 종료되므로 주의하자.
  5. 수정 사항 저장하기
    centos:latest 이미지는 현재 수정된 상태이다.
    생성된 이미지가 Container Instance 로컬에 저장되었다.
     

개인 저장소(private registry)
이렇게 생성한 이미지는 도커 허브에 저장하여 사용할 수 있다(회원 가입 필요). 하지만, 여기선 S3를 저장소로 이용하는 방법으로 진행한다.

  1. 도커 데몬 수정 및 실행
    기본 값으로 실행되는 도커 데몬은 개인 저장소를 이용하기 위해서는 인증 절차를 그쳐야 한다. 인증을 사용하지 않기 위해서는 도커 데몬 실행시 옵션을 주어야한다.
    1) 도커 데몬 실행 스크립트 수정
    /etc/init.d/docker 파일을 열어 아래 부분을 수정한다.
    DOCKER_OPTS변수에 –insecure-registry REGISTRY_HOST:REGISTRY_PORT를 지정하고 실행시 해당 옵션이 적용되도록 한다.
    2) 도커 데몬 재시작


    도커 데몬을 재시작하게 되면 실행 중인 컨테이너가 모두 종료된다.
  2. 컨테이너 실행
    1) ECS Agent 실행
     2) Private registry 실행
    도커 허브에 있는 registry이미지를 받아와서 컨테이너를 생성한다. 환경 변수를 지정하기 위해 –e 옵션을 이용한다.
  3. 저장소에서 이미지 검색


    Container Instance에 저장소 컨테이너가 실행 중인데, SEARCH 명령어가 localhost로는 정상적으로 응답하나 REGISTRY_HOST 로 에러가 발생할 경우 해당 인스턴스의 Security Group에서 TCP 5000을 오픈해주어야 한다.

  4. 이미지 업로드
    이제 이미지를 저장소 컨테이너에 push하면 S3에 저장이 된다.


    [S3 버킷]

ECS에서 S3이미지 사용하기

ECS에서 S3 이미지로 컨테이너 생성하기 (Task Definition 설정)

  1. 콘솔에서 EC2 Container Service 클릭
  2. 왼쪽 메뉴에서 Task Definitions 클릭
  3. TaskDefinitionForLab 선택 후 Create new revision 클릭
  4. Container Name 클릭

  5. Edit 창에서
    1) Image : 52.10.229.98:5000/centos-httpd-loop:1.0 입력
    2) Port Mappings 
       Host Port : 80 입력
       Container Port : 80 입력
    3) Entry Point : /bin/bash 입력
    4) Command : /var/www/html/docker_loop.sh 입력
    5) Update 클릭


  6. Create 클릭
    새로운 Revision(TaskDefinitionForLab:3)이 생성된다.
  7. 왼쪽 메뉴에서 Clusters 클릭
  8. ClusterLab 클러스터 클릭
  9. ECSLab Service 선택 후 Update 클릭
  10. Update Service 페이지에서
    1) Task Definition : TaskDefinitionForLab:3 선택
  11. Update Service 클릭

확인

  1. 브라우져 접속

  2. Container Instance에서 실행 중인 컨테이너 확인


참고
※ http://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-dg.pdf
※ http://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html
※ https://docs.docker.com/reference/commandline/cli/

※ 리소스 정리
ECS의 리소스를 직관적으로 삭제하려하면 오류 메시지를 만나게 된다. 삭제에 필요한 과정을 살펴 보겠다.
1. 콘솔에서 ECS 클릭
2. ClusterLab 클릭
3.  ECSLab 서비스명 클릭
4. Update 클릭
5. Update Service 페이지에서

   1) Number of tasks : 0 수정
   2) Update Service 클릭
6. Delete 클릭
7. ECS Instances 탭 클릭
8. Container Instance 명 클릭
9. Container Instance 페이지에서
   1) Deregister 클릭
10. 왼쪽 메뉴에서 Clusters 클릭
11. ClusterLab 의 X 버튼 클릭

12. EC2 콘솔에서 해당 인스턴스 삭제
마법사로 ECS를 시작한 경우 CloudFormation에서 해당 스택을 삭제 해준다.

Arang

Sr. Technical Trainer at GSNeotek