Priceless

[Docker]chroot Container 본문

Docker & Kubernetes/Docker

[Docker]chroot Container

Hyun__ 2023. 12. 17. 01:00

chroot

chroot

change root directory

root directory .을 특정 디렉토리로 변경한다

UNIX command 및 system call로 존재한다

 

예제

가장 상단의 '/' 디렉토리가 root directory이며

임의의 '/mnt/chroot'의 폴더를 생성하고 폴더 내에 추가적인 파일을 생성한 후

아래의 명령어를 실행하면 호스트의 root directory가 

'/mnt/chroot/usr/local'로 변경된다

chroot /mnt/chroot

 

 

이를 사용할 경우 각 프로세스마다 private mount layout을 가질 수 있는 장점이 있다

특정 파일 설치, 복구, 보안 모드 등에 사용할 수 있다

 

 

보안 측면의 격리

chroot를 통해 기초적인 격리를 할 수 있다

sandbox의 개념으로 별도의 구현체는 아니며, 구현체 중 sandbox가 있으므로 혼동하면 안된다

 

chroot root로 격리된

directory hierarchy를 통해 경로를 속일 수 있어

동일한 프로그램을 다른 환경으로 쉽게 복제할 수 있다

 

 

실습

아래 명령어를 입력한다

filezilla를 설치하고 실행한다

환경설정을 수정한다

접속한 후 Home 디렉토리를 확인한다

 

이후 root 권한으로 파일을 여는 설정을 추가하고

설정을 저장하여 reboot한다

 

reboot 한 후 filezilla를 실행하면

Home 디렉토리가 변경된 것을 알 수 있다

 

 

 

Isolation

격리

격리의 필요성

시스템 내에 존재하는 자원은 한정적이므로 

한정적인 자원을 효율적으로 분배하면 시스템의 가용성을 올릴 수 있다

 

Scope of Process

현대적인 OS는 프로세스가 독립적인 공간을 가지게 한다

장점: 프로세스마다 고유한 공간을 가진다

단점: 외부 통신을 위해 IPC(Inter-Process Communication)를 사용하여 I/O 비용이 증가 한다

DBMS(DB Management System)나 서버 시스템 등 여러 프로세스가 사용되는 시스템에서는 비용이 더욱 증가한다

 

한 시스템에 두 개의 DBMS를 구동하면 충돌이 발생하므로 

물리적으로 두 대 이상의 컴퓨터를 통해 DBMS를 구동하는 것이 좋다

 

활용

- 보안, 자원 관리적 측면

특정 파일의 경로 접근을 제한하여

시스템 자원 사용을 제한한다

 

 

- 호환, 충돌 측면

같은 라이브러리의 다른 버전을 사용해야 하는 경우

격리를 사용할 경우 충돌이 발생하지 않는다 

 

Namespace

역사

분산 컴퓨팅 시스템으로서 

local system과 remote system을 hierarchical file system으로 표현하여

디렉토리 방식으로 표현할 수 있다

특정 리소스의 사용은 hierarchical file name space를 갖는 것과 같다

 

Linux에서의 namespace

Linux-specific을 구현하여 

고립된 자원을 namespace의 hierarchical file system 형태로 구현한다

구현된 형태로 자원은 각자의 디렉토리를 가진다

 

총 7개의 namespace 종류를 가진다

mount, UTS(Unix Time Sharing), IPC, network, PID, user, cgroup

 

UNIX namespace를 관리하는 명령어로

unshare, lsns, nsenter 가 있다

 

 

cgroup(control group)

OS level abstraction

group별로 가상화된 공간을 만들고 자원을 제약할 수 있다

docker, hadoop, systemd 등 수많은 프로젝트들이 cgroup을 사용한다

 

LXC(LinuX Container)

초기 리눅스 컨테이너 기술의 발판

docker의 경우도 초기에 lxc를 사용했으나 교체된 상태이다

 

 

Docker

Container 구현

docker는 container를 세련된 방식으로 구현한 제품의 일종으로

격리된 자원의 묶음인 image와 런타임으로 구성된다

기본적으로 Client Server system 구조를 가지므로 daemon이 작동된다

 

host OS 위에서 작동하는 격리된 프로세스의 일종이므로

virtual machine과 달리 resource의 overhead가 크게 발생하지 않아

local 환경에서 구동하는 방식과 성능에서 큰 차이가 없다

 

daemon으로 작동하면서 child process로 수직적으로 관리하므로

daemon process에 문제가 발생하면 모든 프로세스에 문제가 나타난다

 

