도커 스터디5일차(아마존 클라우드워치)

MINK·2023년 3월 22일
0

Docker

목록 보기
5/5

2.2.8.4 아마존 클라우드워치 로그

  • AWS(Amazon Web Service)에서는 로그 및 이벤트 등을 수집하고 저장해 시각적으로 보여주는 클라우드워치(CloudWatch)를 제공

  • 컨테이너에서 드라이버 옵션을 설정하는 것만으로 클라우드워치 로깅 드라이버를 사용

    • 클라우드워치를 사용하는 것은 아래와 같은 단계

      • 클라우드워치에 해당하는 IAM 권한 생성

      • 로그 그룹 생성

      • 로그 그룹에 로그 스트림(LogStream)생성

      • 클라우드워치의 IAM 권한을 사용할 수 있는 EC2 인스턴스 생성과 로그 전송

  1. 클라우드워치에 해당하는 IAM 권한 생성 (※ 모든 생성은 다 서울로 해야함!)

    • AWS 사이트 접속한 다음 콘솔에 로그인하기

    • 관리 콘솔 메뉴 중 '보안, 자격 증명 및 규정 준수' 들어가기

    • 왼쪽 사이드 바의 [역할] 탭을 클릭한 후 [역할 만들기] 버튼을 눌러 새로운 IAM 권한을 생성

    • '역할을 사용할 서비스 선택' 항목에서 [EC2]를 선택

  - [권한 추가] 항목의 권한 정책 필터에서 CloudWatchFull를 입력한 뒤 체크하기

    

  - 마지막으로 해당 IAM 역할의 이름을 입력해 새로운 권한생성

    
  1. 로그 그룹 생성

    • 홈에서 검색창에 [CloudWatch]를 검색하여 접속

    • [로그] 항목 안에 [로그 그룹]으로 들어가 [로그 그룹 생성]을 하기

    • 로그 그룹을 생성했으면 만들어진 로그를 클릭하고 안에 들어가 우측 하단에 [로그 스트림 생성] 버튼 클릭하기

      EC2 생성하기

    • 검색 창에 EC2 검색하고 들어가기

    • EC2 [인스턴스] 항목 안에 [인스턴스] 들어가서 인스턴스 시작하기

    • 인스턴스에서 사용할 운영체제를 선택 (Ubuntu Server 18.04 LTS)

      높은 성능의 도커를 사용할 시 이용요금을 많이 지불해야하기때문에 무료로 제공되는 t2 micro클릭하고 [다음:인스턴스 세부 정보 구성] 들어가기

    • EC2 인스턴스에서 mycloudwatch라는 클라우드워치를 사용하도록 권한을 추가한다.

      마지막으로 검토 및 시작하여 검토를 다 하면 시작하기를 한다.

    • 그러면 이렇게 기존 키 페어에대한 생성이 뜬다.

    • 여기서 키 페어 이름을 정하고 키 페어를 다운받고 시작하면 된다.

    • Mobaxtem으로 접속하여 ssh 연결하기

    • 만들어 놓은 컨테이너에 정보를 확인하면 퍼블릭 IPv4 DNS 주소를 복사한다.

    • 그 다음 Mobaxtem에서 [session]을 클릭 후 [ssh]에 접속하여 host와 key값을 설정한다.

      그리고 접속하면 [login as:] 가 뜨는데 여기엔 ubuntu라고 적는다

      다음 과정은 https://deepmal.tistory.com/21 이 사이트를 참고한다.

    • 과정을 마치면 밑에 코드를 작성하여 container를 생성한다.

   ```dockerfile
   # 컨테이너 생성후 테스트하기
   # 로깅 드라이버로 awslogs(클라우드워치)를 사용할 수 있게 설정한다
   # 로그 그룹과 스트림은 mylog과 mylogstream을 사용
   # 리전으로는 EC2 인스턴스가 아닌 로그 그룹 및 스트림이 생성된 리전을 입력해야 함
   # ap-northeast-2는 아시아 태평양(서울) 리전의 코드입니다.
   $ sudo docker run -i -t --log-driver=awslogs --log-opt awslogs-region=ap-northeast-2 --log-opt awslogs-group=mylog --log-opt awslogs-stream=mylogstream ubuntu:14.04   
   root@7e20cacde40e:/# echo test!
   test!
   ```

   

   클라우드워치의 mylogstream 로그 스트림 내의 로그를 확인하면 로그가 정상적으로 수집됌을 알 수 있다.

   

