Docker 간단 가이드

41
Docker 간단 가이드 with Django

description

Docker와 2주 간 삽질 후 간단한 가이드를 작성해보았습니다.

Transcript of Docker 간단 가이드

Page 1: Docker 간단 가이드

Docker 간단 가이드

with Django

Page 2: Docker 간단 가이드

docker

Docker?pack, ship and run any application as a lightweight container (http://docker.io)

애플리케이션 구동을 위한 일종의 (격리된) 가상 환경을 만들 수 있는 도구

Page 3: Docker 간단 가이드

docker

Requirementsif osx: open http://downloads.vagrantup.com/

Vagrant : 가상 환경(with VirtualBox / Parallels / VMware Fusion ...)

- 왜 Vagrant? docker가 리눅스에'만' 존재하는 lxc라는 기능을 사용하기 때문에...

Page 5: Docker 간단 가이드

docker

Docker 사용 (with 노가다) 1/3

local:~/docker$ vagrant uplocal:~/docker$ vagrant ssh

Page 6: Docker 간단 가이드

docker

Docker 사용 (with 노가다) 1/3

local:~/docker$ vagrant uplocal:~/docker$ vagrant ssh

로컬

Vagrant

Page 7: Docker 간단 가이드

docker

vagrant:~$ docker pull ubuntuvagrant:~$ docker run -i -t ubuntu /bin/bashroot:~$

Docker 사용 (with 노가다) 2/3

Page 8: Docker 간단 가이드

docker

vagrant:~$ docker pull ubuntuvagrant:~$ docker run -i -t ubuntu /bin/bashroot:~$

Docker 사용 (with 노가다) 2/3

Precise64 base Ubuntu + docker

거의 아무 것도 없음.

Page 9: Docker 간단 가이드

docker

vagrant:~$ docker pull ubuntuvagrant:~$ docker run -i -t ubuntu /bin/bashroot:~$

Docker 사용 (with 노가다) 2/3

Precise64 base Ubuntu + docker

거의 아무 것도 없음.

로컬

Vagrant

Docker

Page 10: Docker 간단 가이드

docker

Docker 사용 (with 노가다) 2/3

vagrant:~$ docker pull ubuntuvagrant:~$ docker run -i -t ubuntu /bin/bashroot@imageid:/# apt-get updateroot@imageid:/# apt-get install … (git, pip 등)root@imageid:/# git clone git://proj....root@imageid:/proj# pip install -r requirements.txtroot@imageid:/proj# python manage.py syncdbroot@imageid:/proj# python manage.py collectstatic

Page 11: Docker 간단 가이드

docker

Docker 사용 (with 노가다) 3/3

root@imageid:/proj# exitvagrant:~$ docker commit imageid namevagrant:~$ docker run -i -t -d -p 8080:8080 name \uwsgi --ini=/production/uwsgi.ini

로컬

가상 환경

Vagrant

웹 서버

Docker

Page 12: Docker 간단 가이드

docker

끝?

Page 13: Docker 간단 가이드

docker

끝?

이미지 만드는 데 대략 (익숙해지면) 30분…이 이미지를 ec2에서도 돌리고 싶다면?

Page 14: Docker 간단 가이드

docker

끝?

이미지 만드는 데 대략 (익숙해지면) 30분…이 이미지를 ec2에서도 돌리고 싶다면?

ec2에 접속하여 앞의 과정을 반복하세요…docker 왜 써?!

Page 15: Docker 간단 가이드

docker

Dockerfile 설정 1/3

<파일: notice/Dockerfile>FROM kencochrane/django-docker

RUN apt-get updateRUN apt-get install -y libmysqlclient-dev libldap2-dev libsasl2-dev libssl-devRUN pip install uwsgi

ADD ./requirements.txt /home/

WORKDIR /home/

RUN pip install -r requirements.txt

ADD . /home

EXPOSE 8080

CMD ["uwsgi", "--ini", "/home/production/uwsgi.ini"]

vagrant:~$ docker build -t=name .

Page 16: Docker 간단 가이드

docker

Dockerfile 설정 2/3

FROM kencochrane/django-docker

: 미리 만들어 둔 기본 이미지를 재활용할 수 있다.

RUN apt-get update: build 과정에서 해당 명령을 실행함. 보통 의존성 패키지 설치.

ADD . /home: docker 외부의 . 디렉터리를 » docker 내부의 /home으로 복사

Page 17: Docker 간단 가이드

docker

Dockerfile 설정 2/3

FROM kencochrane/django-docker

: 미리 만들어 둔 기본 이미지를 재활용할 수 있다.

RUN apt-get update: build 과정에서 해당 명령을 실행함. 보통 의존성 패키지 설치.

ADD . /home: docker 외부의 . 디렉터리를 » docker 내부의 /home으로 복사

Ubuntu

Page 18: Docker 간단 가이드

docker

Dockerfile 설정 2/3

FROM kencochrane/django-docker

: 미리 만들어 둔 기본 이미지를 재활용할 수 있다.

RUN apt-get update: build 과정에서 해당 명령을 실행함. 보통 의존성 패키지 설치.

ADD . /home: docker 외부의 . 디렉터리를 » docker 내부의 /home으로 복사

Ubuntu

Python 2.7

Page 19: Docker 간단 가이드

docker

Dockerfile 설정 2/3

FROM kencochrane/django-docker

: 미리 만들어 둔 기본 이미지를 재활용할 수 있다.

RUN apt-get update: build 과정에서 해당 명령을 실행함. 보통 의존성 패키지 설치.

ADD . /home: docker 외부의 . 디렉터리를 » docker 내부의 /home으로 복사

Ubuntu

Python 2.7

Django 1.6

Page 20: Docker 간단 가이드

docker

Dockerfile 설정 2/3

FROM kencochrane/django-docker

: 미리 만들어 둔 기본 이미지를 재활용할 수 있다.

RUN apt-get update: build 과정에서 해당 명령을 실행함. 보통 의존성 패키지 설치.

ADD . /home: docker 외부의 . 디렉터리를 » docker 내부의 /home으로 복사

Ubuntu

Python 2.7

Django 1.6

app 1

Page 21: Docker 간단 가이드

docker

Dockerfile 설정 2/3

FROM kencochrane/django-docker

: 미리 만들어 둔 기본 이미지를 재활용할 수 있다.

RUN apt-get update: build 과정에서 해당 명령을 실행함. 보통 의존성 패키지 설치.

ADD . /home: docker 외부의 . 디렉터리를 » docker 내부의 /home으로 복사

Ubuntu

Python 2.7

Django 1.6

app 1app 2

Page 22: Docker 간단 가이드

docker

Dockerfile 설정 2/3

FROM kencochrane/django-docker

: 미리 만들어 둔 기본 이미지를 재활용할 수 있다.

RUN apt-get update: build 과정에서 해당 명령을 실행함. 보통 의존성 패키지 설치.

ADD . /home: docker 외부의 . 디렉터리를 » docker 내부의 /home으로 복사

Ubuntu

Python 2.7

Django 1.6

app 1app 2

flask 0.10

app 3

Page 23: Docker 간단 가이드

docker

재활용할 수 있는 이미지들• https://index.docker.io에서 검색• mbkan/lamp

o CentOSo apache, mysql, php, phpmyadmin

• kencochrane/django-dockero ubuntu 12.10o django 구동에 필요한 기본 사항을 설치해 둔 이미지

• ruby, perl 등 다양한 환경이 존재함o 나만의 이미지를 만들 수도 있음

Page 24: Docker 간단 가이드

docker

Dockerfile 설정 2/3

FROM kencochrane/django-docker: 미리 만들어 둔 기본 이미지를 재활용할 수 있다.

RUN apt-get update: build 과정에서 해당 명령을 실행함. 보통 의존성 패키지 설치.

ADD . /home: docker 외부의 . 디렉터리를 » docker 내부의 /home으로 복사

Page 25: Docker 간단 가이드

docker

Dockerfile 설정 3/3

WORKDIR /home: 이후의 명령어가 실행될 디렉터리 지정

EXPOSE 8080: 내부의 8080 포트를 열어 둠

CMD ["uwsgi", "--ini", "/home/production/uwsgi.ini"]: docker run imageid 했을 때, 이 명령이 실행됨. Dockerfile 내에서 하나만!)(ENTRYPOINT도 비슷하나 run 명령 뒤의 인자를 받음. 역시 하나만 가능)

