도커 안내서

서비큐라님의 초보를 위한 도커 안내서



Docker 치트 시트




초보를 위한 도커 안내서 - 도커란 무엇인가?   |   서비큐라 기술 블로그(한글)

가장빨리 만나는 Docker   |   Slideshare(한글), pyrasis.com(한글) - 클량 pyrasis님 

도커(Docker) 치트 시트   |   github(한글)

Docker 한글 문서 / 영상 모음집   |   documents.docker.co.kr(한글)

개발자가 처음 Docker 접할때 오는 멘붕 몇가지   |   POP it 김형준님(한글) 

컨테이너 오케스트레이션 기본 가이드 "도커 스웜모드, 퀴베르네시스, 메소스피어"   |   itworld(한글) 



Docker Network 구조

출처: http://bluese05.tistory.com/15 [ㅍㅍㅋㄷ]



Docker Network 구조

  1.  docker0와 container network 구조
  2.  Container network 방식 4가지

  3.  Container 외부 통신 구조

  4.  Container link 구조


[번역]시작하는 이들을 위한 컨테이너, VM, 그리고 도커에 대한 이야기


출처: https://medium.com/@jwyeom63/%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94-%EC%9D%B4%EB%93%A4%EC%9D%84-%EC%9C%84%ED%95%9C-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-vm-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EB%8F%84%EC%BB%A4%EC%97%90-%EB%8C%80%ED%95%9C-%EC%9D%B4%EC%95%BC%EA%B8%B0-3a04c000cb5c


*이 글은 Preethi Kasireddy의 A Beginner-Friendly Introduction to Containers, VMs and Docker를 번역한 글입니다. 모든 저작권과 권리는 Preethi에게 있습니다. 
*This article is a translated version of 
Preethi Kasireddy’s article: A Beginner-Friendly Introduction to Containers, VMs and Docker. All rights and credits back to her.
*최대한 이해하기 쉽도록 곳곳에 의역이 들어간 점 양해 부탁드립니다.
*도움이 되셨다면 Preethi의 원글에 clap 한번씩 부탁드립니다 :)

당신이 프로그래머이거나 IT 관련 일을 한다면, 도커(Docker)에 대해서 들어본 적이 있을 것이다. 애플리케이션을 포장하고, 옮기고, “컨테이너”들 안에서 실행할 수 있게 하는 유용한 툴- 최근 도커가 개발자와 시스템 관리자를 불문하고 관심을 끌어모으고 있는 것을 생각하면 당연한 일이다. 구글이나 VMware, 아마존 같은 거대한 회사들도 관련 서비스를 만들며 이러한 트렌드에 불을 붙이고 있다.

당신이 지금 바로 도커를 사용할 일이 있고 없고를 떠나서, “컨테이너”의 핵심 개념들, 그리고 버추얼 머신(VM)과의 차이에 대해서는 알아 둘 필요가 있다고 생각한다. 인터넷에 도커 사용법에 대한 훌륭한 가이드들은 많이 있지만, 개인적으로 아직 컨테이너란 무엇인가에 대한 초보자들을 위한 설명은 많이 보지 못했다. 이 글이 그 대안 중 하나가 되었으면 하는 바람이다 :)

그렇다면 VM과 컨테이너가 정확히 무엇인지부터 알아보도록 하자.

“컨테이너”와 “VM”은 무엇인가?

컨테이너와 VM은 비슷한 목적을 가지고 있다: 애플리케이션과 그 의존성들(dependencies)을 독립된 단위로 묶어 격리, 어디서든 실행 가능하게 하는 것.

또한, 컨테이너와 VM 모두 물리적 하드웨어의 필요성을 제거하여 컴퓨터의 자원을 에너지 면에서도, 그리고 비용 면에서도 보다 더 효율적으로 사용할 수 있게 해준다.

컨테이너와 VM의 결정적인 차이는 설계의 접근법에 있다. 조금 더 자세히 살펴보도록 하자.

Virtual Machines

VM은 기본적으로 컴퓨터의 에뮬레이션으로, 프로그램을 실제 컴퓨터처럼 실행한다. VM들은 “하이퍼바이저”를 통해 물리적 기계(machine) 위에서 돌아간다. 한편 하이퍼바이저는 호스트 머신이나 베어 메탈(bare metal *역: 소프트웨어가 전혀 담겨있지 않은 하드웨어)” 위에서 실행된다.

용어들이 어려우니, 조금 더 살펴보도록 하자.

하이퍼바이저란 VM이 실행되는 소프트웨어나 펌웨어, 혹은 하드웨어를 뜻한다. 하이퍼바이저들은 호스트 머신이라 불리는 물리적 기계 위에서 돌아가고, 호스트 머신은 VM에 램과 CPU 등의 자원을 제공한다.

이 자원들을 VM들이 분배 받아서 사용하는데, 사용자가 원하는 대로 할당할 수도 있다. 즉, 하나의 VM이 자원을 더 많이 필요로 하는 애플리케이션을 실행시키고 있다면, 같은 호스트 머신에서 돌고 있는 다른 VM들보다 더 많은 자원을 할당할 수도 있다는 뜻이다.

호스트 머신 위에서 하이퍼바이저를 이용하여 돌아가는 VM을 보통 게스트 머신(“guest machine”) 이라고도 부른다. 이 게스트 머신은 보통 그 애플리케이션을 실행하기 위한 모든 것(시스템 바이너리, 라이브러리 등)과 애플리케이션을 포함하며, 가상화된 네트워크 어댑터, 저장소, CPU등의 모든 하드웨어 스택도 포함한다. 즉, 자신 안에 또 하나의 온전한 게스트 운영체제를 가지고 있는 것이다.

내부에서 보면, 게스트 머신은 자신만의 자원을 할당받은, 하나의 독립된 유닛처럼 작동한다. 반면 외부의 시점에서 보면 이것은 호스트 머신의 자원을 다른 VM들과 공유하는 또 하나의 VM임을 알 수 있다.

이처럼 가상 머신은 hosted 하이퍼바이저(hosted hypervisor, *역: 호스트를 가진 하이퍼바이저. 타입 2 하이퍼바이저라고도 하는 듯 합니다), 혹은 bare-metal 하이퍼바이저(*역: 타입 1 하이퍼바이저라고도 불립니다)에 의해서 실행된다. 이 둘에는 중요한 차이가 있다.

첫 번째로, 호스트를 가진 하이퍼바이저는 호스트 머신의 운영체제 위에서 돌아간다. 예를 들어, OSX가 돌아가고 있는 컴퓨터의 VM(VirtualBox나 VMware Workstation 8 등)이 이것의 예시이다. VM은 직접 하드웨어에 접근할 수 없으며, 호스트 OS를 거쳐야 한다(위 예시의 경우에는 맥의 OSX).

Hosted 하이퍼바이저의 이점은 기본 하드웨어가 비교적 덜 중요하다는 것이다. 하이퍼바이저가 아닌 호스트의 OS가 하드웨어 드라이버들을 책임지기 때문에, “하드웨어 호환성”이 더 높다고 볼 수 있다. 다른 한편으로는 하드웨어와 하이퍼바이저 사이에 있는 이 부가적인 단계가 더 많은 리소스 오버헤드를 발생시키며, VM의 퍼포먼스를 떨어뜨릴 수 있다.

Bare metal 하이퍼바이저 환경은 위와 같은 퍼포먼스 이슈를 호스트머신의 하드웨어에 직접 설치, 실행함으로써 해결한다. 직접 하드웨어와 접촉하기 때문에 따로 호스트 OS가 필요없다. 이 경우에는 하이퍼바이저가 호스트 머신의 서버에 OS로서 처음 설치되는 것이 된다.

Hosted 하이퍼바이저와는 달리, bare-metal 하이퍼바이저는 자신만의 디바이스 드라이버를 가지고 입출력, 프로세싱, OS 관련 컴포넌트들과 직접 교류하여 처리한다. 이렇게 해서 더 나은 퍼포먼스, 확장성, 그리고 안정성을 가지게 된다. 대신 하이퍼바이저에는 제한된 숫자의 디바이스 드라이브가 설치 될 수 있으므로, 그만큼 하드웨어 호환성이 제한될 수 있다.

하이퍼바이저에 대해 여기까지 읽고 나면, 여러분은 왜 이 “하이퍼바이저”라는 추가적인 단계가 VM과 호스트 머신 사이에 필요한지가 궁금해졌을 것이다.

이는 하이퍼바이저가 VM들이 각자 자신의 가상 운영체제, 즉 게스트 운영체제를 실행하고 관리할 수 있게끔 돕는 중요한 역할과 더불어, 호스트 머신들이 자원들을 VM들에게 분배할 수 있도록 도와주는 일을 하기 때문이다.

Virtual Machine Diagram

위 그림에서 볼 수 있듯이, VM은 가상 하드웨어, 커널(OS 등), 그리고 유저 공간(space)를 포함한다.

컨테이너

하드웨어의 가상화를 제공하는 VM과는 달리, 컨테이너는 유저 공간(user spcae)의 추상화를 통해 운영체제 레벨의 가상화를 제공한다. 이게 무슨 뜻인지는 컨테이너라는 용어를 좀 더 분석해보면 알 수 있다.

비슷한 목적을 가지고 있는 만큼, 컨테이너는 VM과 흡사해 보인다. 컨테이너도 VM처럼 프로세싱을 위한 별도의 공간(private space), 루트 권한, 사설 네트워크, IP 주소, 커스텀 라우트 / iptable 규칙, 파일 시스템 마운트 등의 기능을 갖추고 있다.

하지만 컨테이너는 호스트 시스템의 커널을 다른 컨테이너들과 공유한다는 점에서 크게 차이가 난다.

Container Diagram

이 그림에서 볼 수 있듯이, 컨테이너는 유저 공간만을 포함하고, VM에는 포함되는 커널이나 버추얼 하드웨어가 포함되지 않는다. 여러개의 컨테이너가 하나의 호스트 머신에서 돌아갈 수 있도록 각 컨테이너는 자신만의 격리된 유저 공간을 가지고 있다. 즉, 운영체제 단계의 아키텍처를 모든 컨테이너가 공유하고 있는 것이다. 처음부터 새로 생성되는 부분은 bins와 libs 뿐이며, 이것이 컨테이너가 한결 가벼워질 수 있는 이유이다.

도커는 그럼 무슨 역할을 하는가?

도커는 리눅스 컨테이너를 기반으로 하는 오픈소스 프로젝트다. 네임스페이스, 컨트롤 그룹과 같은 리눅스 커널 기능을 이용해서 운영체제 위에 컨테이너들을 생성하는 것이다.