2.2.9 컨테이너 자원 할당 제한

  • 컨테이너를 생성하는 run, create 명령어에서 컨테이너의 자원 할당량을 조정하도록 옵션을 입력할 수 있다.

  • 컨테이너에 자원 할당 옵션을 설정하면 호스트와 다른 컨테이너의 동작을 방해하지 않게해준다.

  • 컨테이너에 설정된 자원 제한을 확인하는 가장 쉬운 방법은 docker inspect 명령어를 입력하는 것이다.

    mink@DESKTOP-U4KHBSV:/mnt/c/Users/Playdata$ docker inspect rsyslog_server
- run 명령어에서 설정된 컨테이너의 자원 제한을 변경하려면 update 명령어를 사용합니다.
# docker update (변경할 자원 제한) (컨테이너 이름)
# docker update --cpuset-cpus=1 centos ubuntu

2.2.9.1 컨테이너 메모리 제한

  • docker run 명령어에 --memory를 지정해 컨테이너의 메모리를 제한할 수 있다.

  • 입력할 수 있는 단위는 m(megabyte), g(gigabyte)이며 제한할 수 있는 최소 메모리는 4MB입니다.

    # 컨테이너의 메모리 사용량을 1GB로 제한
    mink@DESKTOP-U4KHBSV:/mnt/c/Users/Playdata$ docker run -d --memory="1g" --name memory_1g nginx
    aa93f63b698b095c7360a66f0db37ca1cbc157da2064ce74389aef153b3d6554
    
    # inspect명령어로 메모리의 값을 확인(1G)
    mink@DESKTOP-U4KHBSV:/mnt/c/Users/Playdata$ docker inspect memory_1g | grep \"Memory\"
                "Memory": 1073741824,
    
    # 컨테이너 메모리를 매우 적게할 시 에러문자가 뜨며 6MB 이상이여야 생성된다고한다.
    # 컨테이너 목록을 조회해도 생성되지 않았음.
    mink@DESKTOP-U4KHBSV:/mnt/c/Users/Playdata$ docker run -d --name memory_4m --memory="4m" mysql:5.7
    docker: Error response from daemon: Minimum memory limit allowed is 6MB.
    See 'docker run --help'.
    mink@DESKTOP-U4KHBSV:/mnt/c/Users/Playdata$ docker ps -a --format "table {{.ID}}\t{{.Status}}\t{{.Names}}"
    CONTAINER ID   STATUS                      NAMES
    aa93f63b698b   Up 6 minutes                memory_1g
    ...
    # 기본적으로 컨테이너의 Swap 메모리는 메모리의 2배로 설정되지만 별도로 지정할 수 있다.
    # Swap메모리는 500MB, 메모리를 200MB로 설정해 컨테이너 생성
    mink@DESKTOP-U4KHBSV:/mnt/c/Users/Playdata$ docker run -it --name swap_500m --memory=200m --memory-swap=500m ubuntu:14.04
    root@367e0be39c57:/#
    

2.2.9.2 컨테이너 CPU 제한

CPU-SHARES

  • 가상 머신이 특정 개수의 CPU를 할당받던 것과는 다르게 모든 컨테이너의 작업은 CPU 스케쥴링에서 같은 비율로 처리

  • --cpu-shares 옵션은 컨테이너에 가중치를 설정해 해당 컨테이너가 CPU를 상대적으로 얼마나 사용했는 지 알 수 있다.

  • 시스템에 존재하는 CPU를 어느 비중만큼 나눠 쓸 것인지를 명시하는 옵션입니다.

    # --cpu-shares 옵션은 상대적인 값을 가짐.
    # 아무런 설정을 하지 않았을 때 컨테이너가 가지는 값은 1024로, 이는 CPU 할당에서 1의 비중을 뜻함.
    # 
    mink@DESKTOP-U4KHBSV:/mnt/c/Users/Playdata$ docker run -it --name cpu_share --cpu-shares 1024 ubuntu:14.04
    root@0382217a1af3:/#
    
    # 1개의 CPU를 가지는 호스트에서 간단 테스트
    # cpu_1024 컨테이너는 --cpu-shares 옵션을 이용해 1024의 값을 할당
    # 컨테이너의 명령어는 1개의 프로세스로 CPU에 부하를 주는 명령어(stress --cpu 1)로 설정
    mink@DESKTOP-U4KHBSV:/mnt/c/Users/Playdata$ docker run -d --name cpu_1024 --cpu-shares 1024 alicek106/stress stress --cpu 1
    Unable to find image 'alicek106/stress:latest' locally
    latest: Pulling from alicek106/stress
    f7277927d38a: Pull complete
    8d3eac894db4: Pull complete
    edf72af6d627: Pull complete
    3e4f86211d23: Pull complete
    d6e1f41c61e5: Pull complete
    Digest: sha256:35e7f4fb3481e223d0640888b1770d0c78731091344d6c3c5ed5c695b08a28de
    Status: Downloaded newer image for alicek106/stress:latest
    acd514a9088ce52351bda2cb094f04090a4b3aeacc223659e6a6ca8659769d42
    
    # cpu_1024 컨테이너의 CPU 사용률 확인
    # 프로세스 지원 사용량을 확인하고싶지만 결과값이 올바르지않음. ??????
    mink@DESKTOP-U4KHBSV:/mnt/c/Users/Playdata$ ps aux | grep stress
    mink      1519  0.0  0.0   8164   732 pts/2    S+   22:28   0:00 grep --color=auto stress
    
    

    --cpuset-cpu

    • 호스트에 CPU가 여러 개 있을 때 --cpuset-cpus 옵션을 지정해 컨테이너가 특정 CPU만 사용하도록 설정
    • CPU 집중적인 작업이 필요하다면 여러 개의 CPU를 사용하도록 설정해 작업을 적절하게 분배하는 것
    # 컨테이너가 3번째 CPU만 사용하도록 설정
    mink@DESKTOP-U4KHBSV:/mnt/c/Users/Playdata$ docker run -d --name cpuset_2 --cpuset-cpus=2 alicek106/stress stress --cpu 1
    03623573c3173da6e7f59141a2bde16fd7a6bf6a75edd4646cdc5cd7b4e1f934

    htop

    • CPU별 사용량 확인

