본문 바로가기
IT

[docker] 동작원리

by 내일은교양왕 2024. 6. 10.

Linux의 namespacecgroup 기반으로 이루어지는데, namespace, cgroup 순으로 다루어보자.

 

namespace 다루기 전에 다루기 전 chroot에 대해 먼저 짚고 넘어가자

chroot는 namespace 나오기 전에 isolation 할 수 있는 명령어 였다.

하지만 빠져나올 수 있는 방법이 있어서 이 명령어는 더 이상 사용할 이유가 없어졌다.

자세한 설명은 링크에서 확인하자

 

namespace

chroot를 대체할 수 있는 것이 나왔다.

개념은 chroot와 비슷하다. 프로세스를 실행할 때 시스템의 리소스를 분리해서 실행할 수 있도록 도와주는 기능.

한 시스템의 프로세스들은 기본적으로 시스템의 리소스들을 공유해서 실행되는데, 이를 단일 네임스페이스라고 봐도 무방하다.

 

네임스페이스는 여러 종류가 있다.

 

PID Namespace

pid를 격리, 프로세스를 PID 네임스페이스로 분리하면 해당 프로세스의 PID가 다시 1부터 시작한다.

분리된 프로세스는 디폴트 네임스페이스와 분리된 PID 네임스페이스에 동시에 속하게 되된다. 즉 하나의 프로세스가 2개의 네임스페이스에 존재하게 되고 pid가 다르게 보여진다.

 

Network Namespace

network interfaces, IP address, routing table, 네트워크 관련 세팅 격리

 

UTS Namespace

hostname과 domain을 격리

 

IPC Namespace

내부 프로세스간 통신 격리

 

User Namespace

user와 group id 격리

 

Cgroup Namespace

cgroup 계층 뷰 격리. 최적화된 리소스 관리 가능

 

리눅스 컨테이너

운영체제 수누의 가상화 기술로 리눅스 커널을 공유하면서 프로세스를 격리된 환경에서 실행하는 기술이다. 하드웨어를 가상화하는 가상 머신과 달리 커널을 공유하기에 실행 속도가 빠르게 성능 상의 손실이 거의 없다. 컨테이너로 실행된 프로세스는 커널을 공유하지만, 리눅스 네임스페이스, 컨트롤 그룹, 루트 디렉토리 격리 등의 커널 기능을 활용해 격리되어 실행한다. 호스트 머신에게는 프로세스로 인식되지만, 컨테이너 관점에서는 마치 독립적인 환경을 가진 가상 머신처럽 보인다.

 

도커 컨테이너는 호스트 관점에서 하나의 프로세스

도커 컨테이너에 띄워진 app의 pid획득하고 호스트에서 실행되는 도커 컨테이너의 pid를 구하자

호스트에서 실행되는 도커 컨테이너를 kill -9 하면 컨테이너가 종료된다.

(docker ps에서 종료된거 확인 가능)

 


https://medium.com/@saschagrunert/demystifying-containers-part-i-kernel-space-2c53d6979504

https://www.44bits.io/ko/keyword/linux-namespace