컨테이너는 새로운 개념이 아니다. 구글은 자신들만의 컨테이너 개념을 몇 년째 이용해 왔다. Solaris Zones, BSD jails, LXC를 비롯한 다른 리눅스 컨테이너 기술들도 이미 오랫동안 존재해 왔다.

그렇다면 왜 갑자기 도커가 이목을 끌기 시작한 것일까?

  1. 간편한 사용법: 도커는 개발자, 시스템 관리자, 아키텍트 등 누구든지 컨테이너의 이점을 이용해서 손쉽게 이동성 있는 애플리케이션을 생성, 테스트 할 수 있도록 만들어졌다. 누구든 애플리케이션을 자신의 랩탑에서 간단히 패키징하고, 공용 클라우드, 개인용 클라우드, 혹은 bear metal에서 보존된 상태의 애플리케이션을 실행해 볼 수 있도록 해주는 것이다. “한번의 빌드로 어디에서든 실행하자”라는 마법의 주문인 것이다.
  2. 속도: 도커는 매우 가볍고 빠르다. 컨테이너는 커널에서 돌아가는 샌드박스화된 환경일 뿐이어서, 더 적은 자원을 소비한다. 매번 하나의 완전한 가상 운영체제를 부팅해야하는 VM과는 달리, 도커 컨테이너는 몇 초면 실행시킬 수 있다.
  3. 도커 허브(Hub): 도커 허브는 “도커 이미지들의 앱스토어” 같은 일종의 도커 생태계로, 유저들이 자유롭게 사용할 수 있다. 도커 허브에는 커뮤니티에 의해 생성되어 바로 사용 가능한 수만개의 이미지들이 있고, 아주 쉽게 필요한 이미지를 찾을 수 있을 뿐만 아니라 약간의 수정 혹은 수정 없이 바로 사용할 수 있다.
  4. 모듈성(modularity)과 확장성(scalability): 도커는 어플리케이션의 기능들을 각각의 컨테이너들로 쉽게 분리할 수 있도록 해준다. 예를 들어, 여러분이 Postgres 데이터베이스를 하나의 컨테이너에서 돌리고 다른 하나에서는 Redis 서버를, 그리고 또 하나에서는 Node.js앱을 실행시키고 있다고 가정해보자. 도커를 이용하면 이 컨테이너들을 연결하여 애플리케이션을 만들 수 있다. 각각의 컴포넌트에 대해서 따로 업데이트를 하거나 스케일링을 하기 쉬워지는 것이다.

마지막으로, 도커 고래가 싫다 할 사람이 어디 있겠는가? ;)

Source: https://www.docker.com/docker-birthday

도커 기본 개념들

도커에 대한 큰 그림은 살펴보았으니, 도커의 기반이 되는 부분들을 하나하나 살펴보도록 하자.

도커 엔진

도커가 실행되는 레이어. 컨테이너, 이미지, 빌드 등을 관리하는 경량 런타임이자 도구로서, 리눅스 시스템에서 돌아가고 다음과 같이 구성되어 있다.

  1. 호스트에서 돌아가는 도커 데몬(daemon)
  2. 도커 데몬과 통신하여 명령어를 실행하는 도커 클라이언트
  3. 도커 데몬과 원격으로 교류하는 REST API

도커 클라이언트

도커 클라이언트는 도커의 엔드 유저(end-user *역: 마지막 단계의 사용자)인 여러분이 사용하는 부분이다. 도커의 UI라고 보면 된다. 예를 들어, 이렇게 실행하면

여러분은 도커 클라이언트에게 명령어를 전달하고, 도커 클라이언트는 받은 명령을 도커 데몬에게로 전달한다.

도커 데몬

도커 데몬은 빌드, 실행, 배포(distribute) 등을 비롯하여 사용자가 도커 클라이언트에게 보낸 명령어를 실행한다. 도커 데몬은 호스트 머신에서 돌아가지만, 유저들이 도커 데몬과 직접적으로 접하는 경우는 없다. 도커 클라이언트도 호스트 머신에서 실행되기는 하지만, 필수적으로 그렇지는 않다. 도커 클라이언트는 다른 머신에 있는 동안에도 호스트 머신에서 돌아가는 도커 데몬과 소통하는 것이 가능하다.

도커파일(Dockerfile)

도커파일은 도커 이미지를 생성할 지시 사항들을 작성하는 파일이다. 예시로는 다음과 같은 항목들이 있을 수 있다.

  • RUN apt-get y install some-package: 패키지 설치
  • EXPOSE 8000: 포트 노출
  • ENV ANT_HOME /usr/local/apache-ant: 환경변수 전달

일단 도커파일을 설정하고 나면, 도커 빌드 커맨드를 통해 이미지를 생성할 수 있다. 다음은 도커파일의 예시이다.


# Start with ubuntu 14.04
FROM ubuntu:14.04
MAINTAINER preethi kasireddy iam.preethi.k@gmail.com
# For SSH access and port redirection
ENV ROOTPASSWORD sample
# Turn off prompts during installations
ENV DEBIAN_FRONTEND noninteractive
RUN echo "debconf shared/accepted-oracle-license-v1-1 select true" | debconf-set-selections
RUN echo "debconf shared/accepted-oracle-license-v1-1 seen true" | debconf-set-selections
# Update packages
RUN apt-get -y update
# Install system tools / libraries
RUN apt-get -y install python3-software-properties \
software-properties-common \
bzip2 \
ssh \
net-tools \
vim \
curl \
expect \
git \
nano \
wget \
build-essential \
dialog \
make \
build-essential \
checkinstall \
bridge-utils \
virt-viewer \
python-pip \
python-setuptools \
python-dev
# Install Node, npm
RUN curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -
RUN apt-get install -y nodejs
# Add oracle-jdk7 to repositories
RUN add-apt-repository ppa:webupd8team/java
# Make sure the package repository is up to date
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
# Update apt
RUN apt-get -y update
# Install oracle-jdk7
RUN apt-get -y install oracle-java7-installer
# Export JAVA_HOME variable
ENV JAVA_HOME /usr/lib/jvm/java-7-oracle
# Run sshd
RUN apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo "root:$ROOTPASSWORD" | chpasswd
RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config
# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
# Expose Node.js app port
EXPOSE 8000
# Create tap-to-android app directory
RUN mkdir -p /usr/src/my-app
WORKDIR /usr/src/my-app
# Install app dependencies
COPY . /usr/src/my-app
RUN npm install
# Add entrypoint
ADD entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
CMD ["npm", "start"]
view raw Dockerfile hosted with ❤ by GitHub
샘플 도커파일

도커 이미지

이미지들은 Docker file의 지시사항을 기준으로 생성하는 read-only 템플릿이다. 이미지는 패키지화된 애플리케이션과 의존성들과 더불어 실행시에 어떤 프로세스를 실행할지를 정의한다.

도커 이미지는 도커파일을 통해서 생성된다. 도커파일 안의 각 지시 항목은 이미지에 새로운 “레이어”로서 이미지에 추가된다. 각 레이어는 이미지 파일 시스템을 구성하고, 새로 추가 되거나 기존 레이어를 교체한다. 도커의 가벼우면서도 강력한 구조의 핵심에는 이 레이어 방식이 있다. 도커는 이것을 실현하기 위해 Union File System을 이용한다.

Union File Systems

도커는 Union File System을 이용해서 이미지를 생성한다. Union File System은 스택으로 쌓을 수 있는 파일 시스템이라고 볼 수 있다. 서로 다른 파일 시스템(브랜치(branch)라고도 알려져있다)의 파일과 디렉토리가 서로 겹쳐져서 하나의 파일 시스템을 구성하게 된다는 뜻이다.

이렇게 중첩되어 있는 브랜치들 중에서 같은 경로를 가지고 있는 디렉토리들의 내용은 하나의 합쳐진 디렉토리로 인식된다. 즉, 각각의 레이어에 따라 별도의 버전을 따로 만들지 않아도 되는 것이다.

그 대신 동일한 자원으로 향하는 포인터를 배정받고, 특정 레이어가 수정된다면 그 때 로컬 카피를 생성, 수정함으로서 원본은 그대로 유지한다.

이렇게 해서 파일시스템이 실제로는 수정될 수 없는데도 writable인것(*역: 수정 가능한 것) 처럼 보여줄 수 있는 것이다. (한마디로 “copy-on-write”(*역: 수정이 일어나면 카피를 생성하는)시스템이다)

레이어드 시스템에는 두가지의 이점이 있다

  1. duplication-free(*역:이중화 회피) : 레이어들로 이루어져 있다는 것은 새로운 컨테이너를 시동할때마다 전체 파일을 모두 복사하지 않아도 된다는 뜻과 같다. 즉, 도커 컨테이너들의 인스턴스화를 적은 비용으로 매우 빠르게 할 수 있도록 해 준다.
  2. Layer segregation(*역: 레이어 분리) : 하나의 이미지를 변경하면 도커가 그 수정사항을 해당 레이어에만 반영하도록 하기 때문에 변경사항이 더 빠르게 반영된다.

Volumes

볼륨은 컨테이너의 ‘데이터’ 부분으로, 컨테이너 생성시 초기화된다. 볼륨은 컨테이너의 데이터를 유지하고 공유할 수 있도록 한다. 데이터 볼륨은 기본 Union File System과는 별도로, 일반 디렉토리/파일들로 호스트의 파일 시스템에 존재한다. 즉, 컨테이너를 파괴, 수정, 재생성 하더라도 데이터 볼륨은 그대로 유지된다. 볼륨을 수정하고 싶을 때는 직접 수정해야한다 (데이터 볼륨은 여러 대의 컨테이너가 공유, 재사용 할 수 있도 있다).

도커 컨테이너

도커 컨테이너는, 이미 위에서 설명한대로 애플리케이션과 해당 애플리케이션이 실행되기 위해 필요로 하는 모든 것들을 하나로 묶은 것이다. 이는 운영체제, 애플리케이션 코드. 런타임, 시스템도구, 시스템 라이브러리 등을 모두 포함한다. 도커 컨테이너는 도커 이미지로부터 만들어지는데, 이미지들은 read-only이므로 도커는 read-write 파일 시스템을 이 read-only 파일 시스템 위에 얹어서 컨테이너를 생성한다.

Source: Docker

또한, 도커는 컨테이너가 로컬호스트와 통신할 수 있도록 네트워크 인터페이스도 생성하고, IP 주소를 컨테이너에 붙인 후, 개발자가 이미지 정의 단계에서 지정한 프로세스에 따라 애플리케이션을 실행한다.