--cpu-period, --cpu-quota

  • 컨테이너의 CFS(Completely Fair Scheduler) 주기는 기본적으로 100ms로 설정되지만 run 명령어의 옵션 중 --cpu-period와 --cpu-quota로 이 주기를 변경할 수 있다.

    # --cpu-period의 값은 기본적으로 100000이며,  100ms이다.
    # --cpu-quota는 --cpu-period에 설정된 시간 중 CPU 스케쥴링에 얼마나 할당할 것인지를 설정
    # 100000(--cpu-period) 중 25000(--cpu-quota)만큼을 할당해 CPU 주기가 1/4로 줄었으므로 일반적인 컨테이너보다 CPU 성능이 1/4 정도로 감소
    # 즉, 컨테이너는 [--cpu-quota 값]/[--cpu-period 값]만큼 CPU시간을 할당
    mink@DESKTOP-U4KHBSV:/mnt/c/Users/Playdata$ docker run -d --name quota_1_4 --cpu-period=100000 --cpu-quota=25000 alicek106/stress stress --cpu 1
    03d09de8e34b3841ca5854131d366a9fde6bb48af8486ede84282cceaee89e66
    
    # 성능 비교를 위해 다음 명령어로 컨테이너를 추가로 생성
    mink@DESKTOP-U4KHBSV:/mnt/c/Users/Playdata$ docker run -d --name quota_1_1 --cpu-period=100000 --cpu-quota=100000 alicek106/stress --cpu 1
    1ebf8164a4b8395c5675e07e3b64583dfb6384443c7fbaa6eff1e651cf4dbf5f
    
    # stress를 확인하려고 하면 값이 제대로 안 나옴
    mink@DESKTOP-U4KHBSV:/mnt/c/Users/Playdata$ ps aux | grep stress

--cpus

  • --cpus 옵션은 --cpu-period, --cpu-quota와 동일한 기능을 하지만 좀 더 직관적으로 CPU의 개수를 직접 지정한다는 점에서 다르다.

    # --cpus 옵션에 0.5를 설정하면 --cpu-period=100000 또는 --cpu-quota=500000과 동일하게 컨테이너의 CPU를 제한
    mink@DESKTOP-U4KHBSV:/mnt/c/Users/Playdata$ docker run -d --name cpus_container --cpus=0.5 alicek106/stress stress --cpu 1
    d516c83303f329545cd3500f37c9ae7ba617c5d54eceb35c5c22dddb744bce3b
    
    • 병렬 처리를 위해 CPU를 많이 소모하는 워크로드를 수행해야 한다면 --cpu-share, --cpus, --cpu-period. --cpu-quota 옵션보다는 --cpuset-cpu 옵션을 사용하는 것이 좋다.
    • --cpuset-cpu 옵션을 사용하면 특정 컨테이너가 특정 CPU에서만 동작하는 CPU 친화성(Alfinity)을 보장할 수 있고, CPU 캐시 미스 또는 컨텍스트 스위칭과 같이 성능을 하락시키는 요인을 최소화할 가능성이 높아지기 때문이다.