관리자 권한으로 실행되므로 보안상 문제가 발생할 수 있다

 

Docker vs Hypervisor

hypervisor위에 각 OS를 올리는 방식이다

그러므로 자원을 받기 위해 app에서 hyper를 거쳐 인프라를 거쳐야한다

그 과정에서 손실이 많이 발생한다

 

docker의 app은 OS와 바로 인프라와 연결되므로 

손실이 거의 발생하지 않는다

 

Podman

리눅스 컨테이너의 대안으로

기존 docker의 단점과 상용화 문제를 해결한 container이다

 

daemon service가 아니며, admin account가 없다

또한 systemd와 잘 어울려 서비스화 시키기 편리하다

 

Container의 미래

- Docker

구조적, 기술적 문제가 있지만 매력적인 기술로 

docker와 바탕이 되는 개념을 잘 이해하고 있으면 다른 container 기술을 이해하기에 도움이 된다

 

- Container 기술의 복잡성 증가

다양한 컨테이너가 나타나고 있으므로 

개념을 이해하고 시기와 환경에 따라 적절한 컨테이너를 사용해야 한다

 

실습

Unshare

고유의 공간을 만들고 그 안에서 프로그램을 실행한다

 

명령어 unshare는 

unshare라는 프로그램으로 격리된 프로세스를 생성한다

프로세스의 이름은 bash이다

 

-p(--pid)를 통해 격리된 pid를 사용한다

그러므로 bash 프로세스의 pid는 1이다

 

-f(--fork)를 통해 자식 프로세스를 만들어서 실행한다

 

--mount-proc를 통해

PCB(Process Control Block)를 가져와

proc 파일 시스템을 고유 공간으로 가져온다

 

 

Unshare: net

네트워크를 격리시킨다

 

ss 명령어를 통해 

listen하고 있는 네트워크를 확인한다

53번, 631번 포트가  listen 중이다

 

nc 명령어를 통해 5000번 포트를 open한다

밖에 나온 포트는 host machine의 4036번이다

 

다시 확인하면 5000번 포트인 것을 확인할 수 있다

 

 

unshare -n을 통해

네트워크를 격리시킨다

 

bash의 네트워크를 격리한 후

ps와 ss 명령어를 통해 확인하면

4036번이 있고 4039번과 4049번이 생겼는데

5000번 포트는 나타나지 않았다

5000번 포트에 새롭게 할당할 수 있다

Lsns

namespace를 리스팅한다

 

unshare가 실행되는 터미널을 두고

새 터미널을 실행하여 root 계정으로 접속한다

 

lsns 명령어를 실행하면 

시스템의 모든 namespace를 확인할 수 있다

 

방금 실행한 4039를 확인할 수 있으며

네트워크가 격리되어 있다

 

 

 

 

Virtualization

Isolation: Virtual machine

Virtual machine

Full virtualization(hypervisor)를 사용하므로

소프트웨어로 가상화된 하드웨어를 구현한다

실제로 존재하지 않는 하드웨어를 추상화한다

 

이를 통해 완전히 격리된 공간을 제공하지만 

성능이 낮아지고 독점적으로 자원을 점유하기 어려워 

효율적인 사용이 불가능하다

 

HW, OS, Application on VM

다양한 OS 위에 돌아가는 native application에

다른 프로그램이 다시 들어간다

그 위에 logical HW 를 구현하여 VM을 실행한다

 

시스템의 HW를 끌어쓰므로 오버헤드가 많이 발생한다

그 위에 새로운 application을 쓰면 더욱 커지므로 

지속적인 사용이 어렵다

 

 

Isolation: Sandbox

sandbox

격리된 공간의 개념으로

VM, container, chroot 등 다양한 방법으로 구현 가능하다

 

테스트 유닛으로서 격리된 공간, 보안 공간, 복제된 서비스 공간 등으로 사용할 수 있다

 

프로그램이 작동하기 위해서는 많은 외부 자원을 필요로 한다

 

많은 리소스를 필요한 경우

격리를 통해 서로를 인식하지 못하게 하여

중첩을 막는다

 

sandbox 중 가장 효과적인 프로그램 중 하나가 docker이다

'Docker & Kubernetes > Docker' 카테고리의 다른 글

[Docker]docker compose  (0) 2023.12.23
[Docker]Docker CLI for execution  (1) 2023.12.20
[Docker]Docker CLI for images  (0) 2023.12.17
[Docker] Docker Installation in Linux  (1) 2023.12.17