카테고리 없음

[TIL] Docker 컨테이너에 대한 간단한 이해

bluealice 2025. 7. 16. 17:50

Docker 가 리눅스 기반에서만 실행될 수 있는 것은 리눅스 OS 에서 제공하는 특별한 기능을 사용하기 때문이다.
Docker 가 사용하는 linux 기술에는 여러가지가 있고, 더 깊은 내용들이 있지만 일단은 namespace 와 cgroup에 대해 이해한 내용을 간단히 정리해보려고 한다.

 

참고

 

컨테이너를 위한 리눅스 기능: cgroup, namespace, union mount

컨테이너 기술의 근간이 되는 Cgroup, Namespace, Union mount에 대해 알아보자.

velog.io

 

결론부터 말하자면, namespace 는 별도의 커널 자원을 분리하는 것이고, Cgroup 은 control group 의 약자로 HW 자원을 분리한 것이다. 커널과 하드웨어 자원을 따로 분리해서 가지기 때문에, 다른 컴퓨터인 것처럼 가상화해서, 즉 격리해서 사용할 수 있다. 격리해서 사용할 수 있다는 것은, HOST 에서 기존에 사용하고 있던 다른 자원이나 설정을 공유하지 않고 해당 어플리케이션을 실행하는 최적의 환경을 구축할 수 있다는 얘기이다. 

 



1. namespace 

Namespace를 따로 가지기 때문에 컨테이너 안에서 PID와 그 트리를 따로 가진다. 실제로 linux 에서 새로운 네임스페이스를 생성할 수 있는 bash 명령어 'unshare' 을 실행하면 위치가 root 로 바뀌고 pid 가 1임을 확인할 수 있다. 물론 host 에서는 해당 namespace 가 어디에 있는지 알고 있지만, namespace 안에서는 그런 상황을 모르는 것처럼 새로운 컴퓨터 환경인 것처럼 사용할 수 있는 것이다. namespace는 Process ID, Network, Filesystem/mount, IPC, UTS(호스트명, 도메인명 격리), User(UID, GID 정보) 정보들을 따로 할당받는다. 

1) 네트워크 격리 : Network를 할당받을 수 있다는 것을 쉽게 이해하면 컨테이너 안에서 0~65535 까지 따로 port 를 가질 수 있다는 것이다. host 에서 어떤 port를 사용중인지 신경 쓸 필요가 없다. 그래서 docker 컨테이너 안에서 port 를 따로 설정할 수 있는 것이다. 그러나 가상화된 네트워크이기 때문에, host 의 network 인터페이스로부터 실제 요청을 전달받기 위해서 네트워크 드라이버에 연결한다. 이때 설정하는 host 의 port 는 host 에서 사용하지 않고 있는 port 를 사용해야 한다. 그러나 컨테이너 내에서는 자유롭게 설정할 수 있고, docker 에서는 docker network interface 설정 시 이러한 사항을 쉽게 설정할 수 있도록 지원하고 있다. 

 


2. CGroup(control group)

 

하드웨어 자원도 따로 가진다. 이것을 Cgroup 이라고 한다. cpu 사용시간이나 메모리 사용량, BlockI/O, ssd/hdd 등의 사용 제한, cgroup 별 cpu 자원 사용에 대한 보고서 생성 등의 여러 자원을 할당받는다. 다양한 hw 자원을 마치 파일처럼 관리할 수 있도록 마운트한 '파일시스템' 이라고 이해할 수 있다. 컨테이너에 hw 자원도 격리하여 host 프로세스에 대한 영향을 최소화하고, I/O, 데이터 저장 등에 관한 사항도 전부 다르게 관리할 수 있다. 

이와 같이, linux 에서는 컨테이너가 별도의 namespace 와 Cgroup 을 할당받음으로써 커널과 hw 적 자원을 별도로 가져가고, 격리된 환경에서 어플리케이션을 최적의 환경에서 실행할 수 있는 기술 기반을 제공한다. 이를 Docker가 이용하여 cli 를 통해, 혹은 GUI 를 통해 사용자들이 컨테이너 기술을 쉽게 사용할 수 있도록 제공했다. 

 


3. Docker

1) 가상화 기술

출처 : https://velog.io/@s0nnyday/Docker-%EA%B0%9C%EB%85%901

 

windows 와 같은 os 에서는 이러한 자원 분리 기능이 딱히 없다. 그래서 Hypervisor 라는 소프트웨어의 도움을 받아 linux 처럼 자원을 격리할 수 있는 것인데, 이 위에는 Guest OS을 올려 커널과 파일시스템을 할당받은 격리된 환경을 구축하는 방식으로 가상화를 진행한다. 그런데 이 Guest OS 는 자체 OS 부팅, 기본 기능으로 필요한 모든 시스템 파일과 유틸리티 등 단순히 '어플리케이션' 하나만 올리는 데는 딱히 필요가 없는 소프트웨어들이 잔뜩 실행된다. 정말 하나의 가상 컴퓨터처럼 사용할 거라면 문제가 없지만, 단순히 어플리케이션 하나 잘 실행하겠다고 GuestOS 를 실행할 필요는 없는 것이다. 

그와 반대로 컨테이너는 Host 의 커널을 공유하고, 어플리케이션을 실행하는 데 필수적으로 필요한 자원들만 할당받기 때문에 경량화된 격리 환경을 가진다. 또한 Docker 라는 소프트웨어를 사용하면 어플리케이션을 배포하고, 쉽게 실행할 수 있기 때문에, 이런 점에서 Docker 는 어플리케이션 배포/저장/실행을 최적화하는 기술이라고 생각한다. 

2) 이미지
이미지라는 것을 통해, 컨테이너가 어떤 식으로 실행될 것인지에 대한 '청사진' 을 파일로 만들어 저장하고, 그것을 네트워크 망에서 자유롭게 배포하고 사용할 수 있다. 
사용자는 직접 컨테이너를 생성하고, 그 안에서 환경을 구축하고, 원하는 어플리케이션을 실행시키는 일련의 과정을 일일이 수행하지 않아도, 간단한 docker cli 명령어를 사용하여 dockerd 에서 이미지를 사용해 그러한 과정을 한꺼번에 수행할 수 있도록 해준다. 

 


4. 정리

Linux 의 namespace 와 cgroup 등의 기술을 통해 격리된 환경에서 프로그램을 실행할 수 있는 컨테이너를 구축할 수 있고, Docker 를 통해 이 기술을 활용한 어플리케이션 배포를 쉽게 진행할 수 있다. 따라서, Guest OS 를 올리지 않아도 경량화된 컨테이너를 구성하여 어플리케이션을 최적화된 환경에서 실행할 수 있고, 내부의 네트워크 드라이버를 통해 컨테이너를 HOST 와 다른 컨테이너들과 연결할 수 있다. 
이미지를 통해 컨테이너를 구축할 수 있는데, tar 와 비슷한 압축파일 형태로 네트워크 상에서 자유롭게 다운로드받을 수 있기 때문에 배포를 위한 기술로서도 대중적으로 활용된다.