docker 연구하기
docker란 무엇인가?
도커는 2013년 3월 산타클라라에서 열린 Pycon Conference에서 dotCloud의 창업자인 Solomon Hykes가 The future of Linux Containers 라는 세션을 발표하면서 처음 세상에 알려진, 컨테이너 기반의 오픈소스 가상화 플랫폼 이다.
일반적으로 수송에 사용하는 컨테이너도 옷, 신발, 전자제품, 술, 과일등 다양한 화물을 넣어 규격화되어 다양한 운송수단으로 옮길 수 있다.
서버에서 이야기하는 컨테이너도 서비스 운영이 필요한 다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순 하게 해준다.
백엔드프로그램, 데이터베이스 서버등 어떤 프로그램도 컨테이너로 추상화 할 수 있고 조립PC, AWS, Azure등 어디에든 실행 할 수 있다.
docker 등장 배경
하나의 서버에 여러프로그램을 설치하게 되면, 서로 사용하는 라이브러리의 버전이 다르거나 동일한 포트를 사용하는 경우 설치가 굉장히 까다로워지게 된다. 또한 시간이 흐르면서 서버 환경은 계속 변하는데( ex CentOS와 Ubuntu) , 물론 서로 다른 서버에 설치할 수 있으면 좋겠지만 보통 개발자들이 쓸수 있는 자원은 한정적이다.
2010년을 넘어서면서는 사용요금만 내고 가상서버를 빌려쓰게 되는 클라우드 환경으로 변하게 되며, 클라우드 환경에서는 클릭 몇번으로 가상 서버를 만들 수 있게 되었다. 하지만 생성된 가상 서버에 각종 소프트웨어를 설정해야 하는데, 서버가 한두대면 쉽게 가능하지만 서버 갯수가 많아지면 사람이 일일이 설정하기가 어려워 진다. 따라서 클라우드 환경에서는 서버를 생성하는 것은 쉬워졌지만, 소프트웨어 설치와 배포 가 큰 어려움으로 다가왔다.
이때, immutable infrastructure(불변의 인프라) 라는 패러다임이 등장했는데, 이것은 호스트OS와 서비스 운영 환경(서버 프로그램, 소스코드…)을 분리하고 한번 설정한 운영환경은 변경하지 않는다 라는 것을 의미한다.
- 호스트OS : 호스트에 설치된 OS, 물리머신에 설치된 OS
- 게스트 OS : 가상머신(VM)에 설치된 OS
즉, 서비스 운영환경을 이미지로 생성한 다음, 서버에 배포하여 실행 한다. 만약 서비스 운영환경이 변경되면 운영 환경 자체를 수정하는 것이 아니라 버리고 다시 배포 하는 방식이다.
복잡한 서버관리 방식을 해결하기 위해 immutable infrastructure을 구현한 docker(도커)가 등장하게 되었다.
가상머신과 docker의 차이점
기존에는 가상머신에 리눅스를 설치한뒤, 각종 프로그램과 DB를 설치한 후 개발한 애플리케이션을 실행하였다. 또한 구축한 가상머신 이미지를 복제하여 동일한 환경의 여러개의 서버를 실행하기도 하였다.
가상머신(VMware, VirtualBox)은 전가상화(Full virtualization) 방식으로, 호스트OS위에 게스트OS전체를 가상화하여 사용하는 방식 이다.
- 전가상화 : 호스트 서버 장치인 하드웨어를 완전하게 가상화하는 방식, GuestOS는 모든 하드웨어 접근 명령을 하이퍼바이저를 통해 진행한다. 그래서 전가상화보다 낮은 성과를 나타낸다. 이 방식은 GuestOS를 수정할 필요가 없는 장점이 있다.
그림 1. 전가상화 계층도(출처 : http://virtualhive.tistory.com/36)
그림 2. 가상머신 계층도(출처 : https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html)
가상머신의 단점을 개선하기 위해 반가상화(Paravirtualization)방식의 Xen이 등장한다.
-
하이퍼바이저: 컴퓨터에서 다수의 운영체제를 실행하기 위한 논리적인 플랫폼(소프트웨어)
-
반가상화 : 하이퍼바이저가 모든 명령을 중재하지 않고 필요한 부분만 처리한다. 전가상화와 다르게 직접 하이퍼바이저에게 하이퍼콜을 요청하여 통신한다. (시스템콜과 유사) 게스트OS의 커널의 일부분을 수정해야하기 때문에 게스트OS는 오픈소스에 한정된다.
그림 3. 반가상화 계층도(출처 : http://virtualhive.tistory.com/36)
도커는 반가상화보다 좀 더 가벼워진 방식으로, 추가적인 게스트OS를 설치하지 않고 도커 이미지에 서버 운영을 위한 프로그램과 라이브러리만 설치하고 OS 자원은 호스트와 공유하는 방식 이다. 가상머신과 달리 이미지에 OS가 설치되어 있지 않기 떄문에 이미지의 용량 자체가 줄어들기 때문에 배포에도 빠르다. 하드웨어, 운영체제를 가상화 하는 곳 자체가 없기 때문에 메모리 접근 속도, 파일시스템 사용 속도, 네트워크 속도 등에서 가상머신에 비해 월등히 빠른 속도를 가지게 된다. 또한 git에서 소스를 관리하는 것처럼 이미지 버전을 관리할수도 있으며, 중앙 관리를 위해 저장소에 이미지를 올리고 (push), 내려받을수도 있다. (pull)
도커는 LXC 기반으로 시작해서 0.9버전에서는 libcintainer 기술을 사용하여 개발하고 있다.
그림 4. 도커 계층도(출처 : https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html)
- LXC : 리눅스 컨테이너, 리눅스 커널 레벨에서 제공하는 디렉토리 경로를 격리하는 공간을 의미, 이 가상공간에 OS는 설치할수 없기 때문에 컨테이너라고 부른다. cgroups, namespaces을 기반으로 이미지, 컨테이너 생성 및 관리 기능을 제공
- cgroups: cpu, 메모리, 디스크, 네트워크 자원을 할당하여 완전한 형태의 가상공간을 제공, 자원을 격리 시키는 것
- namespaces : 사용자계정, 파일 시스템등을 격리시켜 호스트와 별개의 공간을 생성
1.2 이미지와 컨테이너
베이스이미지는 부팅에 필요한 실행파일과 라이브러리만 설치된 배포판 파일을 의미한다.
도커에서 말하는 이미지는 주로 베이스이미지에 필요한 프로그램과 라이브러리, 소스등을 설치한뒤 하나의 파일로 만드는 것 을 의미한다.
즉, 컨테이너 실행에 필요한 파일, 설정값들을 포함하고 있는 것이다.
베이스 이미지에 프로그램과 라이브러리, 소스는 중복되어져서 설치되는 것이 아니라 바뀐 부분만 이미지로생성하고 실행 할때, 베이스 이미지와 바뀐 부분을 합쳐서 실행 한다.
만약 기존이미지에 추가한 파일을 위해서 다시 수백메가의 이미지를 다운받는다면 비효율적이다.
그래서 도커는 이미지를 통째로 생성하는 것이 아니라, 바뀐 부분만 생성한다음 부모 이미지를 참조하는 방식으로 동작하는데 이를 레이어라고 한다.
그림 5. 도커 이미지(출처 : https://www.slideshare.net/dotCloud/why-docker )
컨테이너는 이미지를 실행한 상태 로 추가되거나 변하는 값은 컨테이너에 저장된다.
같은 이미지에서 여러개의 컨테이너를 생성할 수 있고, 컨테이너의 상태가 변하더라도 이미지는 변하지 않는다.
도커 이미지는 Docker hub에 등록하거나, Docker Registry 저장소를 직접 만들어서 관리할 수도 있다.
docker 사용하기
docker의 명령은 기본적으로 docker ~ 으로 시작한다.
이미지 검색하기
oracle-xe 환경 구축을 위해서, 먼저 공개이미지나 사람들이 만들어 공개한 이미지들을 공유하는 Docker hub(https://registry.hub.docker.com)에서 oracle 이미지를 검색한다.
$sudo docker search oracle
그림 6. 도커 이미지 검색
이미지 내려받기
Docker hub에서 alexeiled/docker-oracle-xe-11g 이미지를 받는다. docker pull <이미지이름>:<태그> 태그를 쓰지 않으면, default 태그로 latest(최신버전)가 설정된다.태그>이미지이름>
$ sudo docker pull alexeiled/docker-oracle-xe-11g
그림 6. 도커 이미지 pull
이미지 , 컨테이너 목록 확인하기
$ sudo docker images
그림 7. 도커 이미지 목록 확인하기
$ sudo docker ps -a
그림 8. 도커 컨테이너 목록 확인하기
컨테이너 생성하기
docker run <옵션> <이미지 이름=""> <실행할 파일=""> 이미지 이름대신 이미지id를 사용할 수 있다.실행할>이미지>옵션>
- 옵션 -i(interactive), -t(Pseudo-tty) : 실행된 Bash셀에 입력 및 출력이 가능하다. –name : 컨테이너 이름을 지정 할 수 있다. 없으면 docker가 자동으로 생성한다. ``` $ sudo docker run -i -t f7304758169d /bin/bash
### 컨테이너 시작, 재시작, 접속, 정지하기
컨테이너 이름대신 컨테이너id를 사용할 수 있다.
* 시작 : docker start <컨테이너이름>
* 재시작: docker restart <컨테이너이름>
* 접속 : docker attach <컨테이너이름>
* 정지: docker stop <컨테이너이름>
* 삭제: docker rm <컨테이너이름>
$ sudo docker start 519e0f4da723 $ sudo docker restart 519e0f4da723 $ sudo docker attach 519e0f4da723 $ sudo docker stop 519e0f4da723 $ sudo docker rm 519e0f4da723
```
Bash쉘에서 exit, ctrl+D를 통해 컨테이너를 정지할 수 있다.
그림 9. 도커 컨테이너 삭제 예
참고자료
-
초보를 위한 도커 안내서- 도커란 무엇인가? ,https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html (accessed 2018.01.09)
-
호스트OS, 게스트OS , https://zetawiki.com/wiki/%ED%98%B8%EC%8A%A4%ED%8A%B8OS,_%EA%B2%8C%EC%8A%A4%ED%8A%B8OS (accessed 2018.01.09)
-
가장 빨리 만나는 Docker, 길벗 출판사 , 이재홍지음
-
전가상화와 반가상화 ,http://virtualhive.tistory.com/36, http://nitw.tistory.com/181 (accessed 2018.01.09)
-
why docker ,https://www.slideshare.net/dotCloud/why-docker (accessed 2018.01.09)
-
window 10 에디션 비교 ,https://www.microsoft.com/ko-kr/windows/compare (accessed 2018.01.09)
-
Install Docker Toolbox on Windows, https://docs.docker.com/toolbox/toolbox_install_windows/ (accessed 2018.01.09)
-
가상화의 기본 개념 ,http://dongseon.tistory.com/entry/%EA%B0%80%EC%83%81%ED%99%94%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90 (accessed 2018.01.09)