Linux Namespace란? 프로세스 격리와 Docker 컨테이너의 핵심 기술 이해

Docker나 Kubernetes를 공부하다 보면 반드시 등장하는 개념이 Namespace입니다. 많은 사람들이 Docker가 독립적인 운영체제를 실행한다고 생각하지만, 실제로는 하나의 Linux Kernel을 여러 컨테이너가 함께 사용합니다.

그럼에도 각 컨테이너는 자신만의 프로세스, 네트워크, 파일 시스템을 가진 것처럼 동작합니다. 이러한 격리(Isolation)를 가능하게 하는 핵심 기술이 바로 Linux Namespace입니다.

Namespace는 Linux Kernel이 제공하는 기능으로, 프로세스마다 시스템 자원을 서로 다른 공간처럼 보이게 만들어 독립적인 실행 환경을 제공합니다.

이번 글에서는 Namespace의 개념과 동작 원리, 종류, Docker와 Kubernetes에서 어떻게 활용되는지 자세히 알아보겠습니다.

Linux Namespace란?

Namespace는 프로세스가 시스템 자원을 독립적으로 바라보도록 격리하는 Linux Kernel 기능입니다.

동작 구조는 다음과 같습니다.

Linux Kernel

↓

Namespace

↓

Container A
Container B
Container C

↓

각각 독립된 환경

실제로는 하나의 Kernel을 공유하지만, 각 컨테이너는 자신만의 시스템처럼 인식합니다.

Namespace가 필요한 이유

예를 들어 하나의 서버에서 여러 개의 웹 서비스를 실행한다고 가정해 보겠습니다.

Namespace가 없다면

  • 프로세스 목록 공유
  • 네트워크 공유
  • 마운트 정보 공유
  • IPC 공유

등으로 인해 서로 영향을 주게 됩니다.

Namespace를 사용하면

Container A

↓

독립된 PID

독립된 Network

독립된 Mount

↓

다른 컨테이너와 완전 분리

와 같이 동작합니다.

Namespace 종류

Linux는 여러 종류의 Namespace를 제공합니다.

Namespace역할
PID프로세스 격리
Network네트워크 격리
Mount파일 시스템 격리
UTSHostname 격리
IPC프로세스 간 통신 격리
User사용자 및 권한 격리
Cgroupcgroup 정보 격리
Time시간 관련 정보 격리(Linux 5.6+)

각 Namespace는 독립적으로 사용할 수도 있고 함께 사용할 수도 있습니다.

PID Namespace

PID Namespace는 프로세스 번호(PID)를 분리합니다.

예를 들어 컨테이너 내부에서는

PID 1

↓

nginx

처럼 보이지만,

호스트에서는

PID 34872

↓

docker-container

처럼 다른 PID를 가질 수 있습니다.

컨테이너 내부에서는 자신이 시스템 전체의 첫 번째 프로세스처럼 동작합니다.

Network Namespace

Network Namespace는 네트워크 장치를 독립적으로 제공합니다.

각 컨테이너는

  • 독립 IP
  • 독립 Routing Table
  • 독립 Firewall
  • 독립 Port

를 사용할 수 있습니다.

확인

ip netns

Docker 역시 내부적으로 Network Namespace를 생성하여 컨테이너를 분리합니다.

Mount Namespace

Mount Namespace는 파일 시스템을 격리합니다.

예를 들어

Container A

/

↓

/etc

/var

/app

Container B

/

↓

/etc

/var

/data

서로 다른 디렉터리 구조를 가질 수 있습니다.

실제로는 동일한 Kernel을 사용하지만 파일 시스템은 독립적으로 관리됩니다.

UTS Namespace

UTS Namespace는 Hostname과 Domain Name을 분리합니다.

예를 들어

컨테이너 A

hostname

↓

web01

컨테이너 B

hostname

↓

db01

같은 서버에서도 서로 다른 Hostname을 사용할 수 있습니다.

IPC Namespace

IPC Namespace는 프로세스 간 통신(Inter Process Communication)을 격리합니다.

다음 자원을 분리합니다.

  • Shared Memory
  • Semaphore
  • Message Queue

서로 다른 컨테이너의 프로세스는 IPC를 공유하지 않습니다.

