프로세스들이 사용하는 시스템 자원의 사용 정보 수집/제한시키는 Linux 커널 기능
모든 프로세스에 대해 리소스 사용 정보 수집
제한 가능한 자원 : CPU, Memory, Network, Device, Block IO
/sys/fs/cgroup
Docker는 cgroupv1 사용
blkio : 블록 장치(storage)에 대한 입출력 제한
cpu : 스케줄러를 이용해 해당 cgroup에 속한 프로세스 CPU 사용시간 제한
cpuacct : cgroup에 속한 CPU 자원 정보 생성
cpuset : 개별 CPU 및 메모리 로드에 대한 cgroup 할당
devices : cgroup 작업 단위로 장치에 대한 액세스 허용/거부
freeze : cgroup 작업 일시정지 or 다시 시작
memory : cgroup에 속한 프로세스의 메모리 사용 제한
net_cls : 네트워크 태그 지정
ns : namespace 서브 시스템
cgroup을 통해 cpu 사용량 제한 실습 (cgroup-tools 패키지 이용)
- cgcreate 명령 : cgroup을 이용한 자원 제한 그룹 생성
- cgdelete 명령 : cgroup 자원 제한 그룹 삭제
/sys/fs/cgroup 디렉토리에 자원 제한 그룹 생성
- -a : 그룹 소유자 ID
- -g : 자원 제한 그룹명
- sudo cgset -r cpu.cfs_quota_us=30000
설정 에러 발생시 아래 내용으로 설정- sudo cgset -r cpu.max=3000 <그룹 이름>
CPU 사용량을 30%로 제한
-r : 자원 제한 속성 지정- sudo cgexec -g cpu:<그룹 이름> stress -c 1
stress 명령을 자원 제한 그룹에 적용
-g : 자원 제한 그룹명- sudo cgdelete cpu:<그룹 이름>
자원 제한 그룹 삭제
프로세스 생성 개수 제한 실습
프로세스별로 별도의 커널 자원은 분할하는 Linux 커널 기능
LXC (LinuX Container) 기술의 근간
IPC, mnt, net, pid, pid_for_children, uts
프로세스 사용량 제한 목적
프로세스가 볼 수 있는 범위
완전 격리된 프로세스
프로세스 ID 정보 격리, namespace 外 다른 프로세스 접근 불가능
네트워크 장치, IP 주소, 포트, 라우팅 테이블의 네트워크 리소스 격리
가상 네트워크 장치 할당
프로세스별로 UID, GID 정보 격리
프로세스별로 마운트되는 파일 시스템 격리
IPC (프로세스 간 통신) 격리, 다른 프로세스 접근/제어 방지
호스트명 or 도메인명 격리
namespace 생성 명령
unshare [옵션] [프로그램 [argument]]
-p : PID namespace 생성
-m : Mount namespace 생성
-i : IPC namespace 생성
-f : child 프로세스 생성
현재 프로세스 ID 확인 : echo $$
관리자로 사용자 변경 : sudo su
Mount namespace 생성 : unshare -m /bin/bash
Mount namespace로 생성된 프로세스 ID 확인 : echo $$
tmpfs를 /mnt에 mount: mount -t tmpfs tmpfs /mnt
tmpfs
- 메모리 기반 임시 파일 시스템
- 사이즈를 지정하지 않으면 물리 메모리 절반 크기로 설정
- 휘발성 공간으로 reboot/booting 시 소멸
mount 확인 : mount | grep /mnt
/mnt 디렉토리에 텍스트 파일 생성 : echo "hello" > text.txt
다른 터미널을 열어서 /mnt 디렉토리 내용 확인
nsenter 명령
nsenter [옵션] [program [argument]]
- -t : PID
- -a : 전체 namespace
Linux에서 사용하는 일반적인 파일 시스템은 mount 실행시 mount된 내용만 확인 가능
기존 mount point에 대하여 새로운 파일 시스템으로 mount하면 기존 파일 시스템은 가려지고 새로운 파일 시스템이 사용됨
하나의 디렉토리 위치에 여러개의 디렉토리를 마운트하면 하나의 통합된 디렉토리처럼 보이게 하는 파일 시스템
하나의 파일 시스템을 다른 파일 시스템 상단에 overlay
하단 파일 시스템에 상관없이 구성 가능
(단 RedHat 계열 Linux 배포판에서는 XFS만 하단 파일 시스템으로 지원)
Docker에서 사용하는 파일 시스템
lowerdir (Image Layer) : Read-only 영역 -> 쓰기 불가능, Docker Image 파일의 구조
uppderdir (Container Layer) : Read-Write 영역 -> 쓰기 가능
Docker Container 생성시 Application에 의해 쓰기 되는 영역
OverlayFS 파일 시스템 구성 실습
echo "lower1 a" > /tmp/lower1/a.txt
echo "lower1 b" > /tmp/lower1/b.txt
echo "lower2 a" > /tmp/lower2/a.txt
echo "lower2 c" > /tmp/lower2/b.txt
- mount 파일 시스템 : overlay
- mount 포인트 : /tmp/merged
- lowerdir=/tmp/lower1:/tmp/lower2
sudo mount \
-t overlay overlay \
-o lowerdir=/tmp/lower1:/tmp/lower2,upperdir=/tmp/upper,workdir=/tmp/work \
/tmp/merged
/tmp/merged 디렉토리는 읽기쓰기 모두 가능
실습 끝나면 sudo umount /tmp/merged로 마운트 해제 (선택사항)
docker는 Client/Server 구조로 구성
docker hub (public registry) / docker document
read only 형식으로 docker container를 생성하기 위한 template
docker image가 메모리에 로딩된 인스턴스
docker image로부터 생성된 인스턴스
docker image 부분은 read only
docker container가 데이터 기록하는 영역은 read/write 기능 영역
docker container 생성 means 어플리케이션 실행
docker registry는 docker image 저장소 -> 대표적인 public registry는 docker hub
정말 뭐가 뭐라는지 1도 모르겠다. 사람살려