배포할때 알면 좋은 TIP
by @subicura


1st DOCKER KOREA study / July 18, 2014

tips


  • Dockerfile
  • Log
  • Base Image
  • Only 1 Process
  • Deploy with image
  • Volume Container

Dockerfile


1. 적극적으로 cache를 활용

DOCKERFILE CACHE RULE

  • (스페이스 하나라도) 명령어가 변할때
  • ADD 하는 파일이 수정되었을 때
(예전버전은 ADD는 CACHE가 안됐음)

TIP!!

자주 변하지 않는건 상단에
자주 변하는건 하단에

BUNDLE INSTALL


개선전

ADD . /app
RUN bundle install 

개선후

ADD Gemfile /app/Gemfile
ADD Gemfile.lock /app/Gemfile.lock
RUN bundle install
ADD . /app 

gem은 자주 바뀌는게 아니므로 상단으로 변경함

Dockerfile


2. 필요한 파일만 이미지에 추가

필요한파일?

  • 도커 이미지는 구동에 필수적인 파일로 구성
  • test/spec 파일은 제외
    • 테스트 이미지 파일이 많을 경우 용량이 큼
  • 버전관리 파일(.git)은 제외
    • 은근 용량 큼
  • 임시 파일(temp)은 제외

ADD files


개선전

ADD . /app

개선후

ADD ./app /app/app
ADD ./config /app/config
ADD ./lib /app/lib
ADD ./public /app/public
ADD ./Procfile /app/Procfile

Log


  • 로그는 파일대신 STDOUT으로 출력
  • 정말 중요한 건 외부연동
    • Logstash
    • Fluentd
    • 등등

로그보기

$ docker logs -f {container_id}

Base Image


Base Image
==
MINIMAL
==
minimal environment
==
minimal server process

Timezone


default timezone : UTC

로그 볼때 불편함

설정하기

RUN ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

User home


default root home directory : / (not /root)

설정하기

export HOME=/root

Root user


root 계정으로 실행함

간혹 root 계정으로 실행시 경고하는 프로그램이 있음
=
무시

No extra process


no ssh
no syslog
no cron
...

ssh server 설치는 할 수 있지만 하지 마세요

더 자세한건

http://blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker/

Only 1 process


가능하면 하나의 컨테이너는 하나의 작업(process)만
하지만 여러개를 실행 못하는건 아님

  • supervisord (python)
  • foreman (ruby)
    • STDOUT 관련 버그있음
  • forego (go)
    • foreman과 사용법 동일

Deploy with image


CI

  1. create image
  2. push image to private docker registry

Docker Host

  1. pull image from private docker registry
  2. stop container
  3. start new container

Zero downtime deploy


stop container와 start new container 사이
접속 불가 시간이 존재함

Load Balancing

  • haproxy
  • hipache
  • nginx

minimum - 2 containers


Volume Container


Docker에서 파일을 관리하는 2가지 방법

Data Volumes

Host의 Directory에 Container의 Volume을 mount하여 사용

Data Volume Containers(추천!!)

volume container를 mount하여 사용

Data Volumes


사용법

$ docker run -d -v /upload:/uplaod subicura/webapp

쉽고 간단하지만 관리가 어렵고 모듈화되어 있지 않음

Data Volume Containers


사용법

$ docker run -d --volumes-from appdata subicura/webapp

파일에 바로 접근할 수 없어 언뜻 사용법이 어렵지만
추상화하여 관리할 수 있고 모듈화 할 수 있음

그리고.. 썻다 지웠다 반복도 편함

Create Data Volume Containers


busybox

simplest docker image for data volume(2mb!!!!)

사용법
FROM busybox
VOLUME /data
CMD /bin/sh 
$ docker build -t subicura/appdata .
$ docker run --name appdata subicura/appdata

또는 심플하게

$ docker run --name app_data -v /data busybox /bin/sh

Backup


백업? 복구?

기본적인 ubuntu image로 Data Volume Container를 마운트 한 후
파일 작업을 수행

$ docker run --volumes-from appdata -v $(pwd):/backup ubuntu \
tar cvf /backup/backup.tar /dbdata

복구는 생략!





시연

LIVE CODING







thank you :)
Made with Slides.com