Docker로 Rails 배포하기 (1)

Daekwon Kim

propellerheaven@gmail.com

nacyot

Leevi

오늘의 이야기

Docker

TOC

  • 1장 도커가 필요한 배경
  • 2장 도커의 이해
  • 3장 데모

1장 도커가 필요한 배경

  • Immutable Infrastructure

웹 개발

  • 기획
  • 구현
  • 배포

구현(Dev)

  • Ruby on Rails

배포(Ops) : 도커 x 레일스

  • Ruby on Rails
  • Rails application on Docker

배포 환경 구성

  • 서버 준비
  • 배포 환경
  • 의존성 설치 등 서버 구성

문제점

  • 시행 착오
  • 운용과 상태
    • 하드웨어 업그레이드
    • 의존 라이브러리
    • 어플리케이션 버전
    • 로그 파일

개인 컴퓨터와 다를 게 없음

PC의 흔한 사례

  • 컴퓨터(윈도우)가 안 돼요
    • 재부팅해보세요
    • 재설치해보세요

그래도 안 되요

  • 최근에 설치한 프로그램을 지워보세요
  • 시스템 복구해보세요
  • 윈도우를 다시 깔아보세요

시스템 상태 초기화

  • 재부팅
  • 재설치
  • 복구
  • 운영체제 재설치

PC는 상태 의존적

서버 운용

  • 서버도 상태(state) 의존적
    • 하드웨어 / 상태
    • 운영체제 버전 / 상태
    • 시스템 의존 라이브러리
    • 어플리케이션 의존 라이브러리
    • 어플리케이션 버전
    • 어플리케이션 설정
    • 네트워크 환경
    • 기타 등등등….

서버 운용은 오케스트라

  • invisible_orchestra.png

서버 운용은 오케스트라

  • 불행히도…

서버 운용이 어려운 이유

  • 서버의 상태는
    • 비가역적으로 변해나감
    • 재현 불가능(재설치는 능사가 아님)
  • 낯선 운영체제(리눅스)는 사소한 문제
  • 왜 되는 지 이해하기 어려움
  • 왜 안 되는 지 이해하기 어려움

  • The system becomes a house of cards. You fear any change and you fear replacing it since you don’t know everything about how it works.
    • Trash Your Servers and Burn Your Code: Immutable Infrastructure and Disposable Components, Chad Fowler

새로운 패러다임

  • Immutable Infrastructure

Immutable Infrastructure

  • 관리가능하고
  • 테스트 가능하며
  • Stateless하고
  • Scalable한
  • 이미지 기반의
  • 어플리케이션 배포

서버는 쓰고 버리는 Disposable Component

  • (개발 => 이미지 빌드 => 이미지 실행) 반복
    • 이미지 빌드 = 배포 환경 구축
  • 서버 운용은 하지 않음

참조

2장 도커의 이해

도커(Docker)

  • Immutable Infrastructure을 구현하는 대표적인 도구

도커(Docker)

  • 가상화 도구
  • 이미지 기반
    • 컨테이너를 통한 배포
    • Build once, Run everywhere
  • 프로그래밍 언어 Go

이미지

  • 프로그래밍에서 클래스
  • VMware나 VirtualBox에서 이미지
  • 기반 이미지에 레이어를 더해 생성
  • AUFS를 통해 Git처럼 버전 관리 가능
    • 용량이 크지 않음
  • 특정 상태가 그대로 저장되어있음
  • 실체 없음(!)

컨테이너 1

  • 프로그래밍에서 객체
  • VMware나 VirtualBox에서 가상머신
  • 하나의 이미지를 기반으로 생성
  • 하나의 프로세스만 실행
  • 실체 있음(!)

컨테이너 2

  • 모든 작업은 컨테이너 위에서만 가능(!)
  • 1 컨테이너 = 1 프로세스
  • 성능 손실 거의 없음
    • 커널 공유
    • 격리된 프로세스, 격리된 네트워크
    • 하드웨어 에뮬레이션 없음

도커의 가상화

Screenshot_from_docker.io_about.png

하나의 프로세스에서 다수의 프로세스 띄우기

  • foreman (Ruby)
  • supervisor (Python)

2장 데모

  • 설치
  • 기본 명령어
  • 레일스 어플리케이션(예정)
  • 도커 레지스트리(예정)