컨테이너를 성공적으로 생성했다면, 이제 부가적인 수정 없이 어느 환경에서든 애플리케이션을 실행할 수 있다.

컨테이너 조금 더 알아보기

휴! 정말 많은 것들을 살펴보았다. 나는 항상 컨테이너가 어떻게 설계된 것인지, 특히 추상적 인프라 경계도 없이 어떻게 구현된 것인지 궁금했다. 많은 문서를 보고 나서야 이해를 하게 되었고, 여러분들에게 설명을 시도해 보려고 한다 :)

“컨테이너”는 사실상 추상적 개념으로, 몇 가지 기능의 집합체가 컨테이너처럼 작동하는 것을 상상할 수 있게끔 만들어진 개념이다. 어떤 기능들이 여기에 포함되는지 빠르게 살펴보자

1) 네임스페이스(Namespaces)

네임스페이스는 컨테이너들이 배경 리눅스 시스템에 대해 인식/접근할 수 있는 것에 제한을 건다. 컨테이너를 실행시키면, 도커가 해당 컨테이너가 사용할 네임스페이스를 생성한다.

도커가 사용하는 네임스페이스에는 몇가지 종류가 있다. 다음은 몇몇 예시이다:

a. NET: 네트워크 스택에 대해 해당 컨테이너가 볼 수 있는 것들을 지정한다. (네트워크 디바이스, IP 주소, 라우팅 테이블, /proc/net 디렉토리, 포트 번호 등)

b. PID: Process ID: PID는 Process ID의 줄임말이다. 어떤 프로세스가 현재 시스템에서 실행되고 있는지 확인하기 위해 ps aux 명령어를 실행시켜본 적이 있다면, PID라는 항목을 본 적이 있을 것이다. PID 네임스페이스는 컨테이너가 보고 교류할 수 있는 프로세스 항목들을 지정한다. 이는 “모든 프로세스들의 조상” 인 PID 1도 포함한다.

c. MNT: 컨테이너에게 시스템의 mount들(*역: 기존의 파일시스템에 부착된 추가 파일 시스템)에 대한 접근 범위를 지정한다. 즉, 서로 다른 마운트 네임스페이스는 파일시스템 계층에 대하여 다른 시야를 갖는다.

d. UTS: UTS는 UNIX Timesharing System의 줄임말이다. 프로세스가 시스템 식별자(system identifier)들을 인식하게 해주는 역할을 하는데, 즉 컨테이너가 호스트 시스템이나 다른 컨테이너들로부터 독립된 호스트명과 NIS 도메인명을 가질 수 있도록 한다.

e. IPC: InterProcess Communication이 줄임말이다. IPC 네임스페이스는 각각의 컨테이너에서 돌아가는 프로세스들의 IPC 리소스들을 격리시켜주는 역할을 한다.

f. USER: 이 네임스페이스는 각각의 컨테이너의 유저들을 서로에게서 분리시키는 역할을 한다. 컨테이너들이 uid(user ID)와 gid(group ID)에 대해 서로 다른 영역을 볼 수 있게 해준다. 결과적으로, 프로세스의 uid와 gid는 유저 네임스의 안과 밖이 서로 다를 수 있다. 이는 하나의 프로세스가 컨테이너 내부의 루트 권한을 희생하지 않고 컨테이너 외부에는 권한이 없는 유저를 가질 수 있도록 해 준다.

도커는 이 네임스페이스들을 사용해서 컨테이너를 격리하고, 새롭게 생성할 수 있도록 해준다. 다음 소개할 기능은 컨트롤 그룹이다.

2) 컨트롤 그룹

컨트롤 그룹(cgroup이라고도 한다)은 각 프로세스들이 어떻게 자원(CPU, 메모리, 디스크 입출력, 네트워크 등)을 사용할 것인지 정하는 리눅스 커널 기능이다. cgroup은 도커 컨테이너가 필요한 자원만 사용하도록 제어한다. 다르게 말하면 필요한 경우에는 컨테이너가 사용할 수 있는 자원의 한도도 지정한다. cgroup은 하나의 컨테이너가 과도하게 많은 자원을 사용하여 시스템이 중단되는 경우도 미리 방지한다.

마지막으로, union file system이 도커가 사용하는 또 다른 기능이다.

3) Isolated Union File System

위의 도커 이미지 부분에서 언급했던 Union File System을 참조하면 된다 :)

이 세가지가 도커 컨테이너를 구성하는 전부이다 (물론 진짜 어려운 부분은 여러 컴포넌트 사이의 상효 작용 등을 어떻게 구현하는가 등의 부분이기는 하다).

도커의 미래: 도커와 VM의 공존

도커가 분명 많은 주목을 받고 있기는 하지만, VM을 위협하는 존재가 될 것 같지는 않다. 컨테이너는 계속해서 더 많은 곳에서 사용되겠지만, VM이 더 필요한 케이스도 많이 있다.

예를 들어, 여러 대의 서버에 여러 개의 애플리케이션을 돌려야 한다면, VM을 쓰는 편이 나을 것이다. 한편 한개의 애플리케이션을 기반으로 한 여러 개의 카피들을 실행해야 할 경우에는 도커가 더 훌륭한 선택지일 것이다.

또한, 컨테이너들이 애플리케이션을 여러개의 기능 위주의 조각들로 나눌 수 있게 해준다는 것은 관리해야 할 부분이 많아진다는 뜻이기도 하다.

보안 문제 역시 도커 컨테이너를 사용할 때 우려되는 부분 중에 하나이다. 컨테이너들은 같은 커널을 공유함으로, 컨테이너 사이에 장벽이 약한 편이다. 또, VM이 호스트 하이퍼바이저에게 hypercall만을 보낼 수 있는 반면, 도커 컨테이너는 호스트 커널에 syscall만을 할 수 있어서 공격에 노출되는 부분이 더 넓어지게 된다. 보안이 굉장히 중요한 경우에는 추상화된 하드웨어로써 완전히 격리되는 VM을 선택하여 서로 영향을 줄 확률을 낮추는 것이 적합할 수 있다.

물론, 보안과 관리 문제들은 컨테이너들이 프로덕션 단계를 여러번 거치고 유저들의 관찰이 쌓이면서 더 개선될 것이다. 컨테이너냐 VM이냐에 대한 이슈는 당장은 매일같이 이 도구들을 사용하는 데브옵스들에게 맡겨두어도 좋을 듯 하다.

마치며

여러분들이 이제는 언젠가 프로젝트에서 필요할지도 모르는 도커에 대한 지식들을 갖추게 되었기를 바란다.

언제나 그랬듯이, 내가 무언가 실수를 했거나 도움이 될 수 있는 방법이 있다면 댓글로 남겨주면 감사하겠다 :)


번역을 마치며

저에게는 낯선 개념이지만 반드시 한번은 짚고 넘어가야 할 개념이라 생각하고 번역해 보았습니다^^; 용어도 쉽지 않고 개념도 녹록치 않아 평소보다 시간도 노력도 많이 들어갔지만 많은 분들께 도움이 되었으면 좋겠네요.
혹 오타나 문제가 발견되었다면 댓글로 남겨주시면 수정하겠습니다.

부족한 번역 읽어주셔서 감사합니다. 도움이 되신 분들은 원글에 한번씩 clap 부탁드립니다 :)


도커 사용 후기

출처 : 

http://blog.naver.com/ktw5724/220899692550


2017년 1월 1일 일요일

도커로 배포 시스템을 구성하고 운영해 온지 이제 3달쯤 되어간다.
아직 개선해야 할 부분들이 많이 남아있긴 하지만 일단 지금까지의 과정들을 돌이켜보자.

"도커라는게 있다"라고 들어본 것은 몇년전이었는데 그냥 그런게 있나보다 하고 잊고 살고 있었다.
그러다가 개발중인 프로젝트의 배포 시스템을 구축해야 했고, 개발자 친구가 도커 얘기를 꺼내서 도커의 사용을 고민하게 되었다.
처음에는 일단 배포 시스템을 심플하게 구성하기 위해 도커를 사용하지 않으려고 했다.
장고로 리셋하기 전에 사용했던 프레임웍이 PHP Codeigniter였는데, 이때는 배포 방식이 "매우 심플"했다.
서버의 crontab에서 매분 git pull을 하는 방식이었던 것이다.
브랜치가 master와 dev 두개였고, 운영서버는 master를 향해 매분 git pull을 하고, 테스트서버는 dev를 향해 매분 git pull을 했다. 
변경한 코드를 dev에 push하면 테스트서버에 반영되고, dev에서 master로 merge하면 실서버에 배포되는 식이다.
다른 개발자 동료가 이 아이디어를 냈을때, 처음에는 뭔가 문제가 있을거라 생각하고 문제점을 찾으려고 애썼다.
그런데, 생각보다 별다른 문제가 없어서 당시 시스템에 적용했고, 실제로 별다른 문제가 없었다.
그래서 장고 배포 시스템도 이처럼 심플하게 배포할 수 있는 방법을 먼저 고민해 봤다.

그런데 심플한 배포 시스템의 구축에 몇가지 장애물들이 있었다.
1) 환경변수의 분리
aws secret key와 같은 값들은 보안 이슈로 소스 코드 내에 담지 않기로 했고, 운영/테스트/개발 환경에 따라 달라지는 값들도 소스코드 내에서 분기처리 하지 않고 환경변수로 받아서 서버 기동시 settings에 저장하기로 했다. 그래서 배포후 서버 기동 전에 해당 환경변수를 셋팅하기 위해 스크립트를 실행하는 과정이 추가되어야 했다.
2) 장고 + Gunicorn + Nginx 구조에서 서버 재시작 문제
장고의 내장 서버(python manage.py runserver)를 사용할 때는 소스코드가 변경되면 바로 서버가 재시작 되지만, 내장 서버는 개발환경용이지 운영환경용은 아니다. 그래서 장고에 Gunicorn과 Nginx를 붙였는데, 이 구조에서는 배포 후 서버 재기동이 필요했다.
3) db migrate 와 collectstatic
장고는 개발자가 서비스를 개발함에 있어서 필요한 것들을 최대한 자신의 컨텍스트 안에서 해결할 수 있도록 하고자 한다. db table을 생성하거나 column을 변경하거나 하는 것을 프로젝트의 models 안에서 정의한후 manage.py를 실행하여 db에 적용하고(python manage.py makemigrations 실행하여 마이그레이션 파일을 생성하고, python manage.py migrate 실행하여 db에 적용), 개발하면서 프로젝트에 추가된 이미지 파일들을, 프로젝트에서 지정한 운영환경용 파일서버(aws s3 등)에 반영하는 것도 manage.py에서  해준다.(python manage.py collectstatic 실행)
따라서, 배포시 서버 재시작 전에 db가 변경된 경우 migrate를 해줘야 하고 정적 파일이 변경/추가된 경우 collectstatic을 해줘야 한다.
4) pip install
라이브러리가 추가된 경우, 배포시 서버 재시작 전에 pip install 을 해줘야 한다.

