60줄의 Go 코드로 컨테이너를 직접 만들어보자!

by DD
1주 전
조회수 14

컨테이너(Container)는 애플리케이션과 실행 환경을 묶어 호스트 머신과 동일하게 동작하도록 하는 기술이며, 'Works on My Machine' 문제를 해결한다.

고(Go) 언어를 사용하여 리눅스 시스템 콜(Linux System Call)을 직접 호출, 도커(Docker)의 핵심 기능을 60줄의 코드로 구현하는 과정을 설명한다.

네임스페이스(Namespace)를 활용하여 호스트네임(Hostname)을 격리하고, 컨테이너 내부에서 다른 호스트네임을 갖도록 설정한다.

파일 시스템(File System) 격리, PID(Process ID) 격리, cgroups를 이용한 무한 루프 방지 등 컨테이너의 핵심 기능 구현은 다음 파트에서 다룬다.

컨테이너(Container)의 핵심 원리: 네임스페이스(Namespace)

본문에서는 컨테이너(Container)가 단순히 격리된 디렉터리가 아닌, 리눅스 네임스페이스(Linux Namespace)를 활용하여 프로세스를 격리한다고 설명한다.

UTS 네임스페이스(UTS Namespace): 호스트네임(Hostname) 격리를 통해 컨테이너 내부에서 다른 호스트네임을 갖도록 설정

CLONE_NEWUTS 플래그(Cloneflags): 시스템 콜(System Call)을 사용하여 새로운 네임스페이스 생성

권한 문제: 네임스페이스 변경은 커널 레벨(Kernel Level) 작업이므로, `sudo` 권한 필요

결과적으로 네임스페이스(Namespace)는 컨테이너의 가상화된 환경(Virtualized Environment)을 구축하는 핵심 기술이며, 보안과 격리를 보장한다.

고(Go) 언어를 활용한 시스템 콜(System Call) 접근

글에서는 컨테이너 구현을 위해 고(Go) 언어를 선택한 이유를 리눅스 시스템 콜(Linux System Call)에 대한 접근성 때문이라고 설명한다.

`os/exec` 패키지: 외부 명령 실행 및 입출력(I/O) 파이프 연결

`syscall` 패키지: 네임스페이스(Namespace) 생성을 위한 저수준 시스템 콜(Low-level System Call) 제공

`/proc/self/exe`: 현재 실행 중인 프로그램의 경로를 나타내는 특수 파일(Special File)

고(Go)는 시스템 프로그래밍(System Programming)에 적합하며, 컨테이너, 쿠버네티스(Kubernetes) 등 클라우드 네이티브(Cloud Native) 기술 구현에 널리 사용된다.

프로세스 격리를 위한 자식 프로세스(Child Process) 활용

본문에서는 호스트네임(Hostname) 변경을 위해 자식 프로세스(Child Process)를 활용하는 방법을 제시한다.

`run()` 함수: `exec.Command`를 사용하여 자식 프로세스 실행, `CLONE_NEWUTS` 플래그 설정

`child()` 함수: 네임스페이스(Namespace) 내부에서 `Sethostname()` 호출, 호스트네임 변경

`/proc/self/exe` 활용: 현재 실행 중인 바이너리(Binary)를 다시 실행하여 새로운 프로세스 생성

이러한 방식을 통해 호스트네임(Hostname)을 컨테이너 내부에서 안전하게 변경하고, 격리된 환경을 구축한다.

컨테이너(Container) 구현의 다음 단계

글의 후반부에서는 파일 시스템(File System) 격리, PID(Process ID) 격리, cgroups를 이용한 무한 루프 방지 등 컨테이너(Container)의 나머지 핵심 기능 구현을 예고한다.

파일 시스템 격리: 컨테이너 내부에서 호스트 파일 시스템에 접근하지 못하도록 제한

PID 격리: 컨테이너 내부에서 호스트의 다른 프로세스를 볼 수 없도록 격리

cgroups: 자원 사용량 제한 및 무한 루프(Infinite Loop)로 인한 호스트 시스템(Host System) 장애 방지

이러한 기능들을 통해 더욱 안전하고 완벽한 컨테이너 환경을 구축할 수 있다.

Shipping Your Machine: Building a Container in 50 Lines of Code (Part 1)