[Docker] 도커란?
도커란?
도커는 리눅스 컨테이너를 다루는 도구 컨테이너 런타임라고 한다.
LXC(리눅스 컨테이너) 와 Docker는 다르다.
도커의 특징
- 이식성: 애플리케이션 개발 단계는 크게 개발 단계, 테스트 단계 서비스 계로 나뉜다. 이때 각 단계의 환경을 통일하기는 쉽지 않다. 하지만 도커를 사용하면 컨테이너에 모든 환경을 구축하기 때문에 도커만 설치하면 된다.
- 서버를 코드 형태로 정의: 도커는 이미지를 사용하여 컨테이너를 실행한다.
- 상호운용성: 구글,아마존,IBM,마이크로소프트,레드헷 등 다양한 벤더에서 지원하기 때문에 벤더의 시스템 및 오픈 소스와 연계하여 사용할 수 있다.
도커의 구조
- 이미지: 컨테이너를 생성하려면 미리 제작된 이미지가 있어야 한다. 이미지는 여러 개의 레이어로 이루어져 있으며, 각 레이어는 Read Only 상태로 사용된다. 만약 이미지로 컨테이너를 실행하여 파일을 생성하거나 삭제한다면 새로운 레이어를 만들어 내용을 저장한다. 이 때 사용하는 방식이 COW(Copy on Write)와 유사하다.
- 저장소: 컨테이너를 생성하려면 이미지가 있어야 하고 이미지는 호스트가 아닌 외부에 저장되어 공유할 수 있어야한다. 이를 저장소 라고 한다. 범위에 따라 퍼블릭 이미지 저장소와 프라이빗 이미지 저장소로 나눌 수 있다. 이미지 저장수에는 대표적으로 도커 허브가 있으며 도커 허브에는 퍼블릭과 프라이빗 이미지 저장소 둘 다 사용할 수 있다.
- 컨테이너: 실행해서 메모리에 적재되는거 컨테이너 1:1 서비스
도커의 기능
- 이미지 생성: 도커는 다양한 방법으로 이미지를 생성할 수 있다. 가장 대표적이며 일반적으로 사용하는 것이 Dockerfile(code)이며 그 밖에 컨테이너를 이미지로 생성하는 docker commit 명령과 컨테이너의 파일시스템으로 이미지를 생성하는 docker export와 docker import 명령이 있다.
- 이미지 공유: 도커는 저장소를 사용하여 이미지를 공유한다. 저장소에는 도커 허브뿐만 아니라 다른 프라이빗 이미지 저장소도 사용할 수 있다.
도커 오브젝트
- image
- container
- network
- volume
사용하는 기술
- cgroup(Control Group): 프로세스 또는 쓰레드를 그룹화 하여 관리하는 기능 리룩스 컨테이너는 호스트의 리소르를 공유하여 사용하는데 이 때 cgroup를 사용하여 리소스(CPU,메모리,디스크 입출력 등) 제한할 수 있다. 또한 같은 호스트 에서 동작하는 서로 다른 컨테이너에 영향을 주지 않도록 막아주는 역할도 하고 있다.
- namespace: 이름공간이라고 부르며 이 공간에 다수의 오브젝트를 격리 할 수 있다.
ex) 호스트에서 동일한 PID를 가질 수 없지만 서로 다른 namespace에서는 동일한 PID를 가질 수 있다.
이름 | 설명 |
PID namespace | 독립적인 PID 사용 |
Nework namespace | 독립적인 네트워크 기능사용 |
UID namespace | 독립적인 UID 사용 |
Mount namespace | 독립적인 Mount Point 사용 |
UTS namespace | 독립적인 호스트네임 사용 |
IPC namespace | 독립적인 IPC 사용 ( IPC는 잘 사용안하고 메세지 큐 사용많이함) |