docker container chroot clone unshare -n

agnusdei·2023년 10월 29일

리눅스 컨테이너는 리눅스 운영 체제에서 프로세스를 격리된 환경에서 실행하는 가상화 기술입니다. 컨테이너는 애플리케이션과 그에 필요한 모든 종속성을 포함하는 독립적인 단위로서 실행됩니다. 이를 통해 애플리케이션의 배포와 관리를 단순화하고, 시스템 자원의 효율적인 사용을 가능하게 합니다.

컨테이너를 생성하기 위해 다양한 방법과 도구가 있지만, 여기서는 주요한 방법 중 하나인 리눅스 네임스페이스와 Cgroups를 사용하여 컨테이너를 생성하는 과정에 대해 설명하겠습니다. 다음은 주요 단계와 코드 예시입니다.

  1. 네임스페이스 분리: unshare 명령어나 clone 시스템 호출을 사용하여 프로세스의 네임스페이스를 분리합니다. 네임스페이스는 프로세서 간에 자원을 격리하는 데 사용되며, 각 컨테이너마다 독립적인 네트워크, 파일 시스템, PID 등의 네임 스페이스가 필요합니다.

    unshare --mount --uts --ipc --net --pid --fork
  2. 파일 시스템 마운트: mount 명령어를 사용하여 컨테이너의 파일 시스템을 마운트합니다. 이 단계에서는 최소한의 파일 시스템을 마운트해야 합니다.

    mount -t proc proc /proc
    mount -t sysfs sysfs /sys
  3. 리소스 제한 설정: Cgroups를 사용하여 컨테이너에 대한 리소스 제한을 설정합니다. 이를 통해 CPU, 메모리, 디스크 I/O 등의 리소스 사용량을 제어할 수 있습니다.

  4. 네트워크 구성: 컨테이너 내부에서 네트워크를 구성하기 위해 가상 네트워크 인터페이스(Virtual Ethernet)와 IP 주소 할당 등의 작업을 수행합니다.

  5. 애플리케이션 실행: 컨테이너 내부에서 실행할 애플리케이션 또는 서비스를 시작합니다.

위의 단계는 컨테이너 생성 과정의 핵심입니다. 코드 예시에서는 Bash 스크립트로 간단하게 나타내었습니다.

#!/bin/bash

# 1. 네임스페이스 분리
unshare --mount --uts --ipc --net --pid --fork

# 2. 파일 시스템 마운트
mount -t proc proc /proc
mount -t sysfs sysfs /sys

# 3. 리소스 제한 설정 (예: CPU)
mkdir /sys/fs/cgroup/cpu/my_container
echo 50000 > /sys/fs/cgroup/cpu/my_container/cpu.cfs_quota_us
echo 100000 > /sys/fs/cgroup/cpu/my_container/cpu.cfs_period_us

# 4. 네트워크 구성 (예: 가상 네트워크 인터페이스 생성)
ip link add veth0 type veth peer name veth1
ip link set dev veth1 netns $$
ip addr add 192.168.0.1/24 dev veth0
ip link set dev veth0 up

# 5. 애플리케이션 실행 (예: NGINX 서버 시작)
nginx -g "daemon off;"

위의 예시 코드는 간단한 컨테이너를 생성하는 과정을 보여줍니다. 실제로는 더 많은 설정과 작업이 필요할 수 있으며, 컨테이너 관리 도구(예: Docker, Kubernetes)를 사용하여 이러한 작업을 자동화하고 관리할 수도 있습니다.

컨테이너 생성에 대한 설명은 상당히 복잡하고 다양한 측면을 포함할 수 있습니다. 위의 단계와 코드 예시는 기본 개념과 핵심 요소를 이해하는 데 도움이 될 것입니다.

profile
DevSecOps, Pentest, Cloud(OpenStack), Develop, Data Engineering, AI-Agent

0개의 댓글