#1. back ground
##. chroot, Isolation
##1. chroot
1. change root directory
1) root dir. 를 특정 디렉토리로 변경
2) UNIX command 및 system call 로 존재
2. 초기 chroot의 사용 (SVr4)
1) system 설치 및 복구 등 시스템 부팅 및 관련 과정에서 사용
2) 부수적으로 jail의 기능을 가짐.
-> FreeBSD의 경우 jail system call 개발하기도 함(2000)
3. 보안적 측면의 격리
1) chroot를 통해서 기초적인 격리가 가능.
가) sandbox (격리된 공간의 타입을 의미)
https://infinitt.tistory.com/361
(iOS) - 샌드박스 (SandBox), chroot 란?
SandBox iOS는 개인정보에 대한 보안을 지키며, 구동환경을 안정적으로 하기 위해 앱의 기능을 제한하고있다. iOS를 안전한 OS로 만드는 두가지 제약이 있는데 샌드박스 제약과, 백그라운드 프로세
infinitt.tistory.com
보안적 측면에서 사용되거나 특수 목적을 위해 격리된 형태의 공간을 필요 시 사용.
나) chroot로 격리된 directory hierarchy를 통해 경로를 속일 수 있다.(동일한 프로그램을 다른 환경으로 쉽게 복제할 수 있다)
4. Practice : chroot
1) 준비작업:
가. ftp 서비스를 제공하는 vsftpd 설치
$ sudo apt -y install vsftpd
나. 설치 후 서비스가 running 됬는지확인하기.
$ sudo systemctl is-active vsftpd
active
active상태가 아니면
sudo systemctl start vsftpd
명령어 입력해 start 한다.
다-1. Practice : chroot : filezilla
클라이언트 프로그램인 filezilla 설치 후 실행
$ sudo apt -y install filezilla
$ filezilla



connect working directory 는 초기 위치가 home 디렉토리이다.
좌측이 local, 우측이 remote 환경이다.
다-2. Practice : chroot : vsftpd
ㄱ)
$ sudo vim /etc/vsftpd.conf
-> root 권한으로 상기 설정파일을 여고 다음 2행을 추가하고 저장.

설정 저장 후 vsftpd를 재시작 후 status로 확인
$ sudo systemctl restart vsftpd
$ sudo systemctl status vsftpd

