AWS, Docker
Language/Python

AWS, Docker

뉴비뉴 2019. 11. 22.

https://www.44bits.io/ko/post/container-orchestration-101-with-docker-and-aws-elastic-container-service

 

아마존 엘라스틱 컨테이너 서비스(ECS)와 도커(Docker)로 시작하는 컨테이너 오케스트레이션

컨테이너는 격리된 환경에서 애플리케이션을 실행할 수 있도록 도와줍니다. 컨테이너를 프로덕션 환경에서 사용하기 위해서는 적절한 스케줄링과 관리를 위한 도구가 필요합니다. 이 글에서는 AWS에서 제공하는 매니지드 컨테이너 오케스트레이션 서비스인 ECS를 소개합니다.

www.44bits.io

위 글에서는 ECS의 기본 개념들을 소개하고 간단한 Nginx 서버를 배포해나가면서,

로드 밸런서와 ECS 서비스를 조합해서 사용하는 방법에 대해서 소개해주고 있다.

 

도커(Docker)와 Dockerfile

ECS는 컨테이너 가상화를 기반으로 하고 있습니다.

 

Docker 

https://blog.nacyot.com/articles/2014-01-27-easy-deploy-with-docker/

 

nacyot의 프로그래밍 이야기 :: 도커(Docker) 튜토리얼 : 깐 김에 배포까지

도커(Docker)는 2013년에 등장한 새로운 컨테이너 기반 가상화 도구입니다. 도커는 계층화된 파일시스템(AUFS, BTRFS 등)을 사용해 가상화된 컨테이너의 변경사항을 모두 추적하고 관리합니다. 이를 통해서 컨테이너의 특정 상태를 항상 보존해두고, 필요할 때 언제 어디서나(단, Docker가 설치만 되어있다면) 이를 실행할 수 있도록 도와주는 도구입니다. 이 글은 Docker 입문자를 위한 튜토리얼로, 도커의 기본 개념들과 사용법에 대해서 소개합니

blog.nacyot.com

 

이미지 이해하기

docker images 명령어로 시스템에 어떤 이미지가 있는지 확인할 수 있다.

위 명령어는 현재 시스템에서 사용가능한 이미지 알람을 보여줍니다.

 

이미지는 크게 세 가지 방법을 통해서 추가할 수 있습니다.

 

1. docker pull <이미지 이름>을 통해서 가져오는 방법입니다.

바로 이 명령어를 사용하면 docker.io 의 공식 저장소에서 이미지를 다운받아 옵니다.

 

2. Dockerfile을 통해서 기술된 과정을 거쳐 도커 이미지를 생성하는 방법입니다.

 

컨테이너 이해하기

이미지의 쉘에 접근해보기

docker run -i -t ubuntu:12.04 /bin/bash

 

이번에 사용할 명령어는 현재 실행중인 컨테이너들을 출력하는 docker ps 입니다.

 

컨테이너가 실행되고 있는 것을 확인할 수 있습니다.

이미지와 컨테이너의 개념을 정확하게 짚고 넘어갈 필요가 있습니다.

단지 이미지는 추상적인 존재라는 것을 이해할 필요가 있습니다.

 

docker ps -a  죽은 ps 까지 전부 볼 수 있다.

docker restart <CONTAINER ID> 컨테이너가 살아난다.

docker attach <CONTAINER ID> 해당 컨테이너의 shell로 이동

 

버전 관리 시스템과 도커

컨테이너를 지지고 볶고 삶고 데치고 하면 이미지는 어떻게 될 것인가?
당연히 이미지에는 아무런 변화도 생기지 않습니다. 도커에서 이미지는 불변 하는 저장 매체입니다.

하지만, 이미지 위에 무언가를 더해서 새로운 이미지를 만들어내는 일은 가능합니다.

Git

Git을 설치해보겠습니다.

apt-get install -y git

git --version

 

git diff 명령어처럼 docker diff 명령어로 부모 이미지와 여기서 파생된 컨테이너의 파일 시스템 간의 변경사항을 확인할 수 있습니다.

git diff <CONTAINER ID>

git commit <CONTAINER ID> ubuntu:git

 

DockerFile로 이미지 생성하고 어플리케이션 실행시키기

git 이 설치되어 있기 때문에

git clone https://github.com/nacyot/docker-moniwiki.git 

 

FROM ubuntu:14.04 # 어떤 이미지로부터 새로운 이미지를 생성할 지를 지정한다.
MAINTAINER Daekwon Kim <propellerheaven@gmail.com> # 생성-관리하는 사람 이름

# Install basic packages
RUN \ # RUN은 직접 쉘 명령어를 실행하는 명령어입니다.
  apt-get update &&\
  apt-get -qq -y install curl rcs

# Install php5 and apache2
RUN \
  apt-get -qq -y install apache2 php5 libapache2-mod-php5 &&\
  a2enmod rewrite

