[Docker] 도커 처음 시작하기
도커가 무엇인지 알아봅니다.
도커란?
- 도커는 리눅스 컨테이너에 여러 기능을 추가함으로써 애플리케이션을 컨테이너로서 좀 더 쉽게 사용할 수 있게 만들어진 오픈소스입니다.
- 기존에 사용하던 가상 머신과는 달리 도커 컨테이너는 성능의 손실이 없고 효율적으로 이미지(프로세스 실행 환경)을 구축할 수 있도록 해줍니다.
가상머신과 도커 컨테이너
- 가상머신을 실행하는 호스트 머신에 가상화된 하드웨어와 OS를 구축함으로써, 호스트와는 다른 환경을 구축하고 개발과 테스트를 비롯한 다양한 목적으로 사용할 수 있습니다.
- 각종 시스템 자원을 가상화하고 독립된 공간을 생성하는 작업을
가상화 작업
이라고 합니다. - 이러한 가상화 작업은
하이퍼바이저
를 사용하여Guest OS
를 만듭니다. - 하나의 컴퓨터에 다른 컴퓨터를 통째로 만든다고 생각하면 쉽고, 어떠한 작업을 할 때
하이퍼바이저
를 반드시 거치기 때문에 일반 호스트에 비해 성능이 떨어집니다. - 추가적으로, 가상 머신은
Guest OS
를 사용하기 위한 라이브러리, 커널 등을 전부 포함하기 때문에 가상머신을 배포하기 위한이미지
로 만들었을 때 이미지의 크기가 커집니다.
- 위의 그림을 보시면 알겠지만, 오른쪽의
Docker Engine
을 사용한 container가 Volume이 더 작은 것을 알 수 있습니다. - Docker container는 호스트의 커널을 공유해서 사용할 수 있고, Docker Engine 위에 Application 실행에 필요한 라이브러리 및 바이너리 파일만 존재합니다.
- 이러한 특징 때문에 container를 이미지로 만들었을 때 용량이 가상 머신에 비해 대폭 줄어들게 됩니다.
결론적으로 container를 이미지로 만들어 배포하는 시간이 가상 머신에 비해 빠르며, 가상화된 공간을 사용할 때의 성능 손실이 거의 없다는 장점이 있습니다.
- 물론 container가 가상 머신에 비해 안좋은 점도 있습니다. 바로
보안
문제입니다. - container가 host의 커널을 공유하기 때문에 container가 보안에 뚫리게 된다면, host 커널도 위험할 수 있습니다.
- 반면 가상 머신은 host와 커널을 공유하지 않기 때문에 공격을 당해도 다른 가상 머신이나 host가 보호됩니다.
- 따라서 사용자가 가상 머신을 쓸지, Docker container를 쓸지 판단해야합니다.
- 보안이 엄청 중요한 프로젝트가 아니라면, 배포가 쉽고 경량화된 Docker container를 사용하는 것이 바람직합니다.
컨테이너(Container)? 이미지(Image)? 엔진(Engine)?
컨테이너(Container)
- 가상화 된 유저 공간을
컨테이너(Container)
라고 부릅니다. - 컨테이너 가상화 방식은 원래부터 리눅스에 있었던 기능입니다.
- LXC(Linux Container)라고 하며, 이 기술은
namespace
와Cgroup
이라는 기능을 이용해 구현되었다. namespace
는 사용자에게 영역별로 독립된 공간을 만들어주며,Cgroup
은 독립된 공간에 시스템 자원을 할당하여 제한된 자원만 사용할 수 있도록 합니다.- 주의할 점은
컨테이너
와도커
는 같은 개념이 아니라는 것이며, 도커 이외에도Java 컨테이너
,OpenVZ
등 여러가지 컨테이너 기술들이 있습니다. 하지만 컨테이너의 표준은도커
라는 것은 분명합니다.
이미지(Image)
- container를 실행하기 위해서 필요한 파일, 프로그램, 라이브러리, 설정을 묶어서 만든 파일입니다.
- 실행환경을 그대로 패키지로 묶는다고 생각하면 쉽습니다. 이러한 Docker Image를 실행하면 Docker container가 됩니다.
엔진(Engine)
- Docker-Engine은 Docker container를 실행, 중지, 이미지 빌드 등 전반적인 실행에 관여하는 도구입니다.
- 일반적으로 Docker라고 부르는 것은 Docker-Engine을 말합니다.
도커를 사용해야 하는 이유(도커의 득징)
- 도커는 게스트 OS를 설치하지 않는다.
- 이미지에 서버 운영을 위한 실행 파일과 라이브러리만 격리해서 설치한다.
- OS설치가 없기 때문에 이미지 용량이 크게 줄어든다.
- HOST와 OS자원을 공유한다.
- 도커에는 하드웨어 가상화 계층이 없다.
- 메모리 접근, 네트워크 전송 속도가 기존의 가상 머신보다 압도적으로 빠르다.
- Host PC와 도커 컨테이너는 성능 차이가 거의 없다.
- 도커는 이미지 생성과 배포에 특화되어있다.
- Git과 같은 소스 형상관리처럼 이미지 버전 관리도 제공하고, 중앙 저장소에 이미지를 올리고 받을 수 있다.
- GitHub와 비슷하게 도커 이미지를 공유하는 Docker Hub를 제공한다.
- 다양한 API를 제공해서 사용자가 필요한 만큼 자동화가 가능하기 때문에 개발을 할때나 서버 운영을 할 때 매우 유용하다.
- 서비스를 개발했을 때 사용했던 환경을 다른 서버에서도 컨테이너로서 똑같이 복제할 수 있기 때문에 개발/운영 환경의 통합이 이루어짐.
참고자료
- https://www.44bits.io/ko/post/easy-deploy-with-docker
- https://medium.com/@darkrasid/docker%EC%99%80-vm-d95d60e56fdd
- 용찬호(2020), 시작하세요 도커/쿠버네티스,
- https://www.leafcats.com/152