Docker에는 크게 세 가지 기능이 있다.
- Docker 이미지를 만드는 기능 (Build)
- Docker 이미지를 공유하는 기능(Ship)
- Docker 컨테이너를 작동시키는 기능(Run)
- Docker 이미지를 만드는 기능 (Build)
Docker는 애플리케이션의 실행에 필요한 프로그램 본체, 라이브러리, 미들웨어, OS나 네트워크 설정 등을 하나로 모아서 Docker 이미지를 만든다. Docker 이미지는 실행 환경에서 움직이는 컨테이너의 바탕이 된다.
Docker에서는 하나의 이미지에는 하나의 애플리케이션만 넣어 두고, 여러 개의 컨테이너를 조합하여 서비스를 구축하는 방법을 권장한다.
Docker 이미지의 정체는 애플리케이션의 실행에 필요한 파일들이 저장된 디렉토리이다. 이미지를 tar파일로 출력할 수 있다. Docker 이미지는 Docker의 명령을 사용하여 수동으로 만들 수도 있으며, Dockerfile이라는 설정 파일을 만들어 그것을 바탕으로 자동으로 이미지를 만들 수도 있다. 지속적 인티그레이션(Continuous Integration)과 지속적 딜리버리(Continuous Delivery) 관점에서 코드에 의한 인프라의 구성 관리를 생각하면 Dockerfile을 사용하여 관리하는 것이 바람직하다.
Continuous Integration & Continuous Delivery 참고
https://itholic.github.io/qa-cicd/
또한 Docker 이미지는 겹쳐서 사용할 수 있다. 예를 들어 OS용 이미지에 웹 애플리케이션용 이미지를 겹쳐서 다른 새로운 이미지를 만들 수 있다. Docker에서는 구성에 변경이 있었던 부분을 차분(이미지레이어)로 관리한다.(해당 부분은 자세히 조금 더 깊게 공부하고 다루도록 하겠다.) 또한 애플리케이션의 실행에 필요한 파일은 크기가 큰 경우도 있으므로 효율이 좋은 이미지를 만들 필요가 있다.
- Docker 이미지를 공유하는 기능(Ship)
Docker 이미지는 Docker 레지스트리에 공유할 수 있다. 예를 들어 Docker의 공식 레지스트리인 Docker Hub에서는 Ubuntu나 CentOS와 같은 Linux 배포판의 기본 기능을 제공하는 베이스 이미지를 배포하고 있다. 이러한 베이스 이미지에 미들웨어나 라이브러리, 애플리케이션 등을 넣은 이미지를 겹쳐서 독자적인 Docker 이미지를 만들어 가는 것이다.
- Docker Hub https://hub.docker.com/
또한 공식 이미지 외에도 개인이 작성한 이미지를 Docker Hub에서 자유롭게 공개하여 공유할 수가 있다. 이미 많은 Docker가 공개되어 있으므로 요건에 맞는 것을 다운로드하여 사용하면 된다.
Docker 명령어로 Docker Hub에 로그인하여 레지스트리에 있는 이미지를 검색이나 업로드, 다운로드 할 수 있다.
또한 Docker Hub는 GitHub나 BitBucket과 연계할 수도 있다. 예를 들어서 GitHub 상에서 Dockerfile을 관리하고, 거기서 Docker 이미지를 자동으로 생성하여 Docker Hub에서 공개하는 것도 가능하다. 이러한 자동 생성 기능을 Automated Build라고 한다.
- Docker 컨테이너를 작동시키는 기능(Run)
Docker는 Linux 상에서 컨테이너 단위로 서버 기능을 작동시킨다. 이 컨테이너의 바탕이 되는 것이 Docker 이미지이다. Docker 이미지만 있으면 Docker가 설치된 환경이라면 어디서든지 컨테이너를 작동시킬 수 있다. 또한 Docker 이미지를 가지고 여러 개의 컨테이널르 가동시킬 수도 있다. 컨테이너의 가동, 정지, 파기는 Docker의 명령을 사용한다.
다른 가상화 기술로 서버 기능을 실행시키려면 OS의 실행부터 시작하기 때문에 시간이 걸리지만, Docker는 이미 움직이고 있는 OS 상에서 프로세스를 실행시키는 것과 거의 똑같은 속도로 빨리 실행시킬 수 있다. (가상화 기술에 비해 Docker가 가지는 큰 장점이자 Docker를 사용해야하는 이유라고 생각한다.)
Docker는 하나의 Linux 커널을 여러 개의 컨테이너에서 공유하고 있다. 컨테이너 안에서 작동하는 프로세스를 하나의 그룹으로 관리하고, 그룹마다 각각 파일 시스템이나 호스트명, 네트워크 등을 할당하고 있다. 그룹이 다르면 프로세스나 파일에 대한 액세스를 할 수 없다. 이러한 구조를 사용하여 컨테이너를 독립된 공간으로서 관리한다. 이를 실행하기 위해 Linux 커널 기능(namespacem, cgroups 등) 기술이 사용된다. (추후에 다루도록 하겠다.)
제품 환경에서는 모든 Docker 컨테이너를 한 대의 호스트에서 작동시키는 일은 드물며, 시스템의 트래픽 증감이나 가용성, 신뢰도 요건 등을 고려한 후에 여러 대의 호스트 머신으로 된 분산 환경을 구축한다. 그리고 보통 컨테이너 관리에 대해서는 오케스트레이션 툴을 이용하는 것이 일반적이다.(이 부분 또한 깊게 공부하고 나서 다루도록..하겠다.) 컨테이너 오케스트레이션 툴은 분산 환경에서 컨테이너를 가동시키기 위해 필요한 기능을 제공한다.
참고
'About > Docker' 카테고리의 다른 글
[Docker] Docker의 작동 구조 (2) (cgroups) (0) | 2020.12.27 |
---|---|
[Docker] Docker의 작동 구조 (1) (namespace) (2) | 2020.12.13 |
[Docker] Docker 컴포넌트 (1) | 2020.12.13 |
[Docker] Docker의 개요 (1) | 2020.12.07 |
[Docker] 컨테이너(Container)란? (2) | 2020.12.05 |