이러한 문제들 때문에 당연히도 완전 심플했던 이전의 배포 방식은 고수할 수가 없었다.
위의 문제들을 고려해 보니 결국 배포 서버와 같은 배포의 주체가 필요하고 원격으로 대상 서버들이 필요한 동작들을 실행하도록 해야한다는 결론이 나왔다. 그래서 일단은 aws ec2 인스턴스에 우리 서비스가 돌아가는 운영환경을 만들고, 배포 스크립트를 작성한 후, 나의 개발 PC 또는 배포서버에서 원격으로 해당 스크립트를 실행하는 방식으로 구성해 보기로 했다.

그런데, 운영서버를 셋팅하는 과정이 생각보다 간단하지 않았다.
소스를 가져오기 위해 git을 설치해야했고, 환경변수를 셋팅하는 스크립트 파일을 소스와는 별도로 배포해줘야 했고, 정상적으로 서버가 실행되도록 하기 위해 추가적으로 리눅스 모듈들을 설치해줘야 했고, gunicorn과 nginx도 설치 및 설정을 해줘야 했다. 이 과정은 시행착오도 상당히 많았고 그래서 시간도 꽤 오래 걸렸다. 그래서 이 과정을 기록해 두기 위해 정리하다보니 문득 도커가 떠올랐다. 이 과정을 다시 되풀이해야 하는 상황이 되었을 때 또 일일이 이 과정들을 반복해야할까? OS 버전이 바뀌거나 하는 등의 변화가 생겼을때 잘 된다는 보장이 있을까? 이러한 생각을 하다보니, "이제 도커를 학습할 이유가 생겼다" 싶었다.

도커 학습을 위해 먼저 위 링크에 오픈된 책을 읽었다.
아주 대강 요약해 보면,
1) 이미지 생성과 배포에 특화된 기술이다.
2) 기존의 가상화 방식은 게스트OS와 호스트OS 사이에 하이퍼바이저와 같은 중간 단계가 있기 때문에 성능이 떨어지는데, 도커는 리눅스의 컨테이너 기술을 이용하여 성능 하락이 거의 없다.
3) git처럼 이미지의 버전 관리가 가능하고, 이미지 생성시 통째로 생성하는 것이 아니라 이전 이미지를 참조하여 바뀐 부분만 생성하기 때문에 기존의 이미지 생성 방식보다 효율적이다.
4) 이미지는 Dockerfile을 기반으로 생성되고, 이미지를 실행한 상태를 컨테이너라 한다.
5) 공개된 이미지 저장소로 DockerHub가 있고, 자체적으로 저장소를 구축할 수 있다. DockerHub는 GitHub과 마찬가지로 공개 저장소일때는 무료, 개인 저장소로 사용하려면 유료이다.

위의 책을 읽고 나서 대강 도커가 뭐구나 하는 감은 잡혔지만, github과 aws autoscaling을 사용하려는 상황에서 어떻게 구축해야 할지는 여전히 막막한 부분이 있었다. 그래서 책을 한권 사서 읽었다.

위 책을 통해서 추가로 알게된 내용들을 대강 요약해 보면,
1) 도커도 클라이언트/서버 모델이다.
2) 다양한 오케스트레이션 도구들이 있다.
3) 저장볼륨, CPU 등에 대해 다양하게 제한 및 설정을 할 수 있다.

이 책을 통해서 해답을 얻었다 싶었다. 도커의 클라이언트/서버 모델을 이용해서 autoscaling되는(확장 가능한) 시스템을 구현할 수 있도록 해주는 오케스트레이션 도구들이 있었다. 그 중에서 눈에 띈 것이 도커 스웜과 aws ecs(ec2 container service)였는데, 아무래도 현재의 상황이 aws ec2를 사용하고 aws autoscaling으로 서버 확장을 구현하려는 상황이기 때문에 aws ecs를 사용하는 것이 최선이라고 생각했다.

aws ecs 화면에 들어가서 튜토리얼을 시작하면, 도커 이미지 저장소 및 클러스터와 태스크 정의를 생성한다. 클러스터는 생성되는 ec2 인스턴스들의 그룹을 의미하고, 태스크 정의는 ec2의 생성 등을 컨트롤하는 작업 지시서와 같은 것이다. 뭔가 굉장히 복잡한데, 그래도 시키는대로 다하면 뭔가 꿀 같은 결과가 기다리고 있을 것이라 기대하면서 한 세트를 구성했다. 그리고 태스크를 실행하니, 오~ ec2가 생성되고 서버도 잘 뜬다. 그런데, 소스코드를 수정하고 재배포를 하려고 하니 어떻게 하는지를 확인할 수 없었다. 문서를 꽤나 꼼꼼히 읽어봤는데도 해당 내용을 찾지 못했고, 검색을 해보면 ecs 관련 문서가 별로 없어서 도움이 되지 않았다. 새로 빌드한 이미지를 push하면 aws에서 그것을 hook하여 배포를 다시 해줄 것이라 예상했지만, aws는 그렇게 자비롭지 않았다. 그래서 일단은 어떻게든 해보려고 현재 실행중인 태스크를 중지 시켜보니 자동으로 다시 태스크를 실행하면서 배포가 다시 되기는 했다. 하지만 이게 정상적인 방식은 아닌 듯 했고, 답답한 마음에 페이스북의 AWS 한국 사용자 그룹에도 관련 문의를 올려봤는데, 답변들이 신통치 않았다. 지금 이게 맞게 하는 방식이라는 것이었는데 신뢰가 가지 않았다. 태스크를 중지하면 실행중이던 ec2가 종료 되고, 새로 시작되는 태스크에 의해서 ec2가 다시 생성되었다. 그리고 autoscaling과 연계도 제대로 되지 않았다. 태스크는 ec2 한대를 생성하도록 되어 있는데 autoscaling에 의해 ec2가 2대가 된 상태에서 태스크를 종료하면 실행중이던 2대가 종료되고 1대가 새로 생성되었다. 이건 아니다 싶었다. 

도커 스웜을 써볼까도 생각해 봤지만 결국은 추가되는 개념이 최소화 되도록 하는게 좋겠다고 생각했다. 지금은 도커도 제대로 모르는데 그것의 확장 개념들까지 한방에 이해하려 하는 건 아무래도 부담스러웠다. 그래서 생각한 구조가 현재 운영중인 배포 구조이다.
크게 보면 매우 심플하고 이미 잘 알려진 방식이다.
1) 배포서버에서 배포할 도커 이미지를 생성한다.
2) 생성한 도커 이미지를 저장소에 push 한다.
3) 배포 대상 서버에서 도커 이미지를 저장소로부터 pull 한다.
4) 기존 컨테이너를 stop 하고 해당 이미지로 컨테이너를 run 한다.

그런데 구체적으로 쪼개 보면 풀어야할 문제들이 꽤 있었다.
1) 운영/테스트/개발 환경의 구분은 어떻게 할까?
 => 도커 이미지 자체는 환경과 독립적이고, 컨테이너를 실행할때 환경 구분값을 넘겨서 환경 변수 적용 스크립트를 실행한다.
2) 빌드된 이미지들은 어떻게 구분할까? 어느 시점에 빌드된 이미지인지 어떤 식으로 확인할 수 있을까?
 => 빌드할 도커 이미지의 태그를 github의 commit hash값으로 넣는다.
3) 도커 이미지 저장소는 어떻게 할까? DockerHub에서 비공개 저장소 사용하려면 유료인데..
 => aws ecs에서 제공하는 저장소를 사용한다.
4) auto scaling group에 있는 ec2 인스턴스들의 IP를 어떻게 실시간으로 알 수 있을까?
 => aws ec2 describe-instances 명령을 실행하여 autoscaling group의 인스턴스 정보들을 가져와서 사용한다.
5) pip install, migrate, collectstatic 은 매번 배포때마다 해야되는걸까? 시간이 너무 오래 걸리는데..
 => pip install은 라이브러리가 추가되었을때만 실행하면 되고, migrate는 DB 모델이 변경되었을때, collectstatic은 이미지/css/js 등이 변경 및 추가되었을때 실행하면 된다. 즉, 각각은 실행될 타이밍이 다르므로 배포시 선택하여 실행할 수 있도록 하면 된다.
6) 이미지를 생성해 보니, 서버 라이브러리 설치, 파이썬 라이브러리 설치, 소스코드 최신화 및 이미지에 복사 등을 하는데 시간이 너무 오래 걸린다.
 => 도커 이미지를 서버와 언어 설정만 된 이미지, 환경변수 적용 및 라이브러리 설치하는 이미지, 소스코드 적용하는 이미지로 구분하여 빌드한다. 서버 라이브러리 또는 환경변수 또는 파이썬 라이브러리가 변경된 경우가 아니라면 세번째 이미지만 빌드하면 된다.
7) rollback은 어떻게 할까?
 => 현재 컨테이너를 종료하고 이전 이미지로 컨테이너를 실행하면 된다.

이제 작업했던 과정을 좀 더 구체적으로 정리해 보자.

1) DockerHub에 python2.7.12, django, nginx를 셋팅한 이미지를 저장한다.
python, django, nginx 셋팅은 우리 회사의 서비스와는 독립적인 부분이기 때문에 개인 저장소에 올릴 필요가 없다고 판단하여 DockerHub 공개저장소에 저장했고, Dockerfile의 내용은 아래와 같다.

FROM ubuntu:latest

RUN apt-get update
RUN apt-get install -y apt-utils python2.7 python-pip python-dev build-essential libpq-dev libncurses5-dev libtiff5-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev python-tk nginx git supervisor vim

2) 위의 이미지로부터 nginx 설정, 파이썬 라이브러리 설치, 환경변수 적용 및 배포를 위한 스크립트를 이미지로 카피하는 등의 과정을 통해 베이스 이미지를 빌드하여 aws ecs의 저장소에 저장했고, Dockerfile의 내용은 아래와 같다.

FROM tedkim/python27-django-nginx:latest

