2. 누구세요?
• 김훈민. (동생 이름이 정음)
• 결혼 3년차 남편이자 두 아이의 아빠.
• ~2011 웹 개발.
• ~2014 성능팀, 오픈소스 메모리 캐시인 Arcus 개발/운영.
• ~2015 빌드 배포 시스템인 nDeploy팀 소속.
3. 다룰 내용
• Docker & Linux Container
• Tutorial
• Container Orchestration
4. 지옥에서 온 테이블
node.js
웹 서버
Java
API 서버
MySQL
서버
메시지 큐
서버
개발자
PC
동료
PC
팀
개발 장비
QA
개발 장비
스테이징
장비
리얼
장비
* Table based on http://www.slideshare.net/dotCloud/docker-intro-november
5. 지옥에서 온 테이블
node.js
웹 서버
Java
API 서버
MySQL
서버
메시지 큐
서버
개발자
PC
동료
PC
팀
개발 장비
QA
개발 장비
스테이징
장비
리얼
장비
* Table based on http://www.slideshare.net/dotCloud/docker-intro-november
11. 각 플랫폼, 모듈을 어디에서든 실행할 수 있는
코드를 위한 컨테이너가 있으면 되겠네요!
12. 리눅스 컨테이너
• 이미 오래 전 부터 LinuX Container 라는 기능이 있었습니다.
• 호스트 환경과 독립된 리눅스 시스템(컨테이너)를 실행하기 위한
시스템 레벨의 가상화 방법. (Hypervisor 없는 VM?)
• cgroup
• namespace
• chroot
• Linux Security Modules(LSM), Mandatory Access Control(MAC)
13. cgroup
• 2006년 구글에서 개발하여 2.6.24 커널에 포함.
• 각종 시스템 리소스에 대한 접근 제어와 리소스 제약을 담당.
• 각 리소스는 subsystem이라 부릅니다.
• /sys/fs/cgroup 디렉토리에서 각 subsystem을 확인할 수 있음.
• 만약 /sys 디렉토리가 없다면:
• sudo mount -t sysfs sysfs /sys
15. namespace
• 글로벌 리소스에 대한 프로세스 수준의 격리(isolation)를 제공.
• MNT (마운트 지점, 파일시스템)
• PID (프로세스)
• NET (NIC, 라우팅)
• IPC (System V IPC 리소스)
• UTS (호스트/도메인 이름)
• USER (UID + GID)
• 격리된 프로세스는 자기 자신이 시스템에서 유일하다고 착각한다: /proc/1
https://www.kernel.org/doc/Documentation/namespaces/
16. chroot
• 프로세스의 root 디렉토리를 변경 할 수 있다.
• chroot
• parent 디렉토리를 유지하면서 root 디렉토리를 마운트.
• pivot_root
• parent 디렉토리 없이 root 디렉토리를 마운트.
23. Docker
• 도커 Daemon을 통해 리눅스 컨테이너를 실행하면:
• 도커 이미지를 이용하여 새로운 컨테이너를 위한 파일 시스템을
구성합니다.
• 컨테이너를 위한 네트워킹 설정을 변경해줍니다.
• 격리된 컨테이너 프로세스를 실행합니다.
25. Docker Toolbox
• 윈도우와 맥에 도커 개발 환경을 꾸며 줍니다.
• https://www.docker.com/docker-toolbox
• 맥에서는 homebrew로 설치 가능.
• $ brew install Caskroom/cask/dockertoolbox
26. Docker Toolbox
• docker: 도커 클라이언트.
• docker-machine: 도커 서버를 실행할 수 있는 VM 관리.
• docker-compose: 여러 개의 도커 컨테이너를 실행.
• kitematic: 개발 장비의 도커 컨테이너를 쉽게 관리할 수 있는 앱.
• virtualbox: VM
27. docker-machine
• $ docker-machine create -d virtualbox dev
• dev라는 이름을 가진 virtualbox 도커 VM을 생성.
• $ docker-machine ls
• 생성된 도커 VM 리스트를 확인.
• $ docker-machine ssh dev
• dev VM에 접속.
28. docker-machine
• $ docker-machine env dev
• dev 도커 VM을 사용할 수 있는 환경변수 설정을 확인한다.
• $ eval $(docker-machine env dev)
• 현재 쉘에서 dev 도커 VM을 사용할 수 있도록 환경변수를 설정.
• $ docker-machine stop dev
• $ docker-machine rm dev
29. docker
• $ docker run -it --rm busybox top
• -it : 실행된 컨테이너와 상호작용 할 수 있도록 설정.
• --rm : 컨테이너 실행이 끝나면 삭제.
• busybox : 실행할 컨테이너.
• top : 컨테이너가 실행할 명령의 옵션.
42. Link
• 같은 호스트에 있는 컨테이너를 연결하여 호스트에 포트를 노출시
키지 않아도 직접 통신할 수 있게 해줍니다.
• docker run -d --name db -p 3306:3306 -e
MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=xe -e
MYSQL_USER=xe -e MYSQL_PASSWORD=xe mariadb
• docker run -d -p 80:80 --link db:db hoonmin/xecore:1.8.14
• --link <name>:<alias>
43. 두 컨테이너를 함께 실행할 수 없나요?
XE Core
MariaDB
:80docker-compose XE Core :80
44. docker-compose
• 여러 개의 도커 컨테이너를 묶어 함께 실행할 수 있습니다.
• docker-compose.yml 파일을 정의해야 합니다.
• docker-compose up -d
• up : 정의된 컨테이너를 실행.
• -d : 백그라운드로 실행.
docker-compose.yml
xecore:
image: hoonmin/xecore:1.8.14
ports:
- 80:80
db:
image: mariadb
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: xe
MYSQL_USER: xe
MYSQL_PASSWORD: xe
ports:
- 3306:3306
45. 도커 호스트가 여러 개
XE Core :80XE Core :80
XE Core
MariaDB
:80XE Core :80
46. docker-swarm
• 여러 개의 도커 호스트를 마치 하나인
것 처럼 묶어주는 서비스.
• master는 node를 관리하며 도커 API
와 동일한 API를 제공.
Master
Node
48. swarm을 이용하여 배포
• eval $(docker-machine env --swarm swarm-master)
• swarm-master 도커 VM 환경에서 swarm API를 사용.
• docker-compose up -d
• 도커 컨테이너가 swarm-master, swarm-node-01 두 대의 서
버에 적절히 배분되어 실행됩니다.
• docker-compose scale xecore=2
• xecore 컨테이너의 개수를 2개로 늘립니다.
51. docker networking
• libnetwork
• 도커의 네트워크 관련 코드가 들어 있는 라이브러리.
• 도커 1.7 부터 실험적으로 포함되었다가 1.9 버전에서 정식 출시.
• docker network ls
• docker network create -d overlay my_net
52. built-in overlay network
• overlay network
• 같은 L2 (MAC) 네트워크에 연결되어 있지 않은 서버들이 서로
L2 통신을 할 수 있도록, 터널링 등의 기술을 활용.
53. networking을 위한 도커 VM
• docker-machine create -d virtualbox consul
• docker $(docker-machine config consul) run -d -p 8500:8500 -h consul
progrium/consul -server -bootstrap
• docker-machine create -d virtual box
• --swarm —swarm-master
• --swarm-discovery="consul://$(docker-machine ip consul):8500”
• --engine-opt="cluster-store=consul://$(docker-machine ip consul):8500
• --engine-opt=“cluster-advertise=eth1:0” swarm-master
54. 다시 docker-compose
• 도커 1.9 부터 docker-compose와 networking이 연동됩니다.
• docker-compose --x-networking --x-network-
driver=overlay up -d
• --x-networking : networking 실험 기능을 활성화 합니다.
• - -x-network-driver : networking 드라이버를 선택합니다.
• null, host, bridge, overlay, calico, …
65. Timezone
• 도커 컨테이너가 실행될 때 timezone이 디폴트로 맞춰집니다.
• 그런데 이 timezone을 설정할 좋은 방법이 아직은 없습니다.
• https://github.com/docker/docker/issues/12084
• -v /etc/localtime:/etc/localtime로 볼륨 설정.
• ENTRYPOINT에 별도의 스크립트를 둬서 런타임에 설정.
66. Private Registry
• docker run -d -p 5000:5000 registry:2.2
• 예전 v1 버전은 가능하면 사용하지 마세요.
• 꼭 필요하다면 검색기능 OFF
• LDAP 등의 인증을 붙이려면 별도의 인증 서버를 사용해야 합니다.
• https://github.com/cesanta/docker_auth
• UI가 필요한 경우:
• https://github.com/SUSE/Portus
67. 스토리지 드라이버
• DeviceMapper
• 스토리지 pool 크기에 주의. (100GB default)
• AUFS, Overlay (추천)
• 비슷한 성향의 파일시스템. Overlay는 3.18 커널부터 지원.
• 파일 개수가 많아지면 느려지거나 쓰기가 불가능해질 수 있다.
• overlay는 inode 개수를 모니터링 해주어야 한다. (df -ih)
• BTRFS
68. docker-proxy
• 포트를 publish 하면 다음과 같이 두 개의 장치가 마련됩니다.
• iptables DNAT rule, docker-proxy 프로세스
• 왜 뜨는가?
• 도커 호스트에서 localhost:<published_port>로 접근하기 위함.
• https://github.com/docker/docker/issues/8356
• 없애는 방법 (2.6.x 커널 제외)
• docker daemon --userland-proxy=false ..