filezilla로 재접속 뒤 Home 디렉터리가 아닌 루트 디렉터리가 나왔다.(우측)
CWD 가 /이며, HOME 디렉터리 자체가 root directory가 됐다.
위로 못올라간다, chroot 가 시스템 서비스에서도 사용이 된다.
chroot는 UNIX명령어로도 존재하는데, rescue 모드 부팅에서 사용됨.
eg. A 시스템, B 시스템 존재, A(고장, 부팅안됨), B(정상) 이라한다면,
B에 A 의 디스크를 붙이고 부팅한 뒤에, A를 외부장치를 마운트하는 용도의 /mnt 디렉터리에 마운트 시키고 chroot /mnt를 실행한다.
chroot가 성공하면 /mnt가 새로운 root가 되므로 B로 부팅했지만, A시스템이 된다.
실제로 rescue 모드는 USB ISO로 부팅한 B와 같다.
(설치과정에서도 비슷한 과정이 존재하며, 설치프로그램: 리눅스, 리눅스가 설치할 때 /mnt/... 디렉토리에 파일 copy를 한다. copy후 chroot로 linux를 바꿔치기함.
##2. Isolation
- Namespace, cgroup
#1. 격리(isolation)의 필요성
1. 시스템 내에 존재하는 자원은 한정적, 한정적인 자원을 효율적으로 분배하면 시스템의 가용성을 올릴 수 있다.
2. Process의 scope를 생각해보면, 현대적인 OS는 프로세스가 독립적인 공간을 가지게 해준다.
- 장점: 프로세스는 고유한 공간을 받을 수 있음.
- 단점: 외부 통신을 위해서 IPC를 사용하여 I/O 비용이 높아진다.
- 여러 프로세스가 협동해야 하는 프로그램에서는 단점이 더 커짐. (Eg. DBMS 혹은 각종 server system)
** 한 시스템에 2개의 DBMS를 구동하면 DBMS를 구성하는 각종 프로세스들이 독점적으로 사용하는 디렉터리, 파일, 소켓 등이 충돌이 발생. 이를 피하기 위해 물리적으로 2개이상의 컴퓨터를 장만하는 것이 최선의 방법.
#2 Isolation의 활용
1. 보안, 자원 관리적 측면
1) 특정 파일 경로의 접근을 제한 (== 특정 시스템 자원의 사용을 제한)
-> eg. FTP 프로세스가 /home/ftp 디렉터리 이하에서만 이동하게 하고자 한다면 chroot 사용
2) 호스팅 업체라면 고성능 컴퓨터 1대로 여러 사업자에게 DB나 웹을 제공 해주기도 한다.
2. 호환, 충돌 측면(바이너리의 동시 실행)
1) 동일한 디렉터리를 사용하는 프로세스는 독립된 실행을 어떻게 할 수 있나?
2) 서로 다른 버전의 파일을 사용하는 프로세스가 있다면?
---> 예, 서로 다른 Version의 library 파일을 사용해야 하는 경우
프로세스를 동시 실행하는 것은 프로그램 수정을 통해 해결할 수 있지만, 내가 작성한 프로그램이 아니라면 소스코드를 어디서 구할 것인가?
시스템에서 격리된 공간을 제공하면 문제가 쉽게 해결된다.
(게임 동시 실행하려면 창모드로 1번 창에 1번게임, 2번창에 2번 게임 으로 설정해 서로 못보게 한다. 창모드는 격리된 공간을 의미한다. )
##2. Name space
1. History 1) The Use of Name Spaces in Plan 9 - 1992 [1] -> 분산 컴퓨팅 시스템으로서 local system, remote system을 hierarchical file system으로 표현(path 형태로 표현 할 수 있다)** 특정 리소스의 사용은 계층화된 file name space를 가지는 것과 같다.
2. LInux Namespace 1) Linux-specific 구현(비표준) -> isolated resources를 NS의 hierarchical file system형태로 구현** 구현된 형태로 resource는 각자의 directory를 가지게 된다. 2) NS 라고 표기하기도 함,
**https://9p.io/sys/doc/names.html
3. namespace kinds 1) mount, UTS*, IPC, network, PID, user, cgroup
4. binary
1) unshare, lsns, nsenter
**UTS : UNIX Time-sharing(유닉스 시분할)
##3. cgroup(control group) : 자원을 제어하는 기능 가짐
1. OS level abstraction
1) group별로 가상화된 공간을 만들고 자원을 제약할 수 있게 됨
-> 다른 그룹은 격리되어 있으므로 마치 물리적으로 다른 호스트처럼 인식
2) docker, hadoop, systemd... 수 많은 프로젝트들이 cgroup을 사용
##4. LXC(LinuX Container) ,현재 Canoical에서 공식 지원하나 사장될 가능성이 있음.
특징 초창기 리눅스 컨테이너 기술의 발판이었으며 도커 또한 초기에 lxc를 사용했지만 후에 교체됨
##5. docker.
1. container runtime
1) Standards : docker(de facto), OCI v1.0(2017)제정
가) OCI(Open Container Initiative)
2) docker는 container를 세련된 방식으로 구현한 제품의 일종
가) 격리된 자원의 묶음(image)과 런타임으로 구성
ㄱ 기본적으로 C/S(Client and Server) 구조를 가지므로 daemon이 작동됨
나) Host OS위에서 작동하는 격리된 프로세스의 일종이므로 virtual machine과 달리 Memory, File system의 I/O에서 발생되는 크리티컬한 overhead가 ㅇ벗다.
ㄱ 위 성능 부분의 특징이 docker의 가장 큰 장점.
ㄴ 왜냐하면 Host OS의 튜닝이나 성능 향상은 docker에게도 향상을 가져다 주기 때문
**단점: daemon으로 작동하면서 child process로 수직관리 이에 따라 daemon이 문제가 발생되어 죽어버리면 밑에 있는 모든 컨테이너들이 사망할 수 있다. 현재 안전성 문제로 도커 대안들을 연구하고 있다.
또한 관리자 권한 사용함에 따라 보안문제가 있다.
2. Container(Docker) vs Hypervisor(Virtual machine)
https://www.redhat.com/ko/topics/containers/containers-vs-vms
##6 podman
1. alternative of linux container
1) docker가 가장 많이 쓰이고 있으나 단점과 상용화 문제로 인해 대안 요구
2) podman은 RedHat에서 지원
->no daemon service, no admin account
-> systemd unit support
##7 Future of Container (2020~21)
1. docker:입지가 불안하고, 구조적, 기술적 문제가 있으나 여전히 매력적인 기술
2. Container 기술의 복잡성 증가 : maturity level(숙성도)이 높지 못해 자주 변경되는 개념.
오늘 배운 컨테이너 기술은 내일은 다른 기술로 대체 될 수있다.
##8 Practice: Namespace
NS의 기본 작동을 살펴보자.
###1. unshare, lsns를 사용해보자
1. unshare - 고유의 공간을 만들고 그 안에서 프로그램을 실행
2. lsns : Namespace를 리스팅
unshare 라는 프로그램으로 격리된 프로세서를 만드는데 그 프로세서 네임은 bash.
# unshare -pf --mount-proc /bin/bash // $일 시 sudo로
# ps
# exit