# nginx settings
RUN rm /etc/nginx/sites-available/default && \
    rm /etc/nginx/sites-enabled/default
COPY [my nginx.conf path] /etc/nginx/sites-available/
RUN ln -s /etc/nginx/sites-available/[my nginx.conf name] /etc/nginx/sites-enabled/

# supervisor settings
RUN mkdir -p /var/log/supervisor
COPY [my supervisord.conf path] /etc/supervisor/conf.d/

# log settings
COPY [my log_files.yml path] /etc/
COPY [my remote_syslog path] /usr/local/bin/

# make directory and shell files copy
RUN mkdir -p [my source code path]
COPY [환경변수 적용하는 script path] [my source code path]
COPY [배포시 실행되는 script path] [my source code path]
COPY [배치작업 실행시 실행되는 script path] [my source code path]

# install dependencies
COPY requirements.txt [my source code path]
RUN pip install -r [my source code path]/requirements.txt

3) 위의 베이스 이미지로부터 소스코드 카피 및 배포 스크립트 실행을 하는 최종 이미지를 빌드하여 aws ecs의 저장소에 저장했고, Dockerfile의 내용은 아래와 같다.

FROM [aws ecs repository url]/[base image name]:[tag name]

# source code copy
COPY . [my source code path]

# nginx and gunicorn start by supervisor
EXPOSE 80
CMD /bin/bash [배포시 실행되는 script path]

4) 배포시 실행되는 script
# 도커 이미지 안에 카피된 script로서, 배포시 도커 컨테이너가 시작될때 호출된다.
# supervisord가 gunicorn 및 nginx를 실행시켜준다.

#!/bin/bash
remote_syslog
source [my source code path]/[환경변수 적용하는 script]
supervisord

5) 환경변수 적용하는 script
# 도커 이미지 안에 카피된 script로서, 배포시 도커 컨테이너에서 서버를 구동시키기 전에 호출된다.
# 내용은 대강 아래와 같은 형태이다.

#!/bin/bash

if [[ "$RUN_TYPE" == "" || "$1" != "" ]]; then
RUN_TYPE="$1"
fi

# RUN_TYPE: dev / test / prod
if [[ "$RUN_TYPE" == "dev" ]]; then
    export XXX=XXX
    ...
elif [[ "$RUN_TYPE" == "test" ]]; then
    export XXX=XXX
    ...
else
    export XXX=XXX
    ...
fi

export XXX=XXX
...

6) 배치작업 실행시 실행되는 script
# 배치작업은 배포서버 ec2 인스턴스의 crontab 에서 도커 컨테이너의 장고 command를 호출하는 방식을 사용한다.
docker exec [도커 이미지명] /bin/bash [my source code path]/[배치작업 실행시 실행되는 script] [장고 command]

# 배치작업 실행시 실행되는 script의 내용은 아래와 같다.
#!/bin/bash
cd [my source code path]
source [환경변수 적용하는 script] [RUN_TYPE]
python manage.py $1

7) 배포 명령 script
# 운영서버에 있는 script로서, 배포서버로부터 배포지시를 받는다. 내용은 아래와 같다.
#!/bin/bash
aws ecr get-login --region [리전명] | sh
docker tag [도커 이미지명:latest] [도커 이미지명:old]
docker pull [도커 이미지명:latest]
docker rm $(docker stop $(docker ps | grep '80->80' | grep -o '[0-9a-z]*' | head -n1))
docker run -d -p 80:80 -e RUN_TYPE=prod [도커 이미지명:latest]

8) 롤백 명령 script
# 운영서버에 있는 script로서, 배포서버로부터 롤백지시를 받는다. 내용은 아래와 같다.
#!/bin/bash
docker rm $(docker stop $(docker ps | grep '80->80' | grep -o '[0-9a-z]*' | head -n1))
docker tag [도커 이미지명:old] [도커 이미지명:latest]
docker run -d -p 80:80 -e RUN_TYPE=prod [도커 이미지명:latest]

9) 배포서버에서 배포시 작업 순서
9-1) 도커 이미지에 카피되는 설정 및 스크립트 파일이 변경되거나, 장고 프로젝트의 requirements.txt가 변경된 경우, 위 2)번의 Dockerfile로 베이스 이미지를 build하여 저장소에 push한다.
9-2) 위 3)번의 Dockerfile로 이미지를 build하여 저장소에 push한다.
9-3) RUN_TYPE에 따라 환경변수를 적용한다.
9-4) 정적 파일들이 추가 및 변경된 경우, python manage.py collectstatic 을 실행한다.
9-5) DB 모델 최신화를 위해, python manage.py migrate 를 실행한다.
9-6) 운영서버들의 배포 명령 script를 원격으로 실행한다.

도커를 사용하면서 "우와 도커 대박!" 했던 사례도 있었고, 반대로 상당히 아쉬웠던 사례도 있었다.

장점 사례 몇가지,

1) 롤백이 무지 쉽다. 위의 배포 명령 script와 롤백 명령 script를 보면, 현재 도커 이미지로 실행시킨 컨테이너를 내리고 이전 이미지로 컨테이너를 실행하면 된다. 물론, DB 모델이 변경된 경우는 상황이 다르긴 하다.

2) 로컬 개발환경 및 테스트 환경에 DB를 도커로 구성할 수 있다. DockerHub에서 적당한 DB 이미지를 찾아서, 로컬에서 docker pull 하여 사용해 보니 전혀 문제가 없었다. 그리고 상황에 따라 여러개의 도커 컨테이너를 start&stop 하여 사용할 수 있는데, 이게 상당히 유용하다. 여러개의 브랜치로 나눠서 개발하고 있는 경우 DB 스키마가 다를 수 있는데, 각각에 대응되는 DB 컨테이너를 docker start 하면 되는 것이다. 그리고 운영 DB에서 데이터를 주기적으로 백업하여 개발해야 하는 경우와 개발환경용의 특별한(?) 데이터를 남겨놔야 하는 경우가 공존하는 경우에도 유용하다.

3) 배포 자체는 도커 이미지를 컨테이너로 실행하는 과정으로 추상화 되고, 이미지를 어떻게 빌드하느냐는 독립적인 과정이기 때문에 이를 다양하게 활용할 수 있다. 특정 브랜치를 테스트용 도메인이 적용된 테스트 환경에 배포하거나, 아예 다른 서비스를 임시로 배포하는 것도 어렵지 않게 할 수 있다. 

4) 배포작업을 배포 서버 및 로컬 개발환경 등, 도커를 설치할 수 있는 곳이라면 어디서든 할 수 있다. 배포 서버는 정해진 배포 작업을 수행하고, 로컬에서는 위의 3)번에서 언급한 특수한 환경의 배포를 하는데에 활용하면 유용하다.

단점 사례 몇가지,

1) 빌드 시간이 다소 오래 걸린다. 이미지를 확장하는 관계로 쪼개고, 운영환경에 필요 없는 정적 파일들을 제외하는 등의 최적화를 했지만 그래도 상대적으로 도커를 사용하지 않았을 때보다는 빌드 시간이 오래 걸리는 듯 했다.

2) 이미지가 누적되면서 배포 서버의 용량이 문제가 되어 배포 서버 ec2 인스턴스의 사양을 t2 micro에서 t2 medium으로 올렸고, 주기적으로 오래된 이미지를 삭제해 주고 있다. 물론 도커가 이미지를 버전별로 통째로 저장하는게 아니라 변경된 레이어들을 저장하는 식으로 최적화했다고는 하나, 그래도 기본적으로 이미지 하나가 용량이 크고, git처럼 소스코드 레벨에서 관리하는 것이 아니라 Dockerfile에서의 실행문 단위로 변경된 내용들이 레이어가 되기 때문에, 도커를 사용하지 않았을 때보다 상대적으로 저장공간에 대한 부담이 있다.

3) 어쨌거나 도커 컨테이너는 가상환경에 준한다. 새 이미지를 빌드하여 컨테이너로 실행하면 기본적으로는 mac address가 바뀐다. 물론 컨테이너 실행할 때 mac address를 지정해 줄 수 있지만 이것도 auto scaling 등을 생각해보면 사용하기 상당히 부담스럽다. 이러한 특성 때문에 한가지 불편했던 점은, 로그 통합 수집 서비스로 PaperTrail을 사용하고 있는데, 배포를 할때마다 시스템 개수가 늘어났고 papertrail에서 무료로 허용하는 system 수가 제한되어 있었기 때문에 어느 순간부터 로그가 쌓이지 않는 문제가 발생했었다. 이것은 왠지 좋은 해결책이 있을 것 같기는 하지만 어쨌거나 현재로서는 불편한 부분이다.(이제 얼른 찾아보고 개선해 봐야겠다.)

[출처] 도커 사용 후기|작성자 김태우




====================

출처 : https://www.facebook.com/groups/korea.docker.user.group/


Kimsehwa 김세화님이 김태우님의 게시물을 공유했습니다.

@김태우 님
공유해주신 글 잘 읽었습니다. 
제가 도커로 레일즈환경 구축할때 고민했던 내용이랑 비슷해서 뭔가 기뻤습니다 : )

저도 부족하지만 조금 다른 구성을 했기때문에 내용을 공유합니다.

다른점.

1. aws ecs를 이용한 오토스켈링
문제가 있으셨던거 같은데
저희는 ecs로 오토스켈링 잘쓰고 있습니다..(tokyo region입니다.)

2. 빌드&배포 
단점 사례중 빌드속도 문제와 관련있는데

저희는 development환경에서 소스쪽 변경에 의한 빌드 횟수가 많아
소스 빌드와 인프라 빌드를 나눠버렸습니다.
Django는 어떨지 모르겠는데 rails에서 도커 빌드시 매번 bundle install 실행 하는건 어마어마 하게 시간이 걸려서..

그래서 레일즈 소스만 바뀌었을때는 capistrano로 소스만 바꿔치기하는 디플로이 형태를 취했습니다.
플로우는 이하와 같습니다.
capistrano로 소스 갱신 -> bundle install(cache) -> precompile(s3) ->db migrate(매번) -> unicornherder로 SIGNAL보내서 재기동

3. 환경변수 관리
환경변수를 소스에 두는것이 세큐리티상 안좋아서 aws s3에 통합관리하고 도커 기동시 이하와 같은 순으로 실행해서 환경변수를 적용했습니다.

s3에
env_unicorn_development
env_unicorn_staging
env_unicorn_production
환경별 환경변수 일람을 업로드


ecs task definition에서 RAILS_SUB_ENV라는 환경변수에다 개발환경을 정의