Page 26: Docker 간단 가이드

docker

노가다 Docker와 Dockerfile 비교

노가다 Docker Dockerfile

10+a개 10개

30분(익숙해지면)

10분

실수 가능 실수 줄어듦

Page 27: Docker 간단 가이드

docker

노가다 Docker와 Dockerfile 비교

EC2

Docker

EC2

Docker

- docker 이미지 생성- docker 이미지 접속- 의존성(apt-get) 설치- 최신 소스코드 받기- 의존성(pip) 설치- docker run

- docker build- docker run

Page 28: Docker 간단 가이드

docker

docker-registry근데 로컬에서 만든 이미지를 ec2에 어떻게 넣죠?ec2에서 직접 build하세요… oTL

• docker-registryo vagrant:~$ docker push raccoony/nameo ec2:~$ docker pull raccoony/nameo ec2:~$ docker run -i -t -d -p 8080:8080 …

https://index.docker.io에 가입한 ID

이미지 이름 (맘대로)

Page 29: Docker 간단 가이드

docker

현재까지 정리

노가다 Docker Dockerfile docker-registry

10+a개 10개 7개

30분(익숙해지면)

10분 4분

실수 가능 실수 줄어듦 실수 불가능(오타만 조심)

Page 30: Docker 간단 가이드

