도커란?
도커에 대한 정의
소프트웨어를 컨테이너라는 표준화된 유닛으로 패키징한 것
컨테이너 안에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 모든 것이 포함되어 있다.
간단히 말해 컨테이너 기반의 오픈소스 가상화 플랫폼이며, 애플리케이션을 환경에 구애받지 않고 실행하는 기술이라고 생각하면 된다.
도커를 쓰는 이유?
- 독립적 환경 제공
가상 컴퓨팅 즉 VM 같은 경우에는 한 물리적 컴퓨터 안에 각각 OS를 가동하는 가상 컴퓨터들이 물리적 자원을 분할해서 사용한다.
도커는 OS 단 까지 내려가는 게 아니라 컨테이너라는 환경으로 독립적인 공간을 사용해 실행 환경만 독립적으로 돌리게 되어 다른 업무 및 서비스 환경에 방해가 되지 않는다. 그래서 오버헤드가 적고 성능 손실이 적다.
반면, VM은 액세스 경로가 길기 때문에 오버헤드가 많고 성능 손실이 크다. - 배포 과정의 편의성
VM의 경우 OS, 환경설정 등이 동일한 서버가 필요한 경우가 있는데 배포하는 과정에서 문제가 생길 수 있다.
Docker는 Image 기반으로 배포되기 때문에 Dockerfile 만 보아도 어떤 애플리케이션인지 유추가 가능하고, 애플리케이션 별로 상이하지 않게끔 배포가 되어 오래된 서버여서 메뉴얼이 없거나 담당자가 퇴사한 서버의 경우 문제가 발생할 가능성이 적다. - 서버 운영 기록 통일
2. 와 비슷한 내용이긴 하나, 눈송이 서버(SnowFlakes Server) 를 방지하기 위함도 있다.
설치 날짜가 차이나는 같은 애플리케이션의 A 서버 B 서버가 있다고 가정할 때, 컴파일러 또는 패키지가 완벽히 같을 수는 없다. 이런 차이점들이 장애를 일으키게 되는데 도커는 Image 기반의 서버 배포가 이를 방지해준다.
도커 작동방식
기존 가상화 방식(VM)은 각 가상환경 마다 독립된 OS(Guest OS) 가 존재해 매우 무겁고 느리다.
또한 도커와 비교하여 중간에 Guest OS, Hypervisor 등을 더 거쳐 오버헤드가 발생한다.
반면에 도커는 리눅스 자체 기능을 이용한 프로세스 단위의 격리 공간을 만들고, 컨테이너들이 Host OS에서 컨테이너에 필요한 커널을 공유해서 사용하기 때문에 성능 손실이 거의 없다. 그리고 VM 처럼 OS를 매번 설치하는 것이 아니고 최소한의 요소만 포함시켜 가상 컨테이너를 설치해 애플리케이션이 배포되는 과정이 VM과 비교해 매우 짧고 훨씬 가볍다.
도커의 장점
- 애플리케이션 독립성
- 쉬운 배포
- 마이크로 서비스 구조로 변화가 쉽다.
도커 이미지 레이어
도커 이미지는 레이어라는 개념을 사용한다.
유니온 파일 시스템을 이용해서 이미지 전체 파일에 레이어 하나하나를 추가해 여러 개의 레이어를 하나의 파일시스템으로 사용할 수 있게끔 해준다.
만약 이미지가 레이어 형태로 되어있지 않다면 이미지 전체 파일에서 변경사항이 생길 경우 이미지를 다시 구성해야하는 불편함이 있다. 하지만, 레이어 구조로 되어 있기 때문에 이미지 전체 파일에서 레이어 하나만 추가해준 새로운 이미지를 구성할 수 있게 된다. 큰 용량의 이미지를 다시 받는다면 비효율 적일 수 밖에 없기 때문이다.
이미지는 여러 개의 읽기전용 read only 레이어로 구성되고 파일이 추가되거나 수정되면 새로운 레이어가 생성된다.
IF) ubuntu 이미지가 A+B+C의 집합이라면, ubuntu 기반 nginx 이미지는 A+B+C+nginx 가 된다.
이런 방식으로 webapp 이미지를 받고 싶다면 A+B+C+nginx+source로 레이어가 구성된다.
이런 방식으로 구성 된 이미지를 컨테이너로 배포하게 된다면 그제서야 read write가 되게 된다.(결과 적으로는 이미지 기반 배포기 때문에 write를 하게 되어도 원 이미지로 돌아오긴 한다.)
VM과 컨테이너의 차이점
간단하게는 Guest OS의 유무에 따라 VM과 컨테이너에 차이가 있다고 한다.
VM 같은 경우 Guest OS가 있어 각각의 VM 마다 독립적인 OS 환경을 만들어 줄수 있는데, 도커 컨테이너 같은 경우 Host OS의 공간인 리눅스 커널을 이용한 프로세스 단위의 격리 공간이다.
근데 위와 같은 구조로 운영이 되게 되면 VM 같은 경우 독립적인 OS 환경을 만들어 주어야 하기 때문에 각각의 App 이 같은 Host OS 자원을 사용하는 Docker에 비해 훨씬 서버가 무겁게 구성 될 수 밖에 없다. 자원의 효율성 측면에서 Docker가 훨씬 낫다는 이야기다.
[참조] :
https://velog.io/@yanghl98/%EB%8F%84%EC%BB%A4Docker
https://velog.io/@kdaeyeop/%EB%8F%84%EC%BB%A4-Docker-%EC%99%80-VM%EC%9D%98-%EC%B0%A8%EC%9D%B4