컨테너 실행시 aws s3 cp s3://xx/env_unicorn_$RAILS_SUB_ENV /etc/profiled.d/xx -> bash -lc "supervisord unicorn기동”

단점 사례 몇가지 피드백

1. 빌드 속도 느린문제 -> 도커다이어트를 한다. 배포서버 성능을 올린다. or 소스빌드/인프라 빌드를 나눈다.
2. 배포서버 용량문제 -> 배포서버 역할을 circleCI가 하고 있기때문에 용량이슈는 아직 없음. 
3. 로그관리 
PaperTrail은 안써봐서 잘모르겠습니다만
저희는 오토스켈링 환경에서 로그관리는 대수로 과금되는 형식보단 용량 과금 형식이 나을거 같아서 Logentries라는놈을 써서 로그통합 관리하고 있습니다.(로그내용을 호스트인스턴스랑 볼륨시켜놓고 호스트인스턴스에 에이전트 설치해서 로그수집)

그 외에도 logDriver를 이용해서 로그관리를 해주는법이 있습니다.

Dockerfile에서 수집할 로그를 이하와같이 /dev/stdout으로 날림
RUN ln -sf /dev/stdout /var/log/xx.log

task definition에서 logdriver를 지정해줘서
awslogs나td-agent드라이버가 있었습니다.

단점은 표준출력으로 나오는 로그를 전부 줍기때문에 쓸데없는 로그가 끼는것과
CloudWatchLogs로 로그수집하는거 굉장히 비싸네요..용량이 많으실때는 잘 고려해서 선택할 필요가 있을거 같습니다.

지금 다시 구축한다면 td-agent로 로그 수집 -> s3에보관 ->athena분석 환경으로 갈거 같습니다. : )


조휘철 bundle install 문제는 소스 리포지토리를 ADD하기전에 ADD Gemfile을 bundle install 전에 하시면 캐싱이 되는데 혹시 시도해 보셨는지요
Kimsehwa 김세화 네 : ) 처음엔 그렇게 했습니다.(staging,production환경은 아직도 그렇게 하구요)
development환경에서는 이하와 같은 상황이어서 source/infra 빌드를 나눴습니다
1. Gemfile이 하루에도 몇번이고 바뀜 
2.circleCI를 배포서버로 사용해서 docker build의 캐쉬가 안먹힘
3.개발자분들이 빠르게 git push한 결과를 빠르게 반영해시켜돌라는 요건이있었음
4.개발자분들이 capistrano에 적응되 계심

이건 좀 무논리인데 아무리 cache처리된다해도 똑같은 작업을 반복시키는게 썩 내키지 않더군요..
아직 구현은 안했는데 생각한거로는

후보1.

circleCI나jenkins에서 git hook으로 gemfile,gemfile.lock 파일 갱신을 캐치

circleCI에서 bundle install후 결과를 패키지화해서 s3에 업로드
컨테이너는 기동시 s3에 있는 최신의 bundle install package을 취득 

후보2.

aws efs를 이용해서 nfs로 관리.
성능이슈는 검증해봐야겠지만 NFS캐쉬기능을 이용하면 커버가능할지도
사례는 많이 없지만 있긴 하더군요..


Announcement: Amazon EC2 Container Service is Now Generally Available



Amazon EC2 Container Service (ECS) is a highly scalable, high performance container management service that supports Docker containers and allows you to easily run applications on a managed cluster of Amazon EC2 instances. Amazon ECS eliminates the need for you to install, operate, and scale your own cluster management infrastructure. With simple API calls, you can launch and stop container-enabled applications, query the complete state of your cluster, and access many familiar features like Elastic Load Balancing, EBS volumes, security groups, and IAM roles.

New Features:

You can now use the Amazon ECS Service scheduler to manage long-running applications and services. The Service scheduler helps you maintain application availability and allows you to scale your containers up or down to meet your application's capacity requirements. The Service scheduler allows you to distribute traffic across your containers using Elastic Load Balancing. Amazon ECS will automatically register and deregister your containers from the associated load balancer. The Service scheduler will also automatically recover your containers that become unhealthy or stop running to ensure you have the desired number of healthy containers supporting your application. You can use the Service scheduler to easily scale up and down the number of containers supporting your application, and you can update your application by changing its definition or using a new image. The scheduler will automatically start new containers using the new definition and stop containers running the previous version.

Amazon ECS allows you to mount volumes to store and share information between containers and use images from private Docker repositories. You can also record all your EC2 Container Service API calls to AWS CloudTrail.

Amazon ECS is now generally available to all AWS customers in the US East (N. Virginia), US West (Oregon), EU (Ireland), and Asia Pacific (Tokyo) AWS regions. Read our documentation to learn how to use the Amazon EC2 Container Service Management Console, AWS CLI or SDKs to get started.

For more information about Amazon EC2 Container Service, please visit our product page.


EC2 Container Service – Long-Running Applications, Load Balancing, and More

EC2 Container Service – Long-Running Applications, Load Balancing, and More

Ecs_splash_2EC2 Container Service 는 Docker 컨테이너를 지원하는 확장 가능한 컨테이너 관리 서비스에서 Amazon Elastic Compute Cloud (EC2) 인스턴스 클러스터에서 응용 프로그램을 실행시킬 쉽게 할 수 있습니다. 우리는 AWS re : Invent 에서 미리보기를 시작 지금까지 많은 훌륭한 피드백을 받고 왔습니다.

Amazon ECS는 많은 고객에게 Docker를 사용하여 응용 프로그램이나 서비스를 캡슐화하고, 하나 일반적으로 여러 응용 프로그램을 EC2 인스턴스들의 클러스터에서 실행하는 데 클러스터 관리에 고민 싶지 않아 라는 말을 받아 만들어졌습니다. 안정 스케일 있고, 이미 이용하고있는 EC2의 고급 기능의 편리함도 누릴 수 같은 서비스가 고객 요구되고있었습니다.

또한 EC2 인스턴스와 컨테이너의 상태를 포함하는 클러스터 관리는 힘들 것 얻고, 특히 환경이 많아지면 그렇지 경향이라는 이야기도 들었습니다. 예를 들어 어떤 인스턴스를 사용할 수 필요한 용량을 가지고 있는가에 대한 상태 정보를 정확하게 적시에 액세스해야, 그것은 수 처음으로 컨테이너의 위치 결정이 가능합니다. 상태 추적은 인스턴스 및 컨테이너의 수가 수천 또는 수만 증가하면 계속적으로 어려워진 것하고 중요도가 더 더해갑니다.

Amazon ECS는 이러한 모든 요구 이상을 충족 있도록 디자인되어 있습니다. 고객 자신에서 클러스터 관리 기반을 설치하거나 운용하거나 스케일 할 필요가 없습니다. 간단한 API 호출뿐만 컨테이너 된 응용 프로그램을 시작하거나 중지 할 수 있으며, 클러스터의 상태도 알 수 있습니다. Amazon EC2와 다른 AWS 서비스를 함께 사용할 수 있으며,Elastic Load Balancing , EBS 볼륨 , EC2 보안 그룹 이나 IAM 역할 등 유명한 기능의 이점을 살릴 수 있습니다.

또한, 컨테이너의 스케줄링에 몇 가지 선택이 다양한 종류의 어플리케이션을 실행하는 것이나, 컨테이너 나 응용 프로그램이나 서비스의 배치와 활용을 관리 할 수​​ 있습니다.

오늘 일반적 가능하게 도쿄 지역에서도 이용이 가능하게

Amazon ECS가 일반 이용 가능하게 된 것에 대해 언급 할 수 매우 기쁘게 생각합니다. 따라 움직이는 유지 응용 프로그램 지원, 새로운 멋진 Amazon ECS 콘솔, 그리고 CloudTrail과의 연계라는 새로운 몇 가지 강력한 기능도 추가했다. 또한 Amazon ECS가 Asia Pacific (도쿄) 지역에서도 사용할 수 있습니다.

그러면 새로운 기능을 하나씩 살펴 보자.

긴 러닝 어플리케이션

지금까지 Amazon ECS는 클러스터의 Docker 컨테이너 일정에 2 개의 수단을 제공했습니다. 하나는 일괄 작업과 같이 한 번 실행하는 것 같은 것이 끝나면 종료합니다. 다른 하나는 Amazon ECS의 API에서 클러스터 상태 정보를 취득하여 타사 및 사용자 정의 스케줄러에 전달할 수 있습니다.

오늘의 릴리스부터 롱 러닝 애플리케이션과 서비스를 관리하기 위해 새로 Amazon ECS 서비스 스케줄러를 사용할 수 있습니다. 서비스 스케줄러는 애플리케이션 가용성 관리를 도와 주시고 용량의 요구에 맞는 것처럼 컨테이너를 시작하거나 중지하고 확장 할 수 있습니다. 다음이 제공하는 기능 목록입니다 :

  • 로드 밸런싱 - 서비스 스케줄러에 의해 Elastic Load Balancing을 사용한 컨테이​​너를 걸친 트래픽 분산이 가능합니다. Amazon ECS는 관련로드 밸런서에 자동으로 등록 · 해제합니다.
  • 사활 관리 - 서비스 스케줄러는 정상 없게되었다 (ELB의 건강 체크가 실패) 컨테이너를 자동으로 부활하거나 중지합니다. 이를 통해 응용 프로그램을 실행시키기 위해 필요한 지정된 수의 정상적인 컨테이너가 유지되는 것을 보장 해줍니다.

  • 스케일 업과 스케일 다운 - 서비스를 실행하는 컨테이너의 수를 변경하여 응용 프로그램을 확장 시키거나 스케일 다운시킬 수 있습니다.

  • 업데이트 관리 - 응용 프로그램의 정의를 바꾸거나 새로운 이미지를 사용하여 응용 프로그램의 업데이트도 할 수 있습니다. 스케줄러는 새로운 정의에 자동으로 컨테이너 그룹을 시작하고 이전 버전이 움직이고있는 컨테이너를 중지합니다. ELB가 사용되고있는 경우에는 ELB의 연결을 드레인시켜 기다려줍니다.

이러한 새로운 기능을 사용하여 기본적인 서비스 검색을 구현​​할 수 있습니다. 클러스터에서 움직이고있는 서비스를 나열 할 수 있고, ELB를 서비스 엔드 포인트로 사용할 수 있습니다.

Gilt의 말

온라인 소매를 전개하는 Gilt는 고객에게 오늘의 톱 브랜드와 체험에 대한 내부 정보를 제공합니다. 공동 설립자 인 Phong Nguyen 은 이런 말을주었습니다 :

