-리소스 제한 ( CPU / RAM / BLOCK I/O = HDD )
- ⇒ 컨테이너는 기본적으로 호스트의 하드웨어 리소스 사용에대한 제한이 없음.
- 리소스 모니터링 프로그램 ( docker stats , cadvisor )
- -m, --memory : 메모리 양을 지정
- --memory-swap : 스왑메모리 양을 지정 ( 메모리 양보다 커야함 )
- -1(제한 없음)
- ( 용량지정은 b(bite), k(kilo), m(mega), g(giga) )
ex)
- #docker run -d -m 512m ngixnx ⇒ 메모리양만 지정
#docker run -d -m 200m --memory-swap 300m nginx
#docker run -d -m 1g --memory-reservation 500m nginx ⇒ 최소500 최대 1g
#docker run -d -m 200m --oom-kill-disable=true nginx ⇒ 200초과시 중지.
*CPU 사용량 ( CPU 코어 개수를 지정 )
- --cpus="1.5" : 0.5개 단위로 지정 가능. (0.0 으로 설정하면 제한이 없음.)
- --cpuset-cpus=0-3 or 0,1 두가지 방법으로 설정( 최소 개수 , 최대 개수)
- --cpu-shares=2048 : 기본값은 1024 (용량 지정)
ex)
- #docker run -d --cpus=”0.5” ubuntu
#docker run -d --cpu-shares=2048 ubuntu
#docker run -d --cpuset-cpus=0-3 ubuntu
*HDD 할당
- --blkio-weight : 값 지정 ( 값은 10 ~ 1000 사이값으로 지정 )
- --device-read-bps : 디바이스에 읽기 지정 (초당 단위 지정 kb, mb, gb )
- --device-write-bps : 쓰기 속도 (초당 단위 지정 kb, mb, gb )
ex)
- #docker run -d --blkio-weight 200 ubuntu
#docker run -d --device-read-bps /dev/sda:test ubuntu (경로 지정 가능)
#docker run -d --device-write-bps /dev/sda:test ubuntu
⇒ 모니터링 명령어
#docker stats
#docker events -f container=컨테이너 이름 : 실시간으로 정보 수집 출력
실습에 필요한 패키지 설치 ( epel (저장소), stress, htop )
- #dnf -y install epel-release 저장소 위치 # ls /etc/yum.repos.d/epel*.repo
- #dnf -y install stress htop
- #htop 아래 화면 처럼 보이고, q 빠져나오기

실습에 필요한 패키지 설치 ( epel(저장소), stress, htop (top을 그래픽으로) )
- dnf -y install epel-release
- dnf -y install stress
- dnf -y install htop
임시 저장소 (epel)
- 저장소 위치

htop
- htop 실행 확인

-실습을 하기 위해서 cpu개수, 메모리 확인 ( cpu는 반드시 2개 이상 )
- cpu 개수 확인 #lscpu -e ⇒ 0 , 1
- 램 확인 # lsmem ; free ; top
- 스트레스 부여하기 [ 도커파일 생성 및 실행 ]
- #docker build -t stress . ⇒ 맨 뒤에 쩜 필수 설치시 에러나면 재부팅 후 설치 진행
hdd 확인
- cpu 갯수 확인

- 메모리 확인

stress 이미지 다운로드
- build 디렉터리 생성

- 디렉터리 생성 후 들어가서 dockfile 파일 만든 후 내용 입력

- dockfile 내용 확인

- 파일 실행

*가상 메모리에 따른 스트레스 부여 결과 확인
-
#docker run -m 100m --memory-swap 100m stress:latest stress --vm 1 --vm-bytest 90m 5s
- ⇒ 메모리100, swap 100, 스트레스 90 ⇒ 정상동작
-
#time docker run -m 100m --memory-swap 100m stress:latest stress --vm 1 --vm-bytes 150m -t 5s
- ⇒ 메모리 100, 스왑 100 , 스트레스 150 ⇒ 실패
-
스왑을 지정하지 않으면 정상동작 스왑은 지정용량의 2배로 지정되어 정상 동작
-
스왑용량보다 많이 스트레스 주면 동작 실패
스트레스 다운로드 후 스왑 지정 테스트
- 스트레스를 150m로 부여했을 때 기본 스왑 메모리인 200M 보다 적으면 정상 작동
- (time docker run -m 100m stress:latest stress --vm 1 --vm-bytes 150m -t 5s)

- 스트레스를 150m로 부여 했을 때 설정한 스왑 메모리인 100M보다 커서 작동 실패
- (time docker run -m 100m --memory-swap 100m stress:latest stress --vm 1 --vm-bytes 150m -t 5s)

*oom kill disable 설정 하기-설정된값 초과시 강제 종료 시키기 (Out Of Memory)
일정 메모리를 넘기면 컨테이너 중지
- 메모리 100M를 넘기면 container를 중지 (docker run -d -m 100M, --oom-kill-disable=true)