2.2.9.3 Block I/O 제한

  • 컨테이너를 생성 할 때 아무런 옵션도 설정하지 않으면 컨테이너 내부에서 파일을 읽고 쓰는 대역폭에 제한이 설정되지 않습니다.

  • 하나의 컨테이너가 블록 입출력을 과도하게 사용하지 않게 설정하려면 run 명령어에서 --device-write-bps, --device-read-bps, --device-write-iops, --device-read-iops 옵션을 지정해 블록 입출력을 제한

  • Direct I/O의 경우에만 블록 입출력이 제한되며, Buffered I/O는 제한되지 않는다.

  • --device-write-bps, --device-read-bps는 각기 쓰고 읽는 작업의 초당 제한을 설정한다.

  • kb, mb, gb 단위로 제한

    # 다음 명령어로 컨테이너를 생성하면 초당 쓰기 작업의 최대치가 1MB로 제한
    # Block I/O를 제한하는 옵션은 [디바이스 이름]:[값] 형태로 설정
    # AWS의 EC2 인스턴스에서 테스트했기 때문에 /dev/xvda라는 디바이스를 사용
    # 이 디바이스에서 컨테이너의 저장 공간을 할당받고 있어 /dev/xvda:1mb로 설정
    # devicemapper를 스토리지 드라이버를 사용하는 도커 엔진에서 루프 디바이스를 스토리지로 사용한다면 /dev/loop0:1mb와 같은 형식
    mink@DESKTOP-U4KHBSV:/mnt/c/Users/Playdata$ docker run -it --device-write-bps /dev/xvda:1mb ubuntu:14.04
    WARNING: Your kernel does not support BPS Block I/O write limit or the cgroup is not mounted. Block I/O BPS write limit discarded.
    
    # 생성된 컨테이너에서 쓰기 작업을 테스트해보면 속도가 초당 1MB로 제한되는 것을 확인
    # 10MB의 파일을 Direct I/O를 통해 쓰기 작업을 수행
    root@a599ccee5f81:/# dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct
    10+0 records in
    10+0 records out
    10485760 bytes (10 MB) copied, 0.0224329 s, 467 MB/s
    # CPU의 자원 할당에서 --cpu-share에 상대적인 값을 입력했던 것처럼 --device-write-iops,   --device-read-iops에도 상대적인 값 입력
    # --device-write-iops의 값이 2배 차이 나는 컨테이너로 쓰기 작업을 수행하면 수행 시간 또는 2배 가량 차이가 남
    mink@DESKTOP-U4KHBSV:/mnt/c/Users/Playdata$ docker run -it --device-write-iops /dev/xvda:5 ubuntu:14.04
    WARNING: Your kernel does not support IOPS Block write limit or the cgroup is not mounted. Block I/O IOPS write limit discarded.
    root@15421ed9cdcd:/# dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct
    10+0 records in
    10+0 records out
    10485760 bytes (10 MB) copied, 0.0447474 s, 234 MB/s
    
    mink@DESKTOP-U4KHBSV:/mnt/c/Users/Playdata$ docker run -it --device-write-iops /dev/xvda:10 ubuntu:14.04
    WARNING: Your kernel does not support IOPS Block write limit or the cgroup is not mounted. Block I/O IOPS write limit discarded.
    root@e538d78a5ff6:/# dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct
    10+0 records in
    10+0 records out
    10485760 bytes (10 MB) copied, 0.029512 s, 355 MB/s

2.2.9.4 스토리지 드라이버와 컨테이너 저장 공간 제한

  • 컨테이너 내부에서 사용되는 파일시스템의 크기는 도커가 사용하고 있는 스토리지 드라이버에 따라 조금씩 다름.

    # 도커 엔진이 AUFS 스토리지를 드라이버를 사용하도록 설정돼 있다면 컨테이너는 호스트와 저장 공간의 크기를 공유하지만
    # 디바이스매퍼 드라이버를 사용하고 있다면 컨테이너는 10GB의 저장 공간을 할당
    mink@PMK-HS1HH67:~$ docker run -it --name centos ubuntu:14.04
    root@72475d50db5e:/# df -h
    Filesystem      Size  Used Avail Use% Mounted on
    overlay         251G  8.5G  230G   4% /
    tmpfs            64M     0   64M   0% /dev
    tmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup
    shm              64M     0   64M   0% /dev/shm
    /dev/sdd        251G  8.5G  230G   4% /etc/hosts
    tmpfs           3.9G     0  3.9G   0% /proc/acpi
    tmpfs           3.9G     0  3.9G   0% /sys/firmware
  • dm.basesize 옵션의 값은 도커 엔진이 이미지를 내려받을 때 시스템 자체의 옵션으로서 내장시키기 때문에 도커 데몬의 dm.basesize 옵션을 변경해도 기존에 사용했던 10G인 설정을 가진 이미지가 존재한다면 컨테이너의 파일시스템 크기는 변하지 않음

  • 도커에 초기 상태로 초기화한 뒤 사용해야만 정상적으로 적용

  • 도커의 데이터를 저장하는 디렉터리를 삭제하기 때문에 모든 파일을 미리 백업해두는 것이 좋음

profile
parkminkyu velog

0개의 댓글