1. Docker 이해 및 설치
Docker Toolbox 설치 - https://www.docker.com/toolbox
1.1 Docker란?

Solomon Hykes (Docker's co-founder & CTO) 가
dotCloud 내부 프로젝트로 Docker 시작,
2013년 3월 Open Source로 release (Apache 2.0 license)

Docker: 리눅스 기반의 가상화 솔루션.
다른 가상화 솔루션들과 다른 점은 리눅스 LXC를 기반으로 가상화 환경을 구성하여, 기존 가상화 솔루션에 비해 훨씬 가볍다는 점.
Docker에서는 이 가상화 공간을 "컨테이너(container)"라고 부르는데, 물류에서의 화물 컨테이너와 같은 역할


Challenge

Challenge
Docker는 기본적으로 클라이언트/서버 아키텍처로 동작.
서버측에 docker 데몬(daemon)이 떠 있고, 클라이언트 측에서 tcp 프로토콜로 서버에 access하는 구조. (REST API도 제공)
Docker의 구성요소
- Server(Docker Daemon): 컨테이너를 관리하고 실행
- Client: 사용자와의 인터페이스 제공
- Registry: Image 저장소
- Image: 라이브러리, 실행 파일, 소스코드 등이 패키징된 것
- Container: 하나 이상의 Image가 동작하는 것

출처: http://www.slideshare.net/rkawkxms/docker-container
Docker Server & Client
-
Docker Server(Docker Daemon)
-
Host machine에서 컨테이너를 관리하고 실행하는 데몬
-
-
Docker Client
-
Docker와 사용자 간 인터페이스 제공
-

출처: http://www.slideshare.net/rkawkxms/docker-container
Docker Registry
-
Image 저장소 (Public 과 Private)
-
Docker Hub는 Docker, Inc에서 제공하는 public registry

출처: http://www.slideshare.net/rkawkxms/docker-container
Docker Image & Container
출처: http://www.slideshare.net/rkawkxms/docker-container

Docker 기반 기술 (Underlying Tech)
출처: http://www.slideshare.net/rkawkxms/docker-container

LXC & libcontainer
출처: http://www.slideshare.net/rkawkxms/docker-container
- 컨테이너 라이프사이클 관리 기술
- 과거에는 "chroot" 명령어로 컨테이너 생성
- 직접 하위 경로에 실행 파일과 공유 라이브러리를 설치해야 함
- 완벽한 가상화 환경이 아니어서 제약 사항이 많음
- 설정이 복잡함
- 과거에는 "chroot" 명령어로 컨테이너 생성
- LXC
- 초기 Docker에서 사용된 Linux용 컨테이너 관리 기술
- namespaces, cgroups를 사용해 컨테이너를 생성/관리함
- Linux 2.6.24에서 처음 발표
- libcontainer
- Docker version 0.9 이후부터 default로 사용 (최신 버전 1.8.1)
- Linux 플랫폼에 의존적인 LXC를 대체하기 위해 Docker에서 만든 기술
- Go 언어로 구현
cgroups (Control groups)
출처: http://www.slideshare.net/rkawkxms/docker-container
- 컨테이너의 컴퓨팅 자원을 제어하는 기술
- 프로세스 집단의 자원(CPU, memory, disk I/O, network, etc) 관리 기능
- 2006년 Google에서 개발 시작
- 초기 이름은 "process container" 였으나, 2007년 "control groups"로 변경
- Linux 2.6.24 이상 버전부터 지원
- 기능
- Resource limitation: 설정한 메모리 이상 사용하지 못하도록 보호
- Prioritization: 그룹에 따라 CPU 사용량 또는 디스크 I/O 분배
- Accounting: 자원 사용량 측정
- Control: 사용 중단, 체크 포인트 설정, 재시작 등
namespaces
출처: http://www.slideshare.net/rkawkxms/docker-container
- 컨테이너를 만들기 위한 프로세스 가상화 기술
- 하이퍼바이저를 사용하지 않고 격리된 가상 공간을 제공
- 구현 기술
- clone() - 새로운 프로세스와 새로운 namespace 생성
- unshare() - 존재하는 프로세스에 새로운 namespace 생성
- setns() - 존재하는 namespace에 합류
- namespaces 종류
- PID namespace: 프로세스 격리에 사용 (PID: Process ID)
- NET namespace: 네트워크 인터페이스 관리 (NET: Networking)
- IPC namespace: IPC 자원 접근 관리 (IPC: InterProcess Comm.)
- MNT namespace: mount-points 관리 (MNT: Mount)
- ...
가상화 컨테이너는 "이미지(image)" 형태로 저장되고 관리.
이미지는 기존 VM 방식의 가상화 이미지들과 달리 경량.

Docker 이미지들은 주로 Dockerfile이라는 설정파일로 빌드되고, 빌드 시에는 git과 유사한 형태로 증감분만 저장되는 방식이며, Docker에서 공개한 퍼블릭 저장소 또는 private 공간에 저장

Docker Networking
-
Default gateway로 Linux bridge인 docker0 생성
-
외부 네트워크로 나가는 패킷을 위해 NAT 작업 수행
-
컨테이너 간 네트워크 연결
-
-
각 컨테이너에 격리된 네트워크 공간을 만들고 컨테이너의 eth0에 static IP 할당
-
컨테이너 내부의 eth0와 docker0을 연결하기 위한 veth 인터페이스 생성

출처: http://www.slideshare.net/rkawkxms/docker-container
출처 및 참고 자료
1. 출처
- Docker란 무엇인가? : Docker 기본 사용법
2. 참고 자료
- Docker 웹사이트
3. Advanced - The Docker Ecosystem
- Service discovery tools
: etcd, consul, zookeeper, ...
- Networking tools
: flannel, weave, pipework
- Orchestration tools
: fleet, swarm, kubernetes, marathon, mesos, ...
1.2 Docker 설치 및 실습
Docker Toolbox 설치 - https://www.docker.com/toolbox
OS X(or Windows) natively docker를 지원하지는 않습니다.
그래서, VM을 생성하고 그 안에서 docker daemon이 설치되고, docker image가 다운로드/생성되고, docker container가 실행

Docker Machine
-
Docker host 서버를 생성할 수 있게 해 주는 도구
-
On your computer, on cloud providers, and inside your own data center
-
-
Docker host 서버를 생성하고, Docker를 설치하고, Docker client가 해당 서버와 통신하도록 설정

Docker Compose
-
복잡한 application을 Docker로 정의하고 실행하기 위한 툴
-
여러 개의 컨테이너로 구성된 application을 하나의 파일에 정의하고, 실행
-
docker-compose up
-
docker-compose scale web=2

그림 출처: http://www.slideshare.net/RyanHodgin/docker-overview-rise-of-the-containers
Docker 명령어 (첫 시간 실습에 주로 사용될)
- docker build: Dockerfile로 이미지 생성
- docker run: 이미지로 컨테이너 생성/실행
- docker search: Docker hub에서 이미지를 검색
- docker pull: Registry에서 이미지를 받아 옴
- docker push: Registry에 이미지를 올림
- docker inspect: 컨테이너와 이미지의 세부 정보 출력
- docker images: 현재 사용 가능한 이미지 목록 출력
- docker ps: 실행중인 컨테이너 목록 출력
- docker rm: 컨테이너를 삭제
- docker rmi: 이미지를 삭제
Docker 이해
By Kwangyoung Kim
Docker 이해
- 2,353