- inspect를 통해 확인 ( egrep : 자세하게 확인 )

#cat /sys/fs/cgroup/memory/docker/컨테이너ID 에 설정값이 저장됨 .
#docker rm -f $(docker ps -aq)
*CPU개수 제한
- #lscpu | grep CPU
- #docker run -d --name c1 --cpuset-cpus 1(번호) stress stress --cpu 1(할당량)
- #htop 로 확인 ⇒ q로 빠져나옴

- #docker run -d --name c1 --cpuset-cpus 1 stress stress --cpu 0.5
CPU 확인
- cpu 확인 ( lscpu | grep CPU )

- cpu의 번호를 1로 지정하고 cpu에게 스트레스 1 할당

- 1번 cpu의 사용량이 증가

- 2개의 cpu가 스트레스를 받으면 error (0번과 1번)
-가중치로 할당 ( 기본값은 1024)
- #docker run -d --name test1 -c 2048 stress
- #docker run -d --name test2 stress
- #docker run -d --name test3 -c 512 stress

- ⇒ test1, test2은 무리 없이 동작하고 있음, test3은 기본값보다 적어서 이 후 작업시 속도가 많이 느려짐.
- #docker rm -f $(docker ps -aq)
가중치로 할당
- 컨테이너 생성하면서 cpu 용량을 2G 할당 (기본 값 : 1G)

- cpu 용량 설정 없이 컨테이너 생성하면 1G 할당 ( 기본 값 )

- 컨테이너 생성하면서 cpu 용량을 512M 할당

