docker 시스템의 기반인 리눅스 기술들을 실습
- chroot
chroot /tomato /binbash - chroot 명령으로 현재 디렉토리를 루트 디렉토리로 변경
특정 디렉토리를 루트 디렉토리로 변경하려면 shell 바이너리와 공유 라이브러리를 복사해야함
ldd /bin/bash - /bin/bash 의 공유 라이브러리 확인
linux-vdso.so.1 (0x00007ffd953b5000) -> 가상 라이브러리로 복사할 필요 없는 파일
libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f1ae91fe000) -> bash가 동작할 때 필요한 라이브러
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1ae8fd6000) -> Linux 공통 라이브러리
/lib64/ld-linux-x86-64.so.2 (0x00007f1ae9398000) -> 동적 로더( loader ) -> 공유 라이브러리를 메모리에 로드하는 역할
이후 설정할 디렉토리에 공유 라이브러리가 복사될 디렉토리를 생성함
/tomato/lib/x86_64-linux-gnu
/tomato/lib64
이후 공유 라이브러리 파일들을 복사해줌
- cp /lib/x86_64-linux-gnu/libtinfo.so.6 /tomato/lib/x86_64-linux-gnu/
- cp /lib/x86_64-linux-gnu/libc.so.6 /tomato/lib/x86_64-linux-gnu/
- cp /lib64/ld-linux-x86-64.so.2 /tomato/lib64
이후 chroot 명령으로 / 디렉토리를 변경해준다
- cgroup (control group)
프로세스들이 사용하는 시스템 자원의 사용 정보를 수집 및 제한 시키는 Linux 커널 기능
모든 프로세스에 대해 리소스 사용 정보 수집
제한 가능한 자원 - CPU, Memory, Network, Device, Block I/O
cgroup 기본 디렉토리 - /sys/fs/cgroup
cgroup 종류 - docker는 cgroupv1 사용
cgroup 사용 가능한 서브 시스템
- blkio : 블록 장치(storage)에 대한 입/출력 제한
- cpu : 스케줄러를 이용해 해당 cgroup에 속한 프로세스 cpu 사용 시간 제한
- cpuacct : cgroup에 속한 cpu 자원 정보 생성
- cpuset : 개별 cpu 및 메모리 로드에 대한 cgroup 할당
- devices : cgroup 작업 단위로 장치에 대한 액세스 허용/거부
- freeze : cgroup 작업 일시 정지 또는 다시 시작
- memory : cgroup 에 속한 프로세스의 메모리 사용 제한
- net_cls : 네트워크 태그 지정
- ns : namespace 서브 시스템
sudo sgset -r cpu.cfs_quota_us=30000 <그룹이름>
sudo cgset -r cou.max=30000 <그룹이름>
위 명령으로도 가능
my 그룹에 스트레스를 주는 명령을 백앤드로 실행하고 top 으로 확인하는 모습
7823 - 2 cpu 라고 stress info 가 나오고 top 에선 다음 번호인 7824 7825 의 root 유저로 실행중인 프로세스의 cpu 합이 30%를 넘지 않음
- namespace
프로세스별로 별도의 커널 자원을 분할하는 Linux 커널 기능
LXC(LinuX Container) 기술의 근간
namespace 종류 - IPC, mnt, net, pid, pid_for_children, uts
cgroup 과 namespace
- cgroup : 프로세스 자원 사용량 제한 목적
- namespace : 프로세스가 볼 수 있는 자원 범위
container - 완전 격리된 프로세스
- cgroup 에 이해서 자원 사용량 제한
- namespace를 통해 볼 수 있는 자원 제한
- namespace 종류
PID namespace
- 프로세스 id 정보를 격리
- namespace 외 다른 프로세스에 접근 불가능
Network namespace
- 네트워크 장치, IP 주소, 포트, 라우팅 테이블의 네트워크 리소스를 격리
- 가상 네트워크 장치 할당
User namespace
- 프로세스별로 UID, GID 정보 격리
Mount namespace
- 프로세스별로 마운트 되는 파일 시스템 격리
IPC namespace
- IPC(Inter-Process Communication) 격리, 다른 프로세스의 접근이나 제어를 방지
UTS namespace
- 호스트명이나 도메인 명 격리
- unshare 명령
namespace 생성 명령unshare [옵션] [프로그램]-p : pid 생성-m : mount 생성-i : ipc 생성-f : child 프로세스 생성
echo $$ - 현재 pid 확인 (bash pid)
ps aux | head -n5 - 현재 상위 프로세스 정보 확인
namespace 를 생성하고 현재 pid 를 확인하면 1 로 초기화된 모습 - namespace 가 생성된 모습
ctrl + d 로 빠져나와 다시 현재 pid 를 확인하면 인스턴스의 pid 가 출력됨
tmpfs - 메모리 기반 임시 파일 시스템, 휘발성 공간으로 reboot/booting 시 소멸됨nsenter 명령 - namespace enter- 격리된 namespace 에 진입하는 명령- nsenter [option] [program] [argument]- t : PID- a : all namespace
- union file systemt
Linux 에서 사용하는 일반적인 파일 시스템은 mount 를 하면 mount 된 내용만 확인할 수 있다
기존 mount point 에 대하여 새로운 파일 시스템으로 mount 하면 기존 파일시스템에 덮어씌워짐
union file system - 하나의 디렉토리 위치에 여러 개의 디렉토리를 마운트 하면 하나의 통합된 디렉토리처럼 보이게 하는 파일 시스템
docker image 와 docker container가 union file system 기반으로 관리되고 있음특징- image layer : 마지막 레이어를 제외하고 read-only 성격- copy-on-write : 변경된 내용만 저장
- overlayFS
하나의 파일 시스템을 다른 파일 시스템 상단에 overlay
하단 파일 시스템에 상관없이 구성 가능 (단 redhat 계열에서는 XFS 만 하단 파일 시스템 지원)
docker 에서 사용하는 파일 시스템
lowerdir(Image layer) - read-only 영역, 쓰기 불가능, docker image 파일의 구조upperdir(Container layer) - read-write 영역, 쓰기 가능, docker container 생성 시 app에 의해 쓰기 되는 영역
읽기 전용 overlay 생성
mount filesys - overlay
mount point - /tmp/merged
lowerdir=/tml/lower1:/tmp/lower2
/tmp/merged 디렉토리에는 새로운 내용을 추가할 수 없음
똑같이 a.txt b.txt 를 넣어놨는데 cat 하면 다르게 나옴
이해는 잘 안됨
'Kubernetes > [구름] 쿠버네티스 전문가 양성 과정 k-digital' 카테고리의 다른 글
[9주-9.29] docker container 명령어 (0) | 2022.09.29 |
---|---|
[9주-9.28] Docker 환경 구성 (0) | 2022.09.29 |
[9주-9.26] Docker 이해 (0) | 2022.09.26 |
[8주-9.23] playbook 확장 (0) | 2022.09.23 |
[8주-9.22] playbook 이해 (0) | 2022.09.22 |