Phong_nguyen_gilt_1"우리는 Docker 얼리 어댑터이었습니다 .Docker을 사용함으로써 빠른 개발이 수 마이크로 서비스 아키텍처의 종단 간 지속적인 전달을 개선하고 단순화 할 수있었습니다. 우리의 모든 서비스가 Docker 화되어 있기 때문에 배치를 가속화 서비스를 자동화하고 더 효율을 잘 할 수있는 플랫폼을 갖는 것이 중요합니다. 새로운 서비스 스케줄러와 ELB의 연계를 통해 Amazon ECS이 우리의 서비스에 매우 좋은 플랫폼이며, AWS와 우리의 Docker 플랫폼의 파트너십이 매우 기대됩니다. "

Amazon ECS 콘솔

새로운 Amazon ECS 콘솔에서 클러스터를 설치하거나 이동하는 프로세스를 단순화합니다. 여기에 간단한 PHP 응용 프로그램을 배포하는 서비스를 만드는 절차를 소개합니다. 응용 프로그램은 링크 된 컨테이너에서 전달되는 내용 (메시지 및 시간)를 표시합니다.

우선 콘솔을 열고 사용자 지정 작업 정의 (1 개의 EC2 인스턴스에서 함께 운영하고 컨테이너의 집합)을 만드는 쪽을 선택합니다.

그리고 자신의 작업 정의를 만듭니다. 시각적으로 1 컨테이너 씩 만들어 나갈 수 있습니다.

또는 기존의 JSON 정의를 붙여 넣을 수 있습니다 (이것은 문서의 Docker 기본 섹션 에서 그대로오고있다)

Create a service를 클릭하고 다음 단계에서는 모든 기본값을 사용합니다.

이제 서비스가 정의되어 그것을 움직이기위한 클러스터를 만들 수 있습니다 (이 예에서는 3 개의 t2.micro 인스턴스를 사용합니다). Select / Create Roles 버튼을 사용하여 필요한 IAM 역할을 한 번의 클릭으로 설치합니다.

옵션을 검토하고 의도대로임을 확인한 후 Amazon ECS는 표준 클러스터 EC2 인스턴스를 시작합니다. 진행은 콘솔에서 볼 수 있습니다.

몇 분 안에 모든 것이 시작하므로 이들을 보면 수 있습니다. 소개 클러스터 목록 (지금은 1 만)를 살펴 보자.

더 가까이에서 클러스터를보기 위해 확대 봅니다.

거기에서 서비스를 확인하실 수 있습니다.

필요한 경우 변경할 수 있습니다.

물론 이러한 모든 작업이나 정보 취득은 ECS API 와 Command-Line Interface (CLI)를 통해 할 수 있습니다.

CloudTrail 제휴

ECS API 호출을 AWS CloudTrail 에서 기록되게되었습니다.

또 다른 지역

오늘부터 Amazon ECS는 Asia Pacific (도쿄) 지역에서 사용할 수 있습니다. 다른 방법은 US East (Northern Virginia), US West (Oregon) Europe (Ireland) 지역에서 사용할 수 있습니다.

오늘부터 사용할 수 있습니다

만약 컨테이너 기반의 계산기 나 Amazon ECS가 처음이라면, What is Amazon EC2 Container Service 를 읽는 데서 시작 좋다고 생각합니다.

- Jeff; (번역 : 이와 나가)


[News] 넷플릭스 오픈소스 기술 쓸 땐 컨테이너로

요즘 컨퍼런스 어딜가든 도커 얘기가 빠지지 않는다. 관련 뉴스들을 스크랩해 보았다.

블로터 뉴스 원문 : http://www.bloter.net/archives/213597


2014.11.23

넷플릭스 오픈소스 기술 쓸 땐 컨테이너로


대형 IT 기업들이 오픈소스 개발에 한창 힘을 쏟고 있다. 넷플릭스도 오픈소스 개발에 적극적이다. 지난주에는 도커 기술인 ‘제로투도커’를 오픈소스를 내놓았다. 넷플릭스가 제공한 오픈소스 기술을 쉽게 이용할 수 있게 돕는 기술이다.

netflix_zerotodocker_02

넷플릭스는 많은 사용자들에게 스트리밍 서비스를 제공하는 업체다. 따라서 확장성 있는 인프라 플랫폼을 만드는 데 큰 투자를 하고 있다. 지금까지 49개의 오픈소스를 공개했다. AWS용 관리 콘솔, 애플리케이션 모니터링용 라이브러리, 보안 기술, 백업·복구 기술 등이다.

제로투도커는 컨테이너 이미지 기술이다. 넷플릭스 오픈소스 기술은 설치하고 배포하는 과정이 복잡했는데, 컨테이너 기술로 쉽고 빨리 설치할 수 있게 됐다. 넷플릭스는 “제로투도커로 명령어 한 줄을 입력해서 넷플릭스가 제공하는 모든 오픈소스 기술들을 통합해 단 몇 분만에 이용할 수 있을 것”이라며 “각각의 오픈소스를 격리시켜 원하는 설정이나 시스템을 유지한 채 자원을 관리할 수 있게 도와준다”라고 설명했다.

최근 도커는 컨테이너 이미지와 도커 파일을 공유할 수 있는 ‘도커허브’를 출시했다. 넷플릭스는 여기에 기존에 제공하던 오픈소스 기술들의 이미지를 올려놓고, 제로투도커를 지원하고 있다. 예를 들어 ‘아스가르드’, ‘유레카’, ‘시크리티몽키’등을 컨테이너 이미지 형태로 도커허브에 올려놓았다. 넷플릭스는 “가용성이나 보안상의 문제로 핵심 제품에 바로 사용할 수 있는 수준은 아니다”라면서도 “넷플릭스 오픈소스를 쉽게 접해볼 수 있도록 도와줄 것”이라고 기대했다.

netflix_zerotodocker_03

▲도커 파일 저장소, 도커허브. 넥플릭스는 기존 오픈소스 기술을 도커허브에 올려놓고 제로투도커와 활용할 수 있도록 지원하고 있다.

■ 제로투도커 깃허브 페이지

[News] AWS표 컨테이너 서비스 마침내 나왔다

요즘 컨퍼런스 어딜가든 도커 얘기가 빠지지 않는다. 관련 뉴스들을 스크랩해 보았다.

블로터 뉴스 원문 : http://www.bloter.net/archives/212766


2014.11.14

AWS표 컨테이너 서비스 마침내 나왔다


“준비되셨습니까?”

의미심장한 미소를 짓은 채, 보너 보겔스 아마존 최고기술경영자(CTO)는 아마존웹서비스(AWS) 리인벤트(re:Invent) 행사에서 11월13일 새로운 서비스 하나를 소개했다. 이름하여 ‘아마존 EC2 컨테이너 서비스’. 행사에선 개발자들의 환호와 박수가 이어졌다. 드디어, AWS도 도커 기술을 내놓았다. 지난 7월부터 구글,MS가 도커와 함께 컨테이너 기술을 개발하는 동안, AWS는 별다른 반응을 보이지 않았다. 결국 입을 꾹 다문 채 컨테이너 기술을 연구하고 있던 셈이다. 현재는 프리뷰 버전이 공개됐다.  13일 리인벤트 행사에서 EC2 컨테이너 기술 데모를 직접 보여줬다. 여기에 도커 최고경영자(CEO)까지 직접 나와 리인벤트 참여자 1만3500명에게 AWS기술과 도커가 어떻게 활용될 수 있는지 직접 설명했다.

미국 현지시각 13일 리인벤트 행사에 두번째 키노트가 있는 날. 보너 보겔스 CTO가 9시 정각 등장했다. 보너 보겔스 등장은 전날 발표자였던 앤디 재시 AWS 시니어 부사장과는 사뭇 달랐다. 앤디 재시 부사장은 양복을 입고 나왔지만, 보너 보겔스 CTO는 티셔츠에 자켓을 걸쳤다. 개발자들은 앤디 재시 부사장보다 훨씬 더 크게 보너 보겔스를 맞이했다. 보너 보겔스 CTO는 그러한 환호를 즐기듯 유쾌하게 등장했다. 그는 어제 새로 발표한 AWS 제품을 복습하듯 다시 언급했다. ‘키 매니지먼트 서비스’, ‘오로라’ 서비스 등의 보안, DB 기술 등의 장점을 강조했다.

AWS_reInvent_2014_13th_key_07

▲ 보너 보겔스 아마존 최고기술경영자(CTO)

그리고 고객사의 발표가 이어졌다. 스플렁크, 옴니폰, 더웨더채널같은 비교적 큰 기업이 나와 유창한 발표를 했다. 그 다음 2013년 5월 설립된 스타트업 프리스틴 공동설립자가 무대에 나왔다. 프리스틴은 구글 글래스와 헬스케어를 결합한 기술을 개발하는 곳이다. 갑자기 왜 이런 작은 기업 사례를 소개할까라고 의문을 갖던 시점에 다음 슬라이드를 보고 그 이유를 알아챘다. 파란 고래 그림 위에 여러 상자가 올려있는 그림. 도커의 아이콘이다. 프리스틴 공동창립자는 해당 서비스를 도커와 AWS 기반 위에 개발했다고 발표했다. 그리고 두 기술은 매우 잘 어울린다고 강조했다. 보너 보겔스 CTO는 일부러 그렇게 뜸을 들였던 셈이다. 기조연설이 시작한지 50분정도가 지났을 때, 오늘의 가장 주인공이라 부를 수 있는 ‘아마존 EC2 컨테이너 서비스’를 발표했다.

AWS_reInvent_2014_13th_key_04

프리스틴 공동설립자의 발표가 끝나고, 보너 보겔스 CTO는 컨테이너 기술과 그 인기를 소개했다. 컨테이너 기술은 리눅스 설치와 실행에 필요한 정보와 자료를 마치 박스에 담듯이 모아놓는 기술을 말한다. 이를 통해 설치과정이 간소화되면서 애플리케이션을 쉽게 배포할 수 있다. 도커는 이러한 컨테이너를 생성하고 배포하는 걸 자동화 시켜주는 오픈소스다.