- 동작중인 컨테이너의 cpu 확인 ( test3 512M는 정상적으로 동작 못함(기본 값보다 낮아서, docker stats로 확인 )

*HDD 리소스 제한 ( BLOCK I/O )
-
#lsblk 디스크 목록확인
-
⇒ 초당 데이터 전송 개수를 10개로 제한
디스크 확인
- lsblk로 확인

- fdisk -l로도 확인 가능
- copied, 0.00588898 s, 1.8 GB/s ⇒ 초당 100개 지정
- copied, 0.0128284 s, 817 MB/s ⇒ 초당 10개 지정시
- 두가지의 시간당 전송 속도를 비교 해보면 100개 지정시 속도가 빠르기에 많이 저장됨

*cadvisor를 이용한 모니터링
- #docker run -itd --rm --name myapp --device-write-iops /dev/sda:100 -m 500m ubuntu
컨테이너 생성 후
- 컨테이너를 생성 후

*부엉이 설치는
- main rocky 에서 파이어 폭스 / 구글 / cadvisor 검색 후 github 에서 맨아래 내용 복사 후 터미널(SSH는 안됨) 에서 붙여넣기 하고
- 접속 은 #firefox http://**localhost:8080 &** 접속 후 정리된 화면으로 모니터링 가능 화면을 띄워놓고,
- SSH에서 다양하게 스트레스를 설정을 해보면 cadvisor 화면이 변하는것 확인 가능.
cadvisor 다운로드후 접속
리소스 제한하는 법 ( RAM , CPU, HDD )
모니터링 방법 ( docker stats, docker events, cadvisor, htop )
*이미지 생성
-이미지 생성 방법
- *docker 명령어 사용해서 생성 : docker run ~
-docker ~ , docker commit ~: 생성된 컨테이너를 이미지로 만들기
*dockerfile 을 이용해서 생성
- #docker commit [options] container [repository:tag ] ⇒ tag는 버전
#docker commit -a kim/webfront:1.0 old컨테이너 new이미지명:태그
#docker image inspect --format="{{ .Author }}" kim/webfront:1.0 ⇒ 정보확인

-apache 웹서버 검색 하고 다운로드 하고 이미지 확인
- docker search apache
docker pull httpd
docker image ls
-컨테이너 생성(create명령으로) 이름[testbro1] 포트 80:80
- #docker container create --name testbro1 -p 80:80 httpd
-컨테이너 생성(run 명령으로) 이름[testbro2] -d 포트 80:80
- #docker run --name testbro2 -d -p 80:80 httpd
컨테이너 생성 확인
-생성된 이미지로 각각의 자신의 이미지 생성 ( commit ) 하고 확인 하고 inspect로 정보 확인
- testbro1 = kim, 저장소 posein/mybro1:1.0
testbro2 = lee, 저장소 posein/mybro2:1.0
- docker container commit -a "kim" testbro1 posein/mybro1:1.0
docker container commit -a "lee" testbro1 posein/mybro2:1.0 (사용자 정보 지정, 이름과 태그 지정)
- docker image inspect --format="{{ .Author }}" posein/mybro1:1.0
docker image inspect --format="{{ .Author }}" posein/mybro2:1.0 (정보 확인)
*우분투 이미지 검색 다운
docker run -it 실행하면서 이름은 mylinux1 실행하고 docker container commit
-a “posein” mylinux1 myimage 라는 이름으로 생성
- ⇒ # docker search ubuntu , # docker pull ubuntu
- #docker run -it --name mylinux1 ubunut
- #docker container commit -a "posein" mylinux1 myimage1
- #docker inspect myimage1:latest
- #docker inspect ubuntu ⇒ 두개 이미지가 동일함을 확인
*컨테이너를 tar 파일로 생성 ( export )
- #docker container create --name hey -p 80:80 httpd
#docker run --name hey2 -d -p 80:80 httpd
컨테이너 생성
- docker container create --name hey -p 80:80 httpd
docker run --name hey2 -d -p 80:80 httpd -> run(실행)이기 때문에 -d 옵션 추가
폴더 만들면서 진입
컨테이너를 tar 아카이브로 저장 (export: 내보내기)
- 컨테이너를 타르 아카이브로 내보내기 ( docker container export, hey > hey.tar )

- 마찬가지로 타르 아카이브로 내보내기 ( hey2 -o hey2.tar )

- 파일의 내용은 동일하지만 ( hey2 -o hey2.tar )의 파일은 최소 권한

*tar 파일 확인 및 내부 내용 확인
생성된 tar 파일 확인
- hey.tar 확인

- hey2.tar 확인

파일 내용 확인
- tar -tvf hey.tar
- tar -tvf hey2.tar
압축 해제
- 파일 생성 (mkdir -p /app/httpd1 /app/httpd2)

- tar xvf hey.tar -C /app/httpd1 (-C 옵션: 파일을 푼 후에 파일들을 "/target/directory"로 이동 )
- tar xvf hey2.tar -C /app/httpd2
- tree /app/httpd1 -L 2 ( 트리 형태로 압축 해제 한 것 확인 )
*tar 파일로 부터 이미지 작성( import )
-기존 컨테이너와 이미지 모두 삭제 후 진행.
- #docker image import hey.tar
- ⇒ 이름을 생략하고 이미지 작성
- ⇒ 이름이 지정이 안된것을 댕글링 이미지라고 해서 컨테이너 생성시 에러 ⇒ 삭제
tar 파일로부터 이미지 작성 ( hey.tar와 hey2.tar가 있는 상황에서)
- import를 이용해서 이미지 불러오기 ( docker image import hey.tar )

- 이름을 지정 안해서 댕글링 파일이 생긴 상황

댕글링 이미지 삭제 방법
- #docker image prune ⇒ 물어봄. y 삭제
- #docker rmi $(docker images -f dangling=true -q) ⇒ 묻지 않고 삭제
docker 댕글링 이미지 지우는 방법
- docker image prune
- docker rmi $(docker images -f dangling=true -q)
이미지 작성 방법 두가지
- [root@www test]# docker image import hey.tar heytes1:1.0
- [root@www test]# cat hey2.tar | docker image import - heytest2:1.0
- ⇒ cat 으로 이름이 지정이 되어서 뒤에서는 이름 생략이 된것임.
이름과 태그를 붙여서 이미지 생성
- tar 파일을 이미지로 불러오기 ( docker image import , 이름과 태그도 지정 )

- cat으로 이름 지정을 해서 뒤에 이미지 이름을 지정할 필요 없다

*원격으로 파일 전송하고 받아서 이미지 만들기
-main-r : docker 설치 및 이미지가 존재 hey.tar , hey2.tar
-docker-1 : 웹서버역할 구축
- [root@docker1 ~]# netstat -antup | grep 80
[root@docker1 ~]# yum -y install httpd mod_ssl ⇒ 웹서버 패키지 설치
포트확인
ssh 접속 다운로드
- yum -y install httpd mod_ssl
-httpd 동작 시키고, 확인하고, 방화벽 끄기
- #systemctl [start/enable/status] httpd
#systemctl stop firewalld
httpd 동작 후 방화벽 끄기
- systemctl start httpd( enable도 수행 )
- systemctl stop firewalld
-main 에서 웹 서버(docker1) 로 파일을 전송 .
- [root@www ~]# scp /test/hey.tar 10.0.2.16:/var/www/html/hey3.tar
[root@www ~]# docker image import http://10.0.2.16:/hey3.tar heytest3:1.0
[root@www ~]# docker image ls
- 생성된것 확인
웹 서버(docker1)로 파일 전송
- scp /test/hey.tar 10.0.2.30:/var/www/html/hey3.tar ( rocky9의 파일을 docker1에 전송 )

- docker1의 /var/www/html/ 디렉터리에서 확인
docker1에서 파일 불러오기
*기존 파일 삭제시
- #docker image purune -a
#docker container prune
#docker network prune
#docker system prune