Docker(도커) 소개를 위해 사용했던 자료입니다.
제가 속한 개발팀에서는 도커 컨테이너를 기반으로 개발부터 배포까지 가능한 환경 및 인프라를 구축하여 개발팀에서 대다수의 오퍼레이션까지 관여하면서 Devops 형태로 운영합니다.
Docker(도커)를 처음 사용하거나 개념적으로 익숙하지 않은 초보를 위해 만든 자료입니다.
슬라이드에서 사용된 스크립트/코드는 아래에 있습니다.
https://github.com/ildoonet/docker_introduction
----
김일두, Software Engineer @ Kakao
Github : https://github.com/ildoonet
Linkedin : https://www.linkedin.com/in/ildoo-kim-56962034/
3. 모든 개발자가 한번은 겪을 불변의 패러다임
개발을 시작하면서
1. 나도 서버 개발을 해볼때가 됐군!
2. 음 어찌어찌해서 리눅스는 컴퓨터에 깔았는데…
3. 리눅스 명령어가 어색어색하니 세팅도 난잡하게 되네?
4. 서버를 계속 쓰다보니 의존성 문제가 생겨 기존에 돌던게 안돌기도 하잖아?!!!
5. 그럼 다시 서버를 재설치해야겠다!
개발을 하고나서
1. 자 이제 드디어 개발을 완료했군.
2. 여러대의 서버에 배포해볼까?
3. 스크립트(리눅스 명령어를 순서대로 텍스트 파일로 기록)를 하나 만들어서 모든 서버에서 동시에 돌려서 같은
세팅을 해야지!
4. 한 100대쯤 되니까 쉽지는 않네…
5. (1주일뒤) 엇, 업데이트를 해야하는데..?!!!!!
6. 업데이트하면서 디펜던시들도 업데이트하고, 서버 정리도하고 하다보니 서버별로 히스토리가 달라지네.
7. 그럼 모든 서버를 재설치해야겠다!!
4. 모든 개발자가 꿈꾸는 궁극의 패러다임
언제나 동일한 환경에서 개발할 수 있을까?
사양이 다른, 설치된 os가 다른, 설치된 소프트웨어가 다른 여러 서버에서 ‘동일하게’ 동작하는 것을 보장할 수 있
을까?
가상화기술(가상머신)은 속도가 느리고, 호스트머신의 자원을 모두 접근할 수 없다는 단점이 있는데, 이런 제약을
뛰어넘고, 오히려 호스트머신의 자원을 잘 관리할 수 없을까?
내가 만든 여러 어플리케이션들은 사용하는 자원(cpu, mem, disk, …)의 타입과 그 양이 서로 다른데, 한 서버를
잘 나누어 씀으로써 Utilization을 극대화할 수 없을까?
소프트웨어를 개발하고 버튼 하나 딱 누르면, 아무런 문제없이 모든 서버에 자동으로 배포되게 할 수 있을까?
트위터의 서버 관리 모습
5. Let’s Start With A Simple Example
From making [Docker Image]
To Deploy them on [Real Servers]
6. Simple Example Summary
docker hub 에 누군가가 만들어둔 ubuntu base image가 있었다
docker pull … 로 이미지를 내려받았다.
docker run … 로 이미지를 컨테이너로 형태로 실행했다.
컨테이너에 라이브러리도 설치하고, 소스파일도 복사해서 실행가능한 수준으로 변경을 가했다.
docker commit … 으로 컨테이너를 이미지로 저장했다.
동일한 이미지를 복사해 여러 대의 서버에 배포해, 웹 서비스를 실행했다.
Base Image
Container
Image
Deploy
8. Immutable Infrastructure #1
Cloud 환경으로의 변화
클라우드 환경에서의 잦은 설치와 배포
스크립트는 어떨까? “ansible”
- 사소한 설정 하나가 안정성에 영향을 미침
- 지속적인 설정의 반복으로 복잡한 구성을 갖는 시스템으로 계속해서 변화해 감
Immutable Infra : 서비스 환경과 운영 환경을 분리할 수는 없을까?
- 서비스 환경 : 컴파일된 바이너리
- 운영 환경 : 호스트 OS에 필요한 dependancy 설치, 설정 등이 완료된 상황
분리되지 않은 사례
- 인프라시스템 아지트 : “서비스 투입을 위해 APDS 1~16번까지 아래와 같이 초기화부탁드립니다.”
DevOps의 시대.
9. Immutable Infrastructure #2
서비스 환경과 운영 환경을 어떻게 분리할까.
운영 환경
- OS, dependency, 설정값 등은 1회 설정하면 계속 유지될 것
- 그렇다면 운영 환경을 [이미지]로 생성해두고 반복해서 사용할 수 있다면 좋을 것
- GPU Driver 설치된 ubuntu. + python…
서비스 환경
- 내가 만든 변화가 반영하여 배포될 수 있는 인프라가 필요함
- 변화된 만큼만 전달될 수 있다면 가벼운 서비스 배포가 될 것
- scale-out 에 유리하게 설계되어야 좋을 것
- python application
10. Micro-service & high availability
One Giant Big Application 을 만들었더니
- 변화를 만드는 것이 힘든 구조가 되어가고
- 테스트가 힘들어지고
- scale-out에 불리함
하드웨어적인 개선과 소프트웨어 패러다임의 변화로 마이크로 서비스 중심의 서비스 설계가 주류를 이룸
- 각 모듈의 작고 사소한 변화를 각 모듈에서 테스트하고 배포
- 각 모듈들이 서로 잘 조합되어 하나의 서비스를 구성함
- scale-out에 유리함
수요예측적인 인프라 설계에서 수요대응적인 인프라 설계로의 변화
13. Virtual Machine / Docker
The difference between a VM image and a Docker image is that
a VM image can have running services, whereas
a Docker Image is just a filesystem snapshot
…
while you can configure the image to have your favourite packages,
you can run only one command in the container.
14. Virtual Machine / Docker
Performance
- 연산관련해서는 1% 내외 수준의 성능 차이
- KVM보다 다양한 면에서 낫거나 비슷하며 native보다 크게 떨어지지 않음
- 네트워크는 host 모드일 때 좀 더 성능이 잘 나옴
- http://domino.research.ibm.com/library/cyberdig.nsf/papers/
0929052195DD819C85257D2300681E7B/$File/rc25482.pdf
안정성
- 현재 버전 1.9에서 많은 안정화가 이루어짐
- 기존과는 다른, 예측하기 힘든 문제가 생기기도 함
- docker 자체에도 버그가 있음 (eg. docker exec 커맨드가 메모리 릭 등의 원인이 되기도 함)
- docker service / libcontainer가 process 생성 관리 등에 관여하다보니 생기는 side-effect
- driver 등과 결합되어 생기는 문제들이 있을 수 있음
libcontainer
- 리눅스 자체적으로 제공하는 lxc
- docker inc. 에서 개발한 libcontainer
- docker 실행 시 옵션으로 설정 가능함
15. Docker’s Mission
Docker containers are guaranteed to run the same way,
be it on your development desktop, a bare-metal server, virtual machine, data centre or cloud.
16. Terminologies
Docker Daemon
- process that manages containers
- not docker client
- sudo privileges - security issue
Docker Client
- start / manager containers interacting with daemon
- RESTful API
Dockerfile
- instructions on setting up a Docker Image
Docker registry - repository
18. Docker Image / Container
By Default, Docker uses AUFS, a layered copy-on-write filesystem
…
the container image’s filesystem is a culmination of multiple read-only filesystem layers
19. Docker Image / Container
Image <—————-> Container
1개의 이미지를 여러 컨테이너로 실행할 수 있음
컨테이너에서 변화를 일으킨 것을 commit 하면 또 다른 이미지를 만들어낼 수 있음
20. Docker Image / Container
Images can be stored in repo (called registry)
- locally
- remotely
Snapshots are called commits.
You pull an image from repo
You push your local image to a repo, and so on.
- 공식 Hub Repo : https://hub.docker.com
- 사내 Hub Repo : http://hub.docker.9rum.cc/search/repos
22. Docker Image / Container Example #2
Alvolo Thumbnails Demo : Image Layers
Host Kernel
Base Image : Ubuntu 14.04
Base Image : alvolo-ubuntu-20151208
Python Web Application
운영환경
서비스환경
23. System Architecture Using Docker
1 Machine Service - Legacy Way
Host Kernel
Base Image
Ubuntu 14.04
Base Image2
Web Application
1 Machine Service - Docker Way
Base
Image
MySQL
Base Image
Ubuntu 14.04
Redis
link
link
Host Machine
Web Application
MySQL
Redis
*Multiple Machine인 경우에 Ambassador Container를 이용해
컨테이너들을 서로 연결함
26. Docker Commands - Sneak peak
Commands 설명
search 이미지 검색
pull 이미지 받기
images 이미지 목록 보기
run 이미지를 컨테이너로 생성하기
ps 컨테이너 목록 보기
start 중지된 컨테이너 시작하기
attach 컨테이너에 접속하기
exec 컨테이너에 명령어 실행하기
stop 컨테이너 정지하기
rm / rmi 컨테이너 / 이미지 삭제하기
commit 컨테이너를 이미지로 생성하기
history 이미지의 히스토리보기
diff 컨테이너에서 변경된 파일 확인
cp 파일 꺼내기 혹은 파일 복사하기
27. docker run
$ sudo docker run -i -t —name webapp ubuntu:latest /bin/bash
docker run <option> <image> <command>
-i, -t 옵션을 주어야 bash shell에 입력 및 출력할 수 있음
-d 백그라운드로 컨테이너 실행함
-p 호스트의 포트와 컨테이너의 포트를 연결함
-v 호스트의 디렉터리를 컨테이너의 특정 디렉터리에 연결함
—rm 옵션을 주면 컨테이너가 종료될 때 자동으로 컨테이너가 제거됨
<command> : /bin/bash 이므로 bash shell 로 실행됨
28. docker exec
$ sudo docker exec webapp python cron_job.py
docker exec <option> <image name> <command>
실행 중인 컨테이너에 명령어 실행함
apt-get 등으로 패키지 설치나 데몬 실행 등 가능
dockerfile에 실행 커맨드가 이미 지정되어 있는 경우 다른 작업을 하고싶을 때 사용하면 유용
32. 오픈 소스를 이용해 Docker 관련된 인프라 구축 필요함.
Mesos + Marathon + Chronous 구축은 필수.
- 이 위에서 Docker 로 구워진 어플리케이션이 원하는 형태로 수행되도록!
- AWS 내지는 우리가 가진 서버 목록을 Slave로 등록하기만 하면 됨.
- 1월 내 구축 예정. 최소사양 Instance로 Master/Proxy등 구축하고 고사양 서버는 생기는대로 붙이
는 형태로 하면 됨.
Docker Image를 저장할 수 있는 Registry(Hub) 구축 필수.
- 버전별로 구워진 어플리케이션을 저장하고, 배포 시 이미지 복사의 중심이 될 서버 구축 필요.
- 고사양 필요없고, 하드디스크만 겁나 크면 됨…
- 3줄의 스크립트로 서버 구축 가능.
- 명령어에 취약한 많은 사람을 위해 Web UI도 같이 배포 예정 : http://port.us.org/
AWS Lambda
- 구축 예정 없지만, 이후에 서비스를 런칭한다고하면 AWS Lamda 기술을 통해 비용을 매우 절감할
수 있을 것으로 예상함.
34. Not an appendix! #1
Apache Mesos + Apache Marathon + Chronos 조합으로 많이 쓴다
- 카카오는 사내 서비스인 DKOS 가 이 역할을 해줌
- AWS에는 DCOS, lambda 등 존재.
- git push 하면 자동으로 docker image build하고, 배포까지 됨
Dockerfile에 Command에 Argument를 비워두기도 한다
- 비워두면 “docker run” 할 때 Argument만 넣어주면 실행
*
35. Not an appendix! #2
docker run
- 호스트의 디바이스를 마운트 가능함
- 특정 CPU 코어만 사용하도록 설정할 수도 있음
- CPU Share의 relative한 값도 지정할 수 있음
- DNS 등 설정할 수 있음
- 컨테이너가 비정상 종료된 경우 재 실행되도록 하는 옵션도 따로 제공함(default=no)
docker container 끼리 연결해서 많이 사용함
- mysql container <—-> web server
- 동일 머신 내에서 실행 중인 컨테이너 뿐만 아니라 remote 하게 떨어진 컨테이너도 연결할 수 있음
- scale-out에 매우 유리함
- Ambassador Pattern
Highly Available Service
- horizontally scalable
- Fault tolerant
- Modular
36. Not an appendix! #3
Docker 안에 Docker를 띄우기도 한다.
Docker 바이너리는 Docker로 굽는다.
Docker hub에서 dockerfile들을 보다보면 어떻게 docker를 써야할지 좀 더 빠르게 느낄 수 있다.
Books
- 가장 먼저 만나는 Docker
- Orchestrating Docker
Youtube Videos
- Docker at Shopify : https://www.youtube.com/watch?v=Qr0sATj9IVc
- Docker fundamentals: basics, storage, networking - Introduction to Docker : https://
www.youtube.com/watch?v=UV3cw4QLJLs
- How We're Using Docker : https://www.youtube.com/watch?v=GMR8DAPN1lk