Docker- 4

박형준·2024년 4월 25일

-리소스 제한 ( 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개로 제한

  • ⇒ 초당 데이터 전송 개수를 100개로 제한

디스크 확인

  • 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 다운로드후 접속

  • https://hub.docker.com/r/google/cadvisor/ 들어가서 카피해서
  • 이미지 다운로드
  • github의 cadvisor 접속해서 quick start 복사
    • 터미널 창에 복사한 후에 포트 번호 8080으로 접속
    • 접속 확인

리소스 제한하는 법 ( 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 옵션 추가

폴더 만들면서 진입

  • mkdir /test && cd /test

컨테이너를 tar 아카이브로 저장 (export: 내보내기)

  • 컨테이너를 타르 아카이브로 내보내기 ( docker container export, hey > hey.tar )
  • 마찬가지로 타르 아카이브로 내보내기 ( hey2 -o hey2.tar )
  • 파일의 내용은 동일하지만 ( hey2 -o hey2.tar )의 파일은 최소 권한

*tar 파일 확인 및 내부 내용 확인

  • file hey*.tar

    • tar tvf hey*.tar
      tar tvf hey.tar
      tar tvf hey2.tar
  • #tar xvf hey.tar -C /app/httpd1

  • #tree /app/httpd1 -L 1 ( 1 또는 2 )

생성된 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웹서버 패키지 설치

포트확인

  • netstat -antup | grep 80

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

0개의 댓글