상세 컨텐츠

본문 제목

Docker. 특징 및 기능

TechBlog

by stuner 2020. 3. 2. 16:33

본문

Docker 의 특징

 

1. 가상의 운영체제 미설치

Docker는 OS를 설치하지 않기 때문에 이미지 용량 자체가 줄어들고 호스트와 자원을 공유한다. 또한 가상화 계층이 없기 때문에 실제 호스트에서 사용하는 것과 성능 차이가 거의 없다.

 

2. 이식성

개발환경, 테스트환경, 운영환경 등 모든 환경을 동일하게 컨테이너화 하여 각 환경에서 자체적으로 사용할 수 있기 때문에 별도의 수작업을 통해 통일 시킬 필요가 없다.

 

3. 상호운영성

Amazon, Google, Microsoft, IBM, Redhat 등 다양한 벤더에서 지원하고 있고 다양한 벤더의 시스템 및 오픈소스와 연계하여 사용 할 수 있다.

 


Docker 의 기능

 

1.이미지 생성

애플리케이션을 실행하기 위한 소스코드, 라이브러리, 미들웨어, OS설정 등을 하나로 모아 이미지를 생성한다. 이 이미지가 실행되면 컨테이너가 되며 이미지를 생성할 때 지정했던 소스코드, 라이브러리, 미들웨어, OS설정 등이 컨테이너 안에서 실행되게 된다.

이미지는 애플리케이션 실행에 필요한 파일들이 담긴 디렉토리라고 볼 수 있으며 docker 명령을 사용하여 이 이미지를 아카이브 파일로 생성할 수도 있으며 Dockerfile에 의해 자동으로 생성할 수도 있다.

 

2.이미지 공유

Docker 이미지는 Docker Hub라는 docker repository 에서 통합적으로 관리할 수 있다. Docker Hub에는 Ubuntu, CentOS 와 같은 리눅스 주요 배포판의 기본 기능을 제공하는 베이스 이미지 등이 저장되어 있다.

베이스 이미지에 사용자가 생성한 이미지를 추가하여 새로운 독립적인 이미지를 생성 할 수 있으며 이 이미지를 다른 사용자도 사용할 수 있도록 Docker Hub 에 공유할 수 있다.

이미지 업로드나 공유된 이미지의 다운로드는 모두 docker 명령어를 통해 쉽게 가능하다.

 

3.컨테이너 동작

docker는 리눅스에서 컨테이너 단위로 서버를 구동시기며 이 컨테이너의 기반이 되는 것이 바로 이미지이다.

docker는 이미지만 존재하면 다수의 컨테이너를 구동할 수 있으며 컨테이너의 시작/정지/삭제 등의 운용은 docker 명령을 사용한다.

컨테이너를 하나의 그룹으로 간주하여 호스트의 커널을 여러 개의 컨테이너가 공유하며 이때 컨테이너 간에 서로 접근할 수 없도록 서로를 고립시키는 기술을 사용하는데 이 때 사용되는 기술이 namespace와 cgrup 이다.

 


Docker 에서 사용되는 기술

 

1. namespace

dokcer 는 컨테이너라는 독립된 환경을 만들고 이 환경에서 애플리케이션을 실행하게 된다. namespace는 독립된 환경을 만들때 사용하는 기능 중 하나이다.

docker 가 독립된 환경을 만들때 namespace 기능을 사용하여 각 환경에 이름을 부여하고 쉽게 참조될 수 있도록 하며 namespace의 종류는 아래와 같다.

Namespace 설명
PID namespace

PID와 프로세스를 분리

namespace 가 서로 다른 프로세스는 서로 접근 불가

Network namespace namespace 별로 네트워크 장치, IP주소, 포트번호, 라우팅테이블, 필터링테이블을 사용
UID namespace namespace 별로 독립적인 UID, GID를 사용
MOUNT namespace namespace 별로 독립적인 마운트 포인트를 사용
UTS namespace namespace 별로 독립적인 호스트네임 사용
IPC namespace namespace 별로 독립적인 IPC 오브젝트 사용

 

2. cgroup

docker 는 호스트의 리소스를 공유하여 사용하는데 이 떄 사용되는 기능이 cgroup 이다. cgroup은 프로세스 또는 스레드를 그룹화하여 관리하는 기능이며 이를 통해 호스트의 CPU나 메모리를 그룹별로 제한할 수 있다. 또한 동일한 호스트에서 동작하는 서로 다른 컨테이너에 영향을 주지 않도록 보호해 주는 역할도 수행하게 된다.

 

3. 가상 브릿지와 가상 NIC

docker의 컨테이너는 각각 가상의 NIC 가 할당된다. 이 가상의 NIC 는 docker0 이라는 가상 브릿지에 연결되어 컨테이너 간의 통신이 가능하게 된다.

위의 그림에서 호스트의 eht0(빨간색박스)은 물리적인 NIC 이며 docker0 은 eh0(빨간색박스)와 연결된 가상의 브릿지이다. veth1과 veth2 는 호스트의 가상의 NIC이며 이는 각 컨테이너의 eth0(검정색박스) 와 연결된다.

일반적으로 docker0에는 172.17.0.0/16 의 네트워크가 할당되며 이 네트워크에 연결되어 있는 컨테이너 간에는 링크 기능을 이용하여 서로 통신할 수 있다. 또한 각 컨테이너의 /etc/hosts 파일을 수정하면 컨테이너의 이름으로도 통신할 수 있게 된다. 하지만 서로 다른 호스트에 있는 컨테이너 간에 통신을 위해서는 docker0 와 연결된 호스트의 eth0 을 통해야 한다. 이 때는 NAPT(Newort Address and Port Translation) 기능을 사용한다.

 

4. 이미지 데이터 관리 구조

docker 에서는 컨테이너 이미지가 변경될 때 COW(Copy On Write) 방식을 사용한다. 이는 Docker 의 이미지가 OS와 미들웨어 등을 포함하고 있어 사이즈가 크기 때문에 COW 는 부모 프로세스가 자식 프로세스를 생성할 때 전부를 복제하지 않고 쓰기가 발생했을 때 변경된 부분만 복제하는 방법으로 관리하게 된다.

docker 이미지 관리에 사용되는 파일시스템 또는 라이브러리는 아래와 같다.

  • Btrfs(B-Tree File System)

  • AUFS(Advanced multi-layered Unification File System)

  • Device Mapper

  • Overlay

'TechBlog' 카테고리의 다른 글

Docker. 컨테이너 관리  (0) 2020.03.02
Docker. 이미지 관리  (0) 2020.03.02
Docker. Installation on CentOS (Amazon Linux)  (0) 2020.03.02
DevOps로의 전환  (0) 2020.02.10
Docker. Install (for CentOS)  (0) 2020.02.03

관련글 더보기