User Namespace

User Namespace는 사용자 권한을 분리합니다.

예를 들어

컨테이너 내부에서는

root

로 실행되더라도

호스트에서는

UID 100000

등 일반 사용자로 매핑될 수 있습니다.

이 기능은 컨테이너 보안을 크게 향상시킵니다.

Namespace 확인

현재 Namespace는 다음 명령으로 확인할 수 있습니다.

lsns

예시

NS

TYPE

PID

COMMAND

Namespace 목록과 연결된 프로세스를 확인할 수 있습니다.

특정 프로세스 Namespace 확인

ls -l /proc/PID/ns

예시

mnt

pid

net

ipc

uts

user

프로세스가 사용하는 Namespace 정보를 확인할 수 있습니다.

새로운 Namespace 생성

간단한 테스트는 unshare 명령으로 가능합니다.

sudo unshare --pid --fork bash

새로운 PID Namespace에서 Bash를 실행합니다.

Hostname Namespace 생성

sudo unshare --uts bash

새로운 Hostname 공간이 생성됩니다.

Docker와 Namespace

Docker는 컨테이너 생성 시 다음 기능을 사용합니다.

Docker

↓

Namespace

+

cgroups

↓

Container

Namespace는 격리를 담당하고,

cgroups는 CPU, 메모리 등의 자원을 제한합니다.

두 기술이 함께 동작하여 컨테이너를 구현합니다.

Kubernetes와 Namespace

Kubernetes의 Pod 역시 Linux Namespace를 사용합니다.

일반적으로 하나의 Pod 내부 컨테이너는

  • Network Namespace 공유
  • IPC 공유
  • Volume 공유

하지만 서로 다른 Pod는 독립된 Namespace를 가집니다.

실무에서 자주 사용하는 명령어

Namespace 확인

lsns

프로세스 Namespace 확인

ls -l /proc/PID/ns

Network Namespace 확인

ip netns

새로운 PID Namespace 생성

sudo unshare --pid --fork bash

새로운 UTS Namespace 생성

sudo unshare --uts bash

현재 Hostname 확인

hostname

실무 사례

예를 들어 하나의 서버에서 동일한 Nginx 애플리케이션을 여러 개 실행해야 하는 경우를 생각해 보겠습니다.

Namespace가 없다면 프로세스와 포트 충돌이 발생할 수 있습니다.

Docker는 각 컨테이너마다 PID, Network, Mount Namespace를 생성하여 서로 영향을 주지 않도록 격리합니다.

관리자는 lsns 명령으로 현재 Namespace를 확인하고, unshare를 이용해 테스트 환경을 구성할 수 있습니다.

자주 묻는 질문

Namespace와 cgroups의 차이는 무엇인가요?

Namespace는 격리(Isolation) 를 담당하고, cgroups는 자원 제한(Resource Control) 을 담당합니다. Docker는 두 기능을 함께 사용하여 컨테이너를 구성합니다.

Namespace만 사용하면 컨테이너를 만들 수 있나요?

아닙니다. Namespace는 격리 기능만 제공합니다. 실제 컨테이너 환경을 만들기 위해서는 cgroups, OverlayFS, Capabilities, Seccomp 등의 기술도 함께 사용됩니다.

PID Namespace에서 PID 1은 특별한 의미가 있나요?

있습니다. PID Namespace 내부의 PID 1은 해당 Namespace의 초기 프로세스로, 종료되면 해당 Namespace 내부의 다른 프로세스들도 함께 종료될 수 있습니다. 그래서 컨테이너에서는 PID 1 프로세스의 역할이 매우 중요합니다.

마무리

Linux Namespace는 하나의 Kernel을 공유하면서도 프로세스, 네트워크, 파일 시스템, 사용자 정보 등을 독립적으로 격리하는 핵심 기술입니다. Docker와 Kubernetes는 Namespace와 cgroups를 함께 활용하여 안전하고 효율적인 컨테이너 환경을 제공합니다. Namespace의 구조와 종류를 이해하면 컨테이너 기술의 동작 원리를 훨씬 쉽게 이해할 수 있으며, 실무에서도 문제 해결과 성능 분석에 큰 도움이 됩니다.

댓글 남기기