AWS(Amazon Web Service)에서는 로그 및 이벤트 등을 수집하고 저장해 시각적으로 보여주는 클라우드워치(CloudWatch)를 제공
컨테이너에서 드라이버 옵션을 설정하는 것만으로 클라우드워치 로깅 드라이버를 사용
클라우드워치를 사용하는 것은 아래와 같은 단계
클라우드워치에 해당하는 IAM 권한 생성
로그 그룹 생성
로그 그룹에 로그 스트림(LogStream)생성
클라우드워치의 IAM 권한을 사용할 수 있는 EC2 인스턴스 생성과 로그 전송
클라우드워치에 해당하는 IAM 권한 생성 (※ 모든 생성은 다 서울로 해야함!)
AWS 사이트 접속한 다음 콘솔에 로그인하기
관리 콘솔 메뉴 중 '보안, 자격 증명 및 규정 준수' 들어가기
왼쪽 사이드 바의 [역할] 탭을 클릭한 후 [역할 만들기] 버튼을 눌러 새로운 IAM 권한을 생성
'역할을 사용할 서비스 선택' 항목에서 [EC2]를 선택
- [권한 추가] 항목의 권한 정책 필터에서 CloudWatchFull를 입력한 뒤 체크하기
- 마지막으로 해당 IAM 역할의 이름을 입력해 새로운 권한생성
로그 그룹 생성
홈에서 검색창에 [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 로그 스트림 내의 로그를 확인하면 로그가 정상적으로 수집됌을 알 수 있다.
컨테이너를 생성하는 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
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:/#
가상 머신이 특정 개수의 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
# 컨테이너가 3번째 CPU만 사용하도록 설정
mink@DESKTOP-U4KHBSV:/mnt/c/Users/Playdata$ docker run -d --name cpuset_2 --cpuset-cpus=2 alicek106/stress stress --cpu 1
03623573c3173da6e7f59141a2bde16fd7a6bf6a75edd4646cdc5cd7b4e1f934
--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
컨테이너를 생성 할 때 아무런 옵션도 설정하지 않으면 컨테이너 내부에서 파일을 읽고 쓰는 대역폭에 제한이 설정되지 않습니다.
하나의 컨테이너가 블록 입출력을 과도하게 사용하지 않게 설정하려면 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
컨테이너 내부에서 사용되는 파일시스템의 크기는 도커가 사용하고 있는 스토리지 드라이버에 따라 조금씩 다름.
# 도커 엔진이 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인 설정을 가진 이미지가 존재한다면 컨테이너의 파일시스템 크기는 변하지 않음
도커에 초기 상태로 초기화한 뒤 사용해야만 정상적으로 적용
도커의 데이터를 저장하는 디렉터리를 삭제하기 때문에 모든 파일을 미리 백업해두는 것이 좋음