Docker는 경량화된 컨테이너를 만들어 쉽게 배포할 수 있도록 지원하는 컨테이너화 기술이다.
Docker Container를 띄울 수 있는 Docker Engine이 설치되어 있다면, 다른 환경에서 유연하게 실행할 수 있습니다. 과거 Linux Container와 달리 시스템 설정이 간단하며, 애플리케이션과 필요한 라이브러리만을 통해 경량화된 상태로 배포할 수 있다.
Qna. 가상화란 무엇인가
가상화란 하드웨어 자원을 논리적으로 분할하여 여러 개의 독립된 환경을 운영하는 기술이다. 이를 통해 하나의 시스템에 여러 OS를 실행시킬 수 있다. 서버, 네트워크, 스토리지, OS 등을 소프트웨어적으로 분리하여 효율성을 높입니다.
대표적으로 서버 가상화(VM), 컨테이너 가상화(Docker), 네트워크 가상화(SDN)가 있다.
LXC vs Docker 차이
LXC는 전통적인 리눅스 컨테이너 기술로, VM과 유사한 환경을 제공하는 데 초점이 맞춰져 있다.
여기서 말하는 VM과 유사한 환경은 다른 OS 환경을 제공하는 것이 아니라, 다른 애플리케이션으로부터 독립적인 환경을 제공하는 것을 의미한다.
별도 이미지 관리 시스템이 없으며, 시스템 관리자가 초기 자원 설정을 해줘야 한다.
Docker는 애플리케이션 배포 및 실행에 최적화되어 있으며, 프로세스 수준의 격리를 합니다.
도커 이미지를 통해 간편하게 배포할 수 있으며, 명령어 기반 빠른 배포가 가능하다.
Docker Engine 위에서 동작하며, 도커 엔진이 설치된 어느 환경에서든 실행할 수 있다.
Linux Container
1. namespace
Linux의 namespace는 커널 수준에서 프로세스를 격리하는 기능으로, 서로 독립된 환경으로 분리하는 가상화 기술이다.
1.2 namespace Role
namespace로 격리된 프로세스들은 같은 시스템에서 실행되지만, 특정 리소스(파일 시스템, 네트워크, PID, 사용자 ID)를 서로 독립적으로 사용할 수 있도록 제한되어 있다. (서로 간섭할 수 없음)
1.3 namespace Type
PID : 독립적인 프로세스 공간 할당
Mount : 독립적인 파일 시스템 마운트
Network: namespace 간 네트워크 충돌 방지
UTS : 독립적인 hostname 할당
IPC : 프로세스간 독립적인 통신 통로 할당
User : 독립적인 사용자 할당
💬 Namespace를 통해 동일한 PID를 가질 수도 있다? Linux의 PID namespace를 사용하면, 하나의 시스템 내에서 동일한 PID를 가진 프로세스가 존재할 수 있다. 이는 각 PID namespace가 서로 독립적인 프로세스 ID 공간을 가지기 때문이다.
2. cgroup
control group의 약자로, 하드웨어 자원을 배분하는 기능을 수행합니다.
격리된 프로세스에 하드웨어 자원을 배분하기 위해서 cgroup 기능을 사용합니다.
→ cgroup을 사용하면 CPU, RAM 등의 자원을 사용자가 원하는 만큼 격리된 프로세스에 할당해 줄 수 있습니다.
➡️ namespace와 cgroup으로 만들어진 컨테이너를 LXC라고 부릅니다.
가상화 발전 과정
Legacy
하나의 물리 서버에 여러 애플리케이션을 실행시킵니다.
애플리케이션 간 라이브러리나 미들웨어 버전 충돌이 발생할 수 있다.
물리 서버 하나에서 여러 애플리케이션을 실행하면, 리소스를 과다 사용하는 애플리케이션이 다른 애플리케이션의 성능 저하를 유발할 수 있습니다.
이를 해결하고자 서로 다른 여러 물리 서버에 각 애플리케이션을 실행하는 것은 자원 낭비와 비용 증가로 이어질 수 있습니다.
VM
실제 Host 운영체제 위에 가상화 소프트웨어(Hypervisor)를 설치해서 가상환경을 구축합니다.
VM간의 애플리케이션을 격리하고 다른 애플리케이션의 정보를 액세스 할 수 없어 일정 수준의 보안성을 보장합니다.
가상 환경마다 리소스를 효율적으로 분배하여 관리할 수 있다.
하지만, 가상 환경을 구축하는 것은 OS를 추가적으로 올리는 것이다. 이는 큰 용량을 차지하고 불필요한 기능도 올라가게 되어, 성능 저하로 이어질 수 있다.
Container
컨테이너 실행을 위한 소프트웨어인 컨테이너 런타임이 존재한다. (ex: Docker Engine)
컨테이너는 Guest OS 없이, 호스트 OS의 커널을 공유하여 애플리케이션을 실행한다.
컨테이너에서 OS가 실행되긴 하지만 사용자가 사용할 프로그램만 작동되도록 최소 단위만 포함된다.
Docker
컨테이너화 기술을 사용하여 애플리케이션을 독립된 환경에서 실행하게 해주는 컨테이너 기술이다.
컨테이너는 호스트 운영체제의 커널을 공유하며 애플리케이션과 필요한 라이브러리만 포함합니다.
Host OS
도커는 호스트 OS 위에서 실행됩니다.
Docker Engine
도커 엔진은 호스트 OS 위에서 실행되며, 컨테이너를 관리하고 실행합니다.
Docker Container
각 컨테이너는 애플리케이션과 필요한 라이브러리만 포함하며, 호스트 OS 커널을 공유하여 사용합니다.
장점
경량화
호스트 OS의 커널을 공유하므로, VM보다 빠르고 가볍습니다.
애플리케이션과 필요한 라이브러리만 포함하므로 적은 자원을 사용합니다.
이식성
도커 이미지를 통해 개발, 테스트, 운영 환경에서 일관된 실행 환경을 보장할 수 있습니다.
도커 이미지를 이용해 다양한 플랫폼에서 동일하게 실행할 수 있습니다.
배포성
컨테이너는 빠르게 배포되고, 업데이트 및 롤백이 가능합니다.
단점
도커는 리눅스 기반이며, 다른 운영체제에서 사용하기 위해서 리눅스 커널을 설치해야 한다.
Docker Engine
Docker Engine은 도커 컨테이너를 생성, 실행, 중지, 삭제 등의 작업을 관리하는 핵심 컴포넌트이다.
Client - Server 아키텍처를 기반으로하며, 주 구성 요소는 Docker Daemon, Docker CLI, Docker REST API가 있다.