docker

Dockerfile과 docker-registry 비교

EC2

Docker

EC2

Docker

로컬에서 개발 후- docker build- docker run

잘 되면

- ec2 접속

- docker build- docker run

로컬에서 개발 후- docker build- docker run

잘 되면

- docker push- ec2 접속

- docker pull- docker run

로컬Vagrant

로컬Vagrant

중복(=나쁘다)

중복 삭제(=좋다)

Page 31: Docker 간단 가이드

docker

서비스 배포 과정 요약local:~$ vagrant uplocal:~$ vagrant sshvagrant:~$ git pullvagrant:~$ docker build -t=name .vagrant:~$ docker push raccoony/nameec2:~$ docker pull raccoony/nameec2:~$ docker run -i -t -d -p 8080:8080 name

Page 32: Docker 간단 가이드

docker

현재까지 느낀 장단점• 장점

o Dockerfile만 잘 만들어 두면, 서비스 올리고 내리는 일이 쉽다o 서비스 올리려고 서버를 배울 필요가 없다(대신 docker 명령을 배워...)

• 단점o docker 내부에 쌓이는 로그를 보기가 힘들다(중요 로그는 시스템 외부로)o 초기 개념 잡기가 조금 힘들다(여기서 설명하지 않은 image와 container의 관계)

o build 명령에 시간이 좀 걸리는데… -> dokku, deis 등으로 해결

Page 33: Docker 간단 가이드

docker

dokku

• dokkuo docker 전용 git 저장소 + 자동 빌드o local:~$ git remote add dokku.raccoony.kr/proj dokkuo local:~$ git push dokku mastero 알아서 빌드되고, 이미지 저장소에 등록되고, 새 이미지가 실행됨

실제 설정도 다 했는데…- 몇몇 패키지 설치 실패- buildpack이라는 일종의 리눅스 이미지에서 빌드- 기존 buildpack으로 안 되니, 나만의 buildpack을 만들까?- buildpack을 만드는 스크립트 = buildstep… 아... 지쳤다…- (주의) 단일 서버만 지원

Page 34: Docker 간단 가이드

docker

deis.io

• 멀티 서버 지원되는 dokku 같은 녀석o 그러나 사용해보지 않았음(지쳐서).

Page 35: Docker 간단 가이드

docker

dokku 도입 후의 모습

EC2

Docker

EC2

Docker

로컬에서 개발 후- docker build- docker run

잘 되면

- docker push- ec2 접속

- docker pull- docker run

로컬에서 개발 후잘 되면

- git push

알아서 업데이트

로컬Vagrant

로컬Vagrant

Page 36: Docker 간단 가이드

docker

dokku 도입 후 비교

노가다 Docker

Dockerfile docker-registry

deis

10+a개 10개 7개 1개(push)

30분(익숙해지면)

10분 4분 1분

실수 가능 실수 불가능(거의)

실수 불가능(오타만 조심)

자동화 천국!

Page 37: Docker 간단 가이드

docker

Docker 명령 간략 정리 1/3

• docker run -i -t -d -p 0:0 id 명령어o -i :Keep stdin open even if not attachedo -t :Allocate a pseudo-tty

o -d :데몬 형태로 실행o -p : 포트 포워딩 (외부 포트 -> 내부 포트)

o id : 이미지 id나 이름o 명령어 : Dockerfile에 있는 CMD 대신 실행하고 싶은 명령어

(혹은 ENTRYPOINT에 지정하려는 인자)

Page 38: Docker 간단 가이드

docker

Docker 명령 간략 정리 2/3

• docker build -t=name .o name : 저장하려는 이미지에 붙일 이름o . : 빌드하려는 대상 디렉터리

• docker commit ab12cd34 nameo ab12cd34 : 이미지의 고유 id

o name : 지정하고 싶은 이름

Page 39: Docker 간단 가이드

docker

Docker 명령 간략 정리 3/3

• docker imageso 이미지 목록을 보여줌

• docker pso 현재 실행 중인 이미지 목록을 보여줌(ps와 비슷)

• docker kill id (or name)o 실행 중인 이미지

• docker rmi id (or name)o 해당 이미지를 삭제

Page 40: Docker 간단 가이드

docker

더 읽을거리• docker.io의 개발자 kencocrane의 Docker Guide

Booko http://kencochrane.net/blog/2013/08/the-docker-guidebook/

• docker 공식 문서o http://docs.docker.io/en/latest/

• docker book (집필 중)o http://dockerbook.com/

Page 41: Docker 간단 가이드

Docker로서비스 배포를 편리하게!