도커는 이미 올해부터 개발자들에게 꾸준한 사랑을 받았다. 하지만 이를 AWS EC2에서 사용하려면 개발자 스스로 소프트웨어를 만들거나 오픈소스를 이용해야만 했다. AWS는 도커를 활용한 사례를 알린 적은 있지만 제품은 출시한 바 없다. 따라서 과거 AWS 고객은 자체 소프트웨어를 통해 컨테이너 자원을 할당하고, 각 컨테이너들의 순서를 정하거나 모니터링했다. 이는 꽤 복잡한 과정이어서 개발자들은 도커를 쉽게 활용하지 못했다. EC2 컨테이너 서비스는 이러한 문제를 API로 해결했다. API로 쉽게 컨테이너를 시작 및 관리할 수 있기 때문이다. AWS는 데모를 통해 단 몇 초 만에 수천개의 컨테이너를 만들고, 중지하고, 관리할 수 있다고 설명했다. 또한 규모에 상관없이 컨테이너를 관리할 수 있으며, 스케쥴링도 유연하게 할 수 있다고 강조했다.

AWS_reInvent_2014_13th_key_08

AWS_reInvent_2014_13th_key_06

데모가 끝나고, 도커를 누구보다 잘 아는 벤 고럽 도커 CEO가 리인벤트 무대에 깜짝 등장했다. 벤 고럽 CEO는 과거와 현재의 개발 방식이 달라진 점을 강조하며, 애플리케이션을 배포에 대한 중요성을 설명했다. 예를 들어, 과거와 달리 현재 개발환경은 개발과정이 반복되며, 여러 컴포넌트로 애플리케이션을 구성하고, 또한 여러 서버에 애플리케이션이 설치되고 있다. 벤 고럽 CEO는 “컨테이너 기술은 애플리케이션 배포를 자동화해주기 때문에 최근 개발 환경에 어울린다”라고 설명했다.

AWS_reInvent_2014_13th_key_03

▲벤 고럽 도커 최고경영자(CEO)

AWS_reInvent_2014_13th_key_05

EC2 컨테이너 서비스는 도커 허브를 사용한다. 이를 통해 도커 컨테이너 기반 애플리케이션은 다른 사람들과 공유될 수 있다. AWS는 보도자료를 통해 “EC2 컨테이너 서비스 API를 도커 오픈소스에 통합하는 방법을 모색 중이다”라며 앞으로 AWS가 도커 오픈소스에 일부 기여할 것을 암시했다.

매트 갈만 아마존 EC2 부사장은 같은날 보도자료를 통해 “많은 고객이 도커 컨테이너를 현재 EC2 인스턴스에서 이용하고 관리하고 싶어했다”라며 “EC2 컨테이너 서비스로 어플리케이션을 안전하고 확장성 있게 운영할 수 있을 것”이라고 기대했다.

AWS가 도커 진영에 합류하면서, 도커에 대한 관심은 더욱 높아질 것으로 보인다. 과거 도커는 안정성과 그 활용도를 검증하지 못했다. 이번 AWS 컨테이너 기술로 좀 더 많은 개발자들이 컨테이너 기술에 쉽게 접할 수 있을 것으로 보인다.

[News] 조이엔트, 컨테이너 기술 오픈소스로

요즘 컨퍼런스 어딜가든 도커 얘기가 빠지지 않는다. 관련 뉴스들을 스크랩해 보았다.

블로터 뉴스 원문 : http://www.bloter.net/archives/212213


2014.11.07

조이엔트, 컨테이너 기술 오픈소스로

조이엔트가 컨테이너 기술 시장에 도전장을 내밀었다. 컨테이너 기술을 이루는 핵심 제품 2개를 오픈소스로 공개해 배포했다. 주로 도커가 주름잡고 있던 컨테이너 기술 시장에 새로운 경쟁자들이 속속 들어서는 것으로 보인다.

조이엔트는 2004년에 설립된 회사로 IaaS(Infra as a Service)와 PaaS(Platform as a Service) 클라우드 서비스를 주로 제공하고 있다. 특히 루비온레일즈, 노드JS과 같은 오픈소스를 지원하는 서비스들을 대거 출시한 바 있다.

조이엔트는 11월6일 공식블로그를 통해 “조이엔트는 2006년부터 운영체제(OS) 가상화 기술에 큰 투자를 하고 있다”라며 “이를 운영체제 컨테이너 기술로 변화시켰다”라고 설명했다.

Joyent_container_01

조이엔트는 컨테이너 기술을 위해 핵심 구성요소 2개를 오픈소스로 공개했다. 하나는 ‘SDC (SmartDataCenter)’로, 컨테이너 기반 통합(Orchestration) 소프트웨어다. 퍼블릭 클라우드를 운영할 때 사용할 수 있는 핵심SW다. 또 다른 하나는 ‘맨타 오프젝트 스토리지 플랫폼’이다. 이는 ZFS(Zettabyte File System) 기반인 게 특징이다. ZFS는 기존보다 더 많은 대용량 데이터를 처리할 수 있는 파일 시스템이다. 조이엔트는 두 기술을 활용하면, 인프라 확장성을 높이면서 큰 데이터를 처리하는데 용이할 것으로 기대하고 있다.

브라이언 캔트릴(Bryan Cantrill) 조이엔트 소프트웨어 엔지니어는 “컨테이너 기술은 이제 다루기 어려운 기술이 아니라 차세대 컴퓨팅을 이끌 근본적인 기술이 되었다”라며 “이번에 두 기술을 오픈소스로 공개하면서 컨테이너 기술이 더 확대될 것”이라고 기대했다.
Joyent_container_02

올해 들어 컨테이너 기술에 대한 관심은 증가하는 추세다. 컨테이너 기술은 애플리케이션 배포를 자동화는 기술로, 인프라 자원을 더 빠르고 효율적으로 관리하도록 돕는다. 서로 떨어져 있던 자원들을 컨테이너 박스에 묶어 서로 충돌하는 요소를 없애주며, 설치과정을 쉽게 만들어주는 게 특징이다. 이번 주 초에는 구글이 ‘구글 컨테이너 엔진’을 발표했고, 리눅스 소프트웨어 제공업체 캐노니컬도 보안성을 강화한 컨테이너 기술 ‘리눅스 컨테이너 데몬’을 출시한바 있다. 또한 마이크로소프트(MS)도 적극 관심을 보이고 있어, 윈도우용 컨테이너 기술을 따로 개발하고 있다.


[News] 구글, 클라우드에 도커 컨테이너 기술 지원

요즘 컨퍼런스 어딜가든 도커 얘기가 빠지지 않는다. 관련 뉴스들을 스크랩해 보았다.

블로터 뉴스 원문 : http://www.bloter.net/archives/211976


2014.11.05

구글, 클라우드에 도커 컨테이너 기술 지원


구글이 더 빠른 클라우드를 만들기 위한 노력에 한창이다. 11월4일 ‘구글 클라우드 플랫폼 라이브’에서 구글 클라우드에 대한 새로운 기술과 가격을 발표했다. 컨테이너 기술, 네트워크, 모바일 기술이 눈에 띄었다.

올해 9월 구글 컴퓨트 엔진팀 수장은 새로 바뀌었다. 브라이언 스티븐스 부사장이다. 그는 구글 이전에 레드햇에서 12년 동안 근무한 인물로, 레드햇 최고기술경영자(CTO)를 맡은 바 있다. 레드햇에 근무했을 당시에 도커와 오픈스택 기술을 적극적으로 개발했는데, 그의 경력이 이번 구글 클라우드 전략에서도 빛이 났다. 구글은 11월4일 ‘구글 컨테이너 엔진’을 발표했다. 오픈소스 ‘쿠베르네테스’를 활용한 기술로, 도커 컨테이너 기술을 구글 클라우드 플랫폼에서 쉽게 사용할 수 있도록 도와준다. 아직 알파버전이지만, 구글 컴퓨트 엔진을 사용하는 고객이라면 누구나 사용해볼 수 있다.

Google_Container_Engine_01

구글은 11월4일 블로그에 “구글 컨테이너 엔진은 애플리케이션은 작은 단위로 쪼개고 좀 더 빠르고 쉽게 관리할 수 있게 도와줄 것”이라며 “애자일 운영을 할 수 있다”라고 장점을 설명했다. 구글은 다른 클라우드 기업보다 더 빠르게 컨테이너 기술을 도입하고 주력 무기로 삼고 있는데, 이번에도 빠르게 도커 기술을 통합하는 것으로 보인다.

Google_Container_Engine_02

▲출처: 구글 블로그(링크바로가기)

네트워크 기술도 대폭 지원한다. 이를 위한 ‘구글 클라우드 인터커넥트’라는 프로젝트도 공개했다. 구글 클라우드 고객은 앞으로 구글이 제공하는 70여개 인터넷 접속거점(PoP, Point Of Presence)을 바로 이용할 수 있다. 이를 통해 좀 더 빠른 구글 클라우드 서비스를 이용할 수 있다. 구글은 7개 IX(Internet exchange) 업체들과 협력을 맺었다. 이 IX 업체들과 협력으로 구글 클라우드 고객은 이전보다 더 많은 데이터를 빠르게 전송하고 처리할 수 있게 됐다.

마지막으로, VPN(가상사설망) 기술을 2015년 안에 제공할 예정이다. VPN은 여럿이 함께 쓰는 인터넷 망에 암호화 기술을 적용해 안전하게 데이터를 보내는 기술이다. <기가옴>은 11월4일보도에 VPN를 “하이브리드 클라우드 전략을 위한 핵심요소”로 평가하기도 했다. 회사 내부에 있는 서버 데이터를 퍼블릭 클라우드로 옮겨가는 과정에선 많은 데이터가 오가기 마련인데, 이때 VPN으로 비용을 절감하고 보안성을 높일 수 있기 때문이다. 경쟁사인 아마존웹서비스(AWS)는 ‘다이렉트 커넥트’, 마이크로소프트는 ‘익스프레스루트’, IBM은 ‘다이렉트 링크’라는 네트워킹 기술로 기업 하이브리드 클라우드 전략을 돕고 있다.

구글은 얼마 전 인수했던 파이어베이스 기술을 직접 시연하며 “실시간 통신 기반의 모바일 앱 개발에 좋다”라고 설명했다. 파이어베이스는 백엔드 데이터를 여러 모바일 기기에서 빠르게 동기화하고 처리해주는 기술을 제공한다. 기존 인프라 뿐만 아니라 모바일 개발환경을 지원하면서, 구글은 PaaS 경쟁력을 높일 심산이다.

가격 경쟁 대열에도 적극 합류하는 모습이다. 구글은 “데이터 복사 비용이 47%, 빅쿼리 스토리지는 23%, 퍼시스턴트 디스크 스냅샷은 79% 인하했다”라고 밝혔다. 또한 “플래시 스토리지는 48%, 클라우드 SQL 스토리지는 25% 가격이 내려간다”라고 설명했다.