open source : Docker가 도대체 뭘까?
Docker
Why?
내 주위에서 Docker를 너무 많이 얘기해서 궁금해서 찾아보았다.
Docker는 "컨테이너 기반의 오픈소스 가상화 플랫폼" 이라고 한다.
실제로 구글에서도 1주에 20억개의 container를 써서 서비스를 제공한다고 하니, 갓구글....믿어도되겠다.
Container
container는 격리된 공간에서 프로세스가 동작하는 기술이다.
우리는 container 개념을 쓰기 시작한거는 LXC의 등장 부터다. 그 전까지는 VMware, VBox를 썼다.
따라서 우리는 Container의 개념을 적용한다.
기존 HostOS의 종속적이긴하지만, Docker Engine을 통해서 bins와 lib의 버젼만 관리가 나누어져있는 container들을 만들면서, GuestOS가 차지했던 resource를 온전히 Application의 성능으로 바꾸기에 충분하다. 따라서 Docker의 최대 장점 중 하나인 부분이다.
아래는 두 번째 그림에 대한 자세한 설명이다.
리눅스 커널의 자원 일부를 그대로 이용합니다. 리눅스 커널의 cgroups(control groups)를 통해 CPU, 메모리, 디스크, 네트웤 자원을 할당하여 완벽한 가상 공간을 제공합니다. 또한 프로세스 트리, 사용자 계정, 파일 시스템, IPC 등을 별도로 격리시켜서 호스트와 별개의 공간을 따로 만듭니다. 이렇게 격리된 곳이 바로 namespaces입니다. 마지막으로 보안 관리를 제공하는 SELinux(Security-Enhanced Linux) 또한 가상화된 공간에서 제공하여 보안도 호스트와 같은 수준으로 제공합니다. 즉, cgroups와 namespaces, SELinux 기능을 활용하여서 가상 공간을 제공하게 되는 겁니다. 추가적으로 필요한 자원이 있다면 드라이버를 가상 환경에 연결하여 지원해줍니다.
출처 : https://kyulingcompany.wordpress.com/category/%ea%b0%9c%eb%b0%9c-%ec%97%b0%ea%b5%ac-%ea%b4%80%eb%a0%a8%ea%b8%80/%ed%81%b4%eb%9d%bc%ec%9a%b0%eb%93%9c-%ec%9d%b4%ec%95%bc%ea%b8%b0/docker/page/2/
container - image
도커에서 가장 중요한 개념은 이미지라는 개념이다.
이미지는 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있는 것으로 상태값을 가지지 않고 변하지 않는다.
container는 이미지를 실행한 상태이며, 추가되거나 변하는 값은 다시 container에 저장된다.
같은 이미지에서 여러 개의 container를 생성할 수 있고, container의 상태가 바뀌거나 삭제되더라도 이미지는 변하지 않고 그대로 남아있다.
container - layer 저장방식
도커 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 보통 용량이 수백메가MB에 이룬다. 처음 이미지를 다운받을 땐 크게 부담이 안되지만 기존 이미지에 파일 하나 추가했다고 수백메가를 다시 다운받는다면 매우 비효율적이기 때문에 레이어layer라는 개념을 사용하고, 유니온 파일 시스템을 이용하여 여러개의 레이어를 하나의 파일시스템으로 사용할 수 있게 해준다.
이미지는 여러 개의 읽기 전용 read only 레이어로 구성되고 파일이 추가되거나 수정되면 새로운 레이어가 생성된다. webapp 이미지를 nginx 이미지 기반으로 만들었다면 예상대로 A + B + C + nginx + source 레이어로 구성된다. webapp 소스를 수정하면 A, B, C, nginx 레이어를 제외한 새로운 source(v2) 레이어만 다운받으면 되기 때문에 굉장히 효율적으로 이미지를 관리할 수 있다.
컨테이너를 생성할 때도 레이어 방식을 사용하는데 기존의 이미지 레이어 위에 읽기/쓰기read-write 레이어를 추가한다. 이미지 레이어를 그대로 사용하면서 컨테이너가 실행중에 생성하는 파일이나 변경된 내용은 읽기/쓰기 레이어에 저장되므로 여러개의 컨테이너를 생성해도 최소한의 용량만 사용한다.
Docker는 위의 Container의 개념을 탑재하고 있는 오픈소스이다.
Docker 장점
- 하나의 서버에 여러개의 container를 실행하면 서로 영향을 미치지 않고 독립적으로 실행되어 마치 가벼운 VMmacine을 사용하는 효과를 보게된다. 이를 클래스와 인스턴스 개념으로 생각해도 잘 이해가 된다.
- container에 접속해서 명령어 입력이 가능하다
- 패키지설치 및 관리 용이하다.
- CPU or Memory 를 프로세스가 필요한 만큼만 사용한다.
- container를 구성하는 시점에서 서버운영기록을 도커 파일로, 실행할 시점을 도커이미지로 생성하여 여러 서버에 동일한 백그라운드를 배포할 수 있다.
- 서버를 만들 때 리팩토링을 통해서 미리 실패해보는 일을 직접 겪음으로써, 서비스 장애를 줄일 수 있다. 또한 서버 제작과정에서 견고함과 유연성을 추가로 더할 수 있다.
- 다른 이가 만든 서버를 가져다 쓸 수 있고, 또는 내가 올릴 수도 있다.
Reference
첫 번째 블로그는 정리를 너무 잘하셨다. 도커의 안내, 설치 및 컨테이너 실행, 이미지 만들고 배포하기 총 3단계로 이루어져있으니, 나중에 Docker를 쓰게 된다면, 이 블로그를 다시 보자.
https://www.44bits.io/ko/post/why-should-i-use-docker-container