Linux 네임스페이스와 도커 격리 기술 분석

Linux 네임스페이스는 컨테이너 기술의 핵심 기반입니다. 도커의 격리 기능은 이 기술을 통해 구현되며, 시스템 자원을 논리적으로 분리하는 방식으로 작동합니다. 이번 글에서는 네임스페이스의 다양한 유형과 Go 언어를 활용한 실습 예제를 통해 도커의 내부 메커니즘을 탐구합니다.

  1. 네임스페이스의 기본 개념

네임스페이스는 커널 수준에서 시스템 자원을 격리하는 기법입니다. 특정 네임스페이스에 속한 프로세스는 독립적인 자원 환경을 가지며, 다른 네임스페이스의 영향을 받지 않습니다. 현재 Linux 커널에는 8가지 유형의 네임스페이스가 구현되어 있습니다.

유형 시스템 호출 파라미터 격리 항목 최소 커널 버전
마운트 네임스페이스 CLONE_NEWNS 마운트 포인트 2.4.19
UTS 네임스페이스 CLONE_NEWUTS 호스트네임 및 도메인 2.6.19
IPC 네임스페이스 CLONE_NEWIPC 시스템 V IPC 2.6.19
PID 네임스페이스 CLONE_NEWPID 프로세스 ID 2.6.24
네트워크 네임스페이스 CLONE_NEWNET 네트워크 스택 2.6.24
사용자 네임스페이스 CLONE_NEWUSER 사용자 ID 2.6.23
Cgroup 네임스페이스 CLONE_NEWCGROUP Cgroup 루트 4.6
시간 네임스페이스 CLONE_NEWTIME 부팅 시간 5.6

API 사용법

네임스페이스 관련 주요 함수는 4가지입니다:

  • clone: 새로운 네임스페이스 생성
  • setns: 기존 네임스페이스에 참여
  • unshare: 현재 네임스페이스 분리
  • ioctl_ns: 네임스페이스 정보 조회

예제 코드:

func main() {
    process := exec.Command("bash")
    process.SysProcAttr = &syscall.SysProcAttr{
        NamespaceFlags: syscall.CLONE_NEWUTS | syscall.CLONE_NEWPID,
    }
    // ...
}
  1. 네임스페이스 실습

UTS 네임스페이스 테스트

func main() {
    cmd := exec.Command("bash")
    cmd.SysProcAttr = &syscall.SysProcAttr{
        NamespaceFlags: syscall.CLONE_NEWUTS,
    }
    // ...
}

실행 후 /proc/[pid]/ns/uts 경로를 확인하면, 새로운 네임스페이스가 생성된 것을 확인할 수 있습니다.

PID 네임스페이스 구현

cmd.SysProcAttr = &syscall.SysProcAttr{
    NamespaceFlags: syscall.CLONE_NEWUTS | syscall.CLONE_NEWPID,
}

이 설정으로 인해 컨테이너 내부에서 ps 명령어는 1번 PID를 가진 프로세스만 표시됩니다.

마운트 네임스페이스 적용

cmd.SysProcAttr = &syscall.SysProcAttr{
    NamespaceFlags: syscall.CLONE_NEWNS,
}

이 코드는 파일 시스템 마운트 포인트를 격리하여, 컨테이너 내부의 /proc 디렉토리가 별도의 뷰를 가지도록 합니다.

  1. 결론

네임스페이스는 도커와 같은 컨테이너 기술의 핵심 기반입니다. 다양한 네임스페이스 유형을 활용하여 시스템 자원을 효과적으로 격리할 수 있으며, Go 언어를 통한 실습을 통해 이 기술의 작동 원리를 이해할 수 있습니다.

태그: Linux 네임스페이스 도커 격리 Go 언어 컨테이너 기술 네트워크 격리

8월 23일 19:25에 게시됨