-p : --pid , 격리된 pid 사용
-f : --fork ,
**-- :자식프로세서를 만들며 실행
--mount-proc , PCB를 고유한 권한으로 가져가기에 멀리있는 HOST와 격리됨
##9 Linux Namespace : Net , 네트워크를 격리 시켜보자
1. unshare : net
# ss -nltp
# nc -l 5000 >nc_host_output.txt &
# ss -nltp

host에서 5000 포트를 listen
32192 은 host 컴퓨터로 원래 있던 machine.
2. unshare
# unshare -n /bin/bash #네트워크 격리
# ps
# ss -nlt #네트워크가 격리되서 포트번호 5000이 안나옴
# nc -l 5000 >nc_ns_output.txt & # 5000설정
# ss -nlt

3. lsns : unshare가 실행되는 terminal을 그대로 두고 terminal을 하나 더 실행
##2 Virtualization
### Full virtualization, Isolation
1. Virtual machine
1) Full virtualization(Hypervisor) 사용
가) 소프트웨어로 가상화된 하드웨어 구현(실제는 없는 하드웨어를 구현)
ㄱ. 이를 통해 완전히 격리된 공간 제공
나) 이를 통해 보안 문제, 호환성 문제를 거의 대부분 해결해 줄 수 있다.
2) 단점 : 낮은 성능 (기존 성능의 절반 이하, 혹은 심각하게 10 ~ 20 %의 효율이 나오기도 함)
독점적인 자원 점유(VM 끼리 자원을 공유하는 효율이 없음)
Host-Guest간의 자원 교환의 어려움 및 비효율 (기술적으로 가능하나, 오버헤드 존재)
3) OS 가 관리하는 H/W를 접근 하는 방식 차이 : 직접 접근 Or 간접 접근
가) VM을 사용하면 오버헤드가 커지는 단점이 있다.
2. sandbox
1) 사전적의미로 격리된 모래 장난을 위한 공간의 개념으로 이 개념을 차용.
가) 구현: 다양한 방법으로 가능(VM, container, chroot ...)
나) 목적: 테스트 유닛으로서 격리된 공간, 보안 공간, 복제된 서비스 공간 ...
** 베타버전 프로그램을 테스트 하는데 다른 프로그램에 영향을 주고 싶지 않다.
OS를 새로 설치하고 베타 버전 프로그램만 설치? 그런데 하루에 1번씩 해야한다면?
VM에 설치했다가 VM을 통째로 지우면 더 깔끔하지 않을까?
VM을 통째로 지우는 것도 꽤나 고생스럽다. sandbox를 경량화할 수없나?
도커가 sandbox를 경량화할 수 있게 해준다.
3. sandbox의 격리된 공간의 장점
1) 프로그램이 작동하기 위해서는 많은 외부자원을 필요로 한다.
2) 단지 격리가 목적이라면 굳이 VM을 쓸 필요가 없다. (공유해야하는 부분은 공유하고 공유하지 않은 부분은 공유하지 않는 부분은 분리해서 만들기 -> 일반적인 컨테이너의 개념)
Lightweight container로 작성하려면 host OS와 공유를 하는 부분이 있으므로 이기종 OS는 쓸 수 없다.
Summary
1. chroot (change root) 는 말 그대로 root dir. 를 변경해준다. 격리가 가능하다.
2. Isolation 할 수 있는 자원은 여러 종류이나, 선택이 가능하다.
-> 좀 더 편리하게 해주는 것이 container이고, 컨테이너를 구현하는것이 docker, podman... 이다.
container는 기존에 나와있는 namespace, cgroup, chroot, 등을 결합한 기술이다
3. docker, podman 등은 container 구현체이다.
1) container의 가장 큰 장점은 성능과 배포다.
2) VM 특히 full virtualization은 성능 문제가 심각함
'프로그래머스 > Docker' 카테고리의 다른 글
| vs code 에서 도커 연결하기 (0) | 2023.01.30 |
|---|---|
| [인공지능 개요] Docker #5 - docker-compose (0) | 2023.01.03 |
| [인공지능 개요] Docker #4 - docker CLI 2편- run ex ec start stop (0) | 2023.01.03 |
| [인공지능 개요] Docker #3 - CLI -ps rm rmi image (0) | 2023.01.02 |
| [인공지능 개요] Doker #2 - installation (0) | 2023.01.02 |