# Install Moniwiki
WORKDIR /tmp
RUN \ # 모니위키에 필요한 패키지들과 apache2서버, php 프로그램을 설치 및 설정해준다.
  curl -L -O http://dev.naver.com/frs/download.php/8193/moniwiki-1.2.1.tgz &&\
  tar xf /tmp/moniwiki-1.2.1.tgz &&\
  mv moniwiki /var/www/html/ &&\ 
  chown -R www-data:www-data /var/www/html/moniwiki &&\ # 여기서는 모니위키를 curl을 통해서 다운로드 받고, 압축을 풀고 모니위키 실행에 필요한 권한 관련 설정
  chmod 777 /var/www/html/moniwiki/data/ /var/www/html/moniwiki/ &&\
  chmod +x /var/www/html/moniwiki/secure.sh &&\
  /var/www/html/moniwiki/secure.sh

# 아파치 환경 변수 지정
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2

EXPOSE 80  # EXPOSE 가상 머신에 오픈할 포트지정
CMD bash -c "source /etc/apache2/envvars && /usr/sbin/apache2 -D FOREGROUND"
# CMD는 컨테이너에서 실행될 명령어를 지정해준다. 여기서는 아파치 서버를 FOREGROUND에 실행시킨다.

docker build -t nacyot/moniwiki . 

-t 플래그를 사용해 이름과 태그를 지정할 수 있습니다. 그리고 마지막에 . 은 빌드 대상 디렉토리를 가리킵니다.

위에서 정의한 RUN 명령 하나 하나는 명령 하나마다 이미지가 됩니다. 기본적으로 이 빌드를 통해서 생성되는 최종 이미지는
nacyot/moniwi가 됩니다만, docker images -a를 통해서 살펴보면 이름 없는 도커 이미지들이 다수 생성되는 것을 알 수 있습니다.

 

Dockerfile 설명

dockerfile을 통해서 배치화를 시켜두면 Dockerfile이라는 정말 작은 파일 하나로 어플리케이션 배포 환경을 구축할 수 있다는 장점이 있으며, 또한 쉽게 유연하게 사용할 수 있습니다.

dockerfile은 단순히 어플리케이션 설치를 스크립트로 만들어주는게 아니라, 배포환경 구축까지 한번에 해주는 역할을 합니다.

 

정리

docker 는 이미지를 pull 해서 가지고 있을 수 있습니다. (nginx, ubuntu, centos . . .)

ubuntu:12.04 처럼 버전관리를 할 수 있고, 컨테이너 안에서는 git 으로 버전관리도 가능합니다.

dockerfile은 도커를 세팅하고, 각종 연결 된 서버나 배포정보를 세팅하는데 유용하게 사용할 수 있습니다.

 

 

AWS ECS

클러스터(cluster)와 컨테이너 인스턴스(cluster instance)

ECS의 가장 기본적인 단위는 클러스터입니다. 클러스터는 도커 컨테이너를 실행할 수 있는 가상의 공간으로 이해할 수 있습니다.

클러스터는 프로젝트나 컨테이너의 성격에 따라서 나눠질 수 있습니다.

 

ECS 클러스터는 기본적으로 EC2와 같은 컴퓨팅 자원을 기본적으로 포함하고 있지 않은 논리적인 단위입니다.

따라서 컴퓨팅 자원이 없는 빈 클러스터를 만드는 것도 가능합니다. 그리고 EC2에 ecs-client라는 서비스를 실행해서 특정 클러스터에 연결할 수 있습니다. ecs-client는 컨테이너 인스턴스의 자원을 모니터링 및 관리하고, 클러스터로 요청된 컨테이너들을 적절하게 실행하는 역할을 합니다.

 

태스크 디피니션(task difinition)과 태스크(tast)

ECS 에서 컨테이너를 실행하는 최소 단위는 태스크 입니다.

태스크는 컨테이너와는 조금 차이가 있습니다. 태스크는 하나 이상의 컨테이너로 구성됩니다. 일반적으로 하나의 필수 컨테이너만으로 구성됩니다. 하지만 필요에 따라 하나의 필수 컨테이너와 n개의 추가적인 컨테이너 조합이 될 수도 있습니다. 이 때 같은 태스크로 실행되는 컨테이너들은 모두 같은 컨테이너 인스턴스에서 실행되는 것이 보장됩니다.

 

두 번째 방법은 서비스를 정의하는 방법입니다. 서비스는 하나의 태스크 디피니션과 연결됩니다.

서비스는 크게 리플리카 타입과 데몬 타입이 있습니다. 데몬타입으로 실행하는 경우 모든 컨테이너 인스턴스에 해당하는 태스크가 하나씩 실행됩니다. 이 타입은 인스턴스 관리를 위한 용도로 많이 사용됩니다. 리플리카 타입을 사용하면 실행하려는 태스크의 개수를 지정해야 합니다. 서비스는 클러스터에서 이 개수만큼 태스크가 실행되도록 자동적으로 관리해줍니다. 리플리카 타입은 웹서버를 비롯한 실제 서비스에서 주로 사용됩니다.

댓글

💲 추천 글