도커란
도커란 어플리케이션을 패키징 할 수 있는 툴로 리눅스 컨테이너 기반으로 하는 오픈소스 가상화 플랫폼이다.
Docker가 출시되고 단 몇 초 만에 새로운 운영체제를 생성하고 서비스를 배포할 수 있게 되고 어플리케이션을 구동하는데 필요한 이것 저것들을 설정하고 준비해야하는 번거로움이 줄어들어 개발자들이 실질적으로 사용할 수 있는 편리성의 위치까지 해당 기술의 눈높이를 낮추었다.
배경
VM (가상 머신)
VM은 응용 프로그램 소프트웨어, 종속성 및 게스트 OS가 포함되어 즉 배포할 각 애플리케이션 스택마다 별도의 VM과 게스트 OS가 필요하고, 게스트 OS를 사용하기 위한 라이브러리, 커널 들을 전부 포함하기 때문에 가상 머신을 배포하기 위해 만든 이미지 또한 크기가 크다. 그리고 이것은 이러한 것들은 곧 성능의 문제와 직결되었다.
- 가상머신은 Hypervvisor 를 통해 여러개의 운영체제를 생성되고 관리됨
- 가상머신은 GuestOS를 사용하기 위한 라이브러리, 커널 들을 모두 포함하므로 배포할 때 용량이 크다.
- 시스템 자원을 가상화하고 독립된 공간을 생성하는 작업은 HyperVisor를 거치므로 성능 손실이 크다.
작업을 HyperVisor를 거치면 성능 손실오는 이유는 아래와 같다.
자원 공유 및 관리 오버헤드: Hypervisor는 호스트 시스템의 자원을 가상 머신에 할당하고 관리합니다. 이는 추가적인 오버헤드를 발생시키며, 가상 머신 간 자원 공유 및 관리를 위해 CPU, 메모리, 저장 공간 등의 자원을 조정해야 합니다.
가상화된 하드웨어 접근: 가상 머신은 실제 하드웨어에 직접 액세스하지 않고 Hypervisor를 통해 가상화된 하드웨어에 액세스합니다. 이는 추가적인 지연을 초래할 수 있으며, 성능에 영향을 줄 수 있습니다.
I/O 오버헤드: 가상 머신에서의 입출력 작업은 Hypervisor를 통해 중재됩니다. 이로 인해 입출력 작업의 성능이 저하될 수 있습니다.
하드웨어 호환성: Hypervisor는 다양한 하드웨어와 호환되어야 하므로 일부 하드웨어에 대한 최적화가 부족할 수 있습니다. 이로 인해 일부 성능 저하가 발생할 수 있습니다.
도커
추가적인 OS를 설치하여 가상화하는 방법은 성능문제가 있었고 이를 개선하기 위해 프로세스를 격리 하는 방식이 등장
Docker는 가상화된 공간을 생성하기 위해 리눅스 자체 기능인 chroot, 네임스페이스(namespace), cgroup을 사용함으로써 프로세스 단위의 격리환경을 만들기 때문에 성능 손실이 거의 없다. 커널을 포함하지 않고 커널을 공유해서 사용하므로 컨테이너에는 라이브러리 및 실행파일만 있어 용량이 작다. 용량이 작으니 배포하는 시간도 빠르다.
cgroup(control group)
LXC는 cgroup을 사용하여 각 컨테이너에 대한 시스템 리소스(예: CPU, 메모리, 디스크 I/O)를 제한하고 우선순위를 지정합니다.
cgroup을 사용하면 LXC가 각 컨테이너에 리소스를 제어되고 효율적인 방식으로 할당하여 한 컨테이너가 너무 많은 리소스를 소비하여 다른 컨테이너의 성능에 영향을 미치는 것을 방지할 수 있습니다.
namespace
LXC는 Linux 커널 namespace를 사용하여 각 컨테이너에 대해 별도의 네임스페이스를 생성합니다.
namespace는 프로세스 ID, 네트워크 인터페이스, 파일 시스템 등 각 컨테이너에 대한 다양한 시스템 리소스를 격리합니다. 이러한 격리를 통해 한 컨테이너 내의 프로세스가 다른 컨테이너의 리소스를 간섭하거나 액세스 할 수 없습니다.
chroot
LXC는 chroot를 사용하여 각 컨테이너에 대한 파일 시스템 경계를 만듭니다.새 컨테이너가 생성되면 LXC는 호스트 시스템의 root 파일 시스템과 격리된 새 root 파일 시스템을 생성합니다. 이러한 격리를 통해 각 컨테이너는 고유한 파일 시스템 계층 구조를 가질 수 있으며, 한 컨테이너 내의 프로세스가 다른 컨테이너의 파일에 액세스 하거나 수정할 수 없습니다.
출처 : https://colevelup.tistory.com/30
이미지와 컨테이너란?
도커 엔진에서 사용하는 기본 단위는 이미지와 컨테이너이며 도커 엔진의 핵심이다.
도커파일 -> 도커 이미지 -> 도커 컨테이너 순서대로 생성할 수 있다.
도커파일이란?
Doker File은 이미지 생성 출발점으로 이미지를 구성하기 위한 명령어들을 작성하여 이미지를 구성할 수 있다. 다시 말해, 만들 이미지에 대한 정보를 기술한 템플릿이라고 보면 된다. 도커 파일을 통해 애플리케이션 빌드 및 배포도 자동화 할 수 있다.
도커 이미지란?
이미지는 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있는 것으로 하나의 이미지에 여러개의 컨테이너가 생성될 수 있고 컨테이너의 상태가 변하더라도 이미지는 변하지 않으며 추가적으로 변화된 값은 컨테이너에 저장된다.
도커 이미지는 Docker hub에 등록하거나 Docker Registry 저장소를 직접 만들어 관리할 수 있습니다. 현재 공개된 도커 이미지는 50만개가 넘고 Docker hub의 이미지 다운로드 수는 80억회에 이릅니다. 누구나 쉽게 이미지를 만들고 배포할 수 있습니다.
도커 컨테이너란?
컨테이너는 격리된 공간에서 프로세스가 동작하는 기술입니다. 이미지로 도커 컨테이너를 생성할 수 있고 컨테이너는 가상의 OS를 만드는 것이 아니라 하나의 Host OS위에서 마치 각각의 독립적인 프로그램처럼 관리되고 실행된다.
하나의 서버에 여러개의 컨테이너를 실행하면 서로 영향을 미치지 않고 독립적으로 실행 CPU나 메모리 사용량을 제한할 수 있고 호스트의 특정 포트와 연결하거나 호스트의 특정 디렉토리를 내부 디렉토리인 것처럼 사용할 수도 있습니다.
다음에 다룰 주제
도커레이어, 도커 엔진. 도커 컴포즈, 도커데몬
참고한 자료
'도커' 카테고리의 다른 글
[docker] 도커로 mssql 사용하기 (1) | 2023.10.02 |
---|---|
[docker] 기본 명령어 정리 (0) | 2023.10.01 |
[docker] 도커로 PostgreSQL 사용하기 (0) | 2023.05.10 |
[docker] 도커 Docker Desktop requires a newer WSL kernel version. 에러 해결하기 (0) | 2023.05.10 |