도커란?
도커는 컨테이너 기반 가상화를 활용하여 애플리케이션을 보다 쉽게 배포하고 관리할 수 있도록 도와주는 플랫폼입니다.
도커를 제대로 이해하기 위해서는 먼저 컨테이너와 가상화가 무엇인지 알아보는 것이 중요합니다.
왜 가상화가 등장했을까요?
하나의 서버(비싼 서버)에서 한 가지 프로젝트만 실행하면 문제가 없겠지만, 하나의 서버에서 두 가지 또는 세 가지 서비스를 운영하게 될 경우, 각 서비스에서 사용하는 모듈이나 라이브러리가 다를 수 있습니다.
이로 인해 서비스들 간의 충돌이 발생할 수 있습니다.
예를 들어, 특정 서비스는 구버전의 라이브러리를 필요로 하고, 다른 서비스는 최신 버전을 요구할 수 있습니다.
이러한 충돌 문제를 해결하기 위해 가상화 기술이 도입되었습니다.
가상화는 물리적 하드웨어를 추상화하여 여러 개의 독립적인 가상 환경을 생성합니다.
각 가상 환경은 서로 독립적으로 운영되므로, 다양한 요구 사항을 가진 서비스를 하나의 서버에서 문제 없이 실행할 수 있습니다.
가상화 기술 덕분에 자원의 활용도가 높아지고, 운영의 유연성과 효율성이 크게 향상되었습니다.
서버 가상화
서버 가상화는 하나의 물리적 서버에서 여러 개의 서버 운영체제를 가상화하여 실행할 수 있게 해주는 소프트웨어 아키텍처입니다.
이를 통해 물리적 서버의 자원을 효율적으로 활용할 수 있습니다.
- 장점
- 물리적 서버의 자원을 다수의 가상 서버로 나눠서 사용할 수 있습니다.
- 각 가상 서버는 독립적인 운영체제와 애플리케이션을 실행할 수 있습니다.
- 단점
- 하이퍼바이저를 반드시 거쳐야 하므로 성능 손실이 발생할 수 있습니다.
- 각 가상 서버에 운영체제, 라이브러리, 커널 등을 전부 포함해야 하므로 배포 이미지의 크기가 커집니다.
- 이로 인해 운영체제와 자원의 중복이 발생할 수 있으며, 전반적인 성능 저하와 용량 부담이 커질 수 있습니다.
→ 서버 가상화는 완벽한 독립적 운영체제를 제공하지만, 성능이 느리고, 이미지의 크기가 큰 단점이 있습니다.
컨테이너 기반 가상화
컨테이너 기반 가상화는 애플리케이션과 그 실행에 필요한 모든 종속성을 포함하여, 운영체제의 커널을 공유하면서 독립적인 환경에서 실행할 수 있게 해주는 기술입니다.
- 장점
- 경량화: 컨테이너는 운영체제 커널을 공유하므로, 하이퍼바이저를 사용하는 서버 가상화보다 가벼워서 성능 손실이 적습니다.
- 빠른 배포: 컨테이너 이미지는 크기가 작고, 빠르게 시작할 수 있습니다.
- 일관된 실행 환경: 컨테이너는 동일한 환경에서 실행되므로, 개발 환경과 생산 환경 간의 차이를 줄일 수 있습니다.
- 격리성: 서로 다른 애플리케이션이 격리된 환경에서 독립적으로 실행될 수 있습니다.
- 단점
- 운영체제 의존성: 컨테이너는 호스트 운영체제의 커널을 공유하므로, 호스트 운영체제의 버전이나 설정에 따라 다르게 동작할 수 있습니다.
- 보안 문제: 커널을 공유하기 때문에, 보안상의 취약점이 존재할 수 있습니다.
→ 컨테이너 기반 가상화는 성능이 뛰어나고, 빠르게 배포할 수 있는 장점이 있지만, 운영체제 의존성과 보안 문제를 고려해야 합니다.
컨테이너란?
컨테이너는 가상화 기술의 일종으로, 애플리케이션과 그 실행에 필요한 모든 라이브러리, 의존성, 설정 파일 등을 함께 패키지화하여 격리된 환경에서 실행할 수 있게 해줍니다.
컨테이너는 운영 체제의 커널을 공유하면서도 독립적인 실행 환경을 제공하므로, 가상 머신보다 더 경량화된 솔루션입니다.
도커는 컨테이너 기술을 활용한 플랫폼으로, 컨테이너의 생성, 배포, 관리를 간편하게 할 수 있는 도구입니다. 즉, 도커와 컨테이너는 같은 개념이지만, 도커는 컨테이너를 보다 쉽게 다룰 수 있게 해주는 도구입니다.
왜 컨테이너를 쓰는가요?
- Host와의 격리를 통해 독립된 개발 환경을 보장
- 컨테이너는 호스트 운영 체제와 격리된 환경을 제공하므로, 개발 환경이 다른 환경과 충돌하지 않도록 보장합니다.
- 이는 “개발 환경에서는 잘 작동하지만 제품 환경에서는 문제가 발생한다”는 리스크를 줄여줍니다.
- 프로세스를 컨테이너 단위로 사용
- 애플리케이션의 각 프로세스를 개별 컨테이너로 분리하여 실행할 수 있습니다.
- 이를 통해 애플리케이션의 모듈화가 가능하고, 관리와 배포가 더 용이해집니다.
- 프로세스의 관리와 확장에 용이
- 컨테이너는 가벼운 구조 덕분에 수십 개의 컨테이너를 동시에 실행하고 관리할 수 있습니다.
- 또한, 필요에 따라 컨테이너를 쉽게 확장하거나 축소할 수 있어, 애플리케이션의 요구에 빠르게 대응할 수 있습니다.
도커의 주요 구성 요소
도커는 여러 구성 요소로 이루어져 있으며, 각각의 역할을 이해하면 도커의 전체적인 작동 방식을 더 잘 이해할 수 있습니다.
다음은 도커의 주요 구성 요소들입니다.
도커 엔진 (Docker Engine)
도커 엔진은 도커의 핵심 컴포넌트로, 컨테이너를 생성하고 관리하는 역할을 합니다.
도커 엔진은 두 가지 주요 구성 요소로 이루어져 있습니다
- 서버(daemon)
- 컨테이너를 실행하고 관리하는 백그라운드 프로세스입니다.
- 이 서버는 도커 클라이언트와 통신하며, 컨테이너의 생성, 실행, 중지, 삭제 등의 작업을 수행합니다.
- 클라이언트(client)
- 도커 엔진과 상호 작용하는 명령줄 인터페이스(CLI)입니다.
- 사용자는 도커 클라이언트를 통해 도커 엔진에 명령을 전달하고, 도커 컨테이너를 관리합니다.
도커 엔진은 다양한 플랫폼에서 실행될 수 있으며, 리눅스, 윈도우, macOS 등에서 도커 컨테이너를 지원합니다.
도커 이미지 (Docker Images)
도커 이미지는 컨테이너를 실행하기 위한 템플릿으로, 애플리케이션과 그 실행에 필요한 모든 파일, 라이브러리, 환경 변수를 포함합니다.
이미지는 다음과 같은 특징을 가집니다
- 불변성
- 도커 이미지는 불변의 상태를 가지며, 생성 후 변경되지 않습니다.
- 이는 일관된 환경을 보장하는 데 도움이 됩니다.
- 계층화
- 도커 이미지는 계층화된 파일 시스템을 사용합니다.
- 각 계층은 이미지의 일부 변경 사항을 포함하고, 이러한 계층들은 서로 결합되어 최종 이미지를 형성합니다.
- 재사용성
- 이미지는 여러 컨테이너에서 재사용될 수 있으며, 이는 자원 절약과 효율적인 관리에 도움이 됩니다.
도커 컨테이너 (Docker Containers)
도커 컨테이너는 도커 이미지에서 실행된 실질적인 인스턴스입니다. 컨테이너는 독립적인 실행 환경을 제공하며, 다음과 같은 특징을 가집니다
- 격리
- 컨테이너는 호스트 운영 체제와 격리된 환경을 제공하므로, 다른 컨테이너와 독립적으로 실행됩니다.
- 이를 통해 여러 애플리케이션을 동시에 실행하면서도 서로의 영향을 받지 않도록 할 수 있습니다.
- 경량화
- 컨테이너는 운영 체제의 커널을 공유하므로, 하이퍼바이저를 사용하는 가상 머신보다 더 경량화되어 있으며, 빠른 시작과 종료가 가능합니다.
- 이식성
- 컨테이너는 도커 이미지에 포함된 모든 종속성을 갖추고 있으므로, 다양한 환경에서 일관되게 실행될 수 있습니다.
도커 허브 (Docker Hub)
도커 허브는 도커 이미지를 공유하고 배포할 수 있는 중앙 저장소입니다.
도커 허브는 다음과 같은 기능을 제공합니다
- 공용 이미지
- 도커 허브에는 다양한 공용 도커 이미지가 등록되어 있으며, 누구나 다운로드하고 사용할 수 있습니다.
- 이러한 이미지는 공식 이미지부터 커뮤니티에서 제공하는 이미지까지 다양합니다.
- 개인 이미지
- 사용자는 개인적으로 소유한 도커 이미지를 도커 허브에 저장하고 관리할 수 있습니다. 이를 통해 팀원들과 이미지를 공유하거나,
- 비즈니스 환경에서 사용하는 이미지들을 저장할 수 있습니다.
- 자동화된 빌드와 배포
- 도커 허브는 자동화된 빌드와 배포 기능을 지원합니다.
- 사용자는 GitHub나 Bitbucket과 연동하여 코드 변경 사항이 있을 때마다 자동으로 이미지를 빌드하고, 도커 허브에 배포할 수 있습니다.
참고자료
Asa Shiho 저자(글) · 이영란 번역 · Yamada Yoshihiro 감수. 『완벽한 IT 인프라 구축을 위한 Docker』. 출판사, 2018년 09월 10일.
https://www.44bits.io/ko/post/why-should-i-use-docker-container
답글 남기기