[Docker] 컨테이너(Container) 명령어/사용 실습
컨테이너 사용
- 컨테이너 생성
- docker create [option] [이미지이름:테그명]
$ docker create --name webserver nginx:1.14
- 컨테이너 실행
- docker start [option] 컨테이너이름
$ docker start webserver
- 컨테이너 생성/실행
- docker run [option] [이미지이름:태그명]
$ docker run --name webserver -d nginx:1.14
-d
: 백그라운드에서 실행
- 동작중인 컨테이너에 명령어 추가 실행
- docker exec [option] 컨테이너이름
$ docker exec -it webserver /bin/bash
i
: interative,t
: terminal
- 실행중인 컨테이너 목록 확인
- docker ps [option]
$ docker ps
- 동작중인 컨테이너 중지
- docker stop [option] 컨테이너이름
$ docker stop webserver
- 컨테이너 삭제
- docker [option] 컨테이너이름
$ docker rm -f webserver
- 컨테이너에서 동작되고있는 프로세스 확인
$ docker top
$ docker logs
: log 보기$ docker logs -f
: 실시간 log 보기
- 컨테이너 내 필요한 정보만 찾기
$ docker inspect --format '' webserver
: webserver 컨테이너의 IP 정보만 조회alias conip(임의의 별명)="docker inspect --format ''"
: alias 등록해 놓으면conip webserver
만으로 조회 가능
### 컨테이너 리소스 제한
Docker command를 통해 CPU, Memory, Disk I/O 등의 리소스를 제한할 수 있다.
Memory 리소스 제한
옵션 | 의미 |
---|---|
-m | 컨테이너가 사용할 최대 메모리 양을 지정 |
–memory-swap | 컨테이너가 사용할 스왑 메모리 영역에 대한 설정 (디스크를 메모리처럼 사용) 메모리+스왑. 생략 시 메모리의 2배가 설정됨 |
–memory-reservation | –memory 값보다 적은 값으로 구성하는 소프트 제한 값 설정 |
–oom-kill-disable | OOM Killer가 프로세스 kill 하지 못하도록 보호 |
- ` $ docker run -d -m 512m nginx:1.14`
- 컨테이너 내 최대 512Mbite 사용 가능
$ docker run -d -m 1g --memory-reservation 500m nginx:1.14
- 최대 1Gbite 사용 가능, 최소 500Mbite 보장
$ docker run -d -m 200m --memory-swap 300m nginx:1.14
- 메모리 최대 200Mbite, 스왑 100Mbite 사용가능 (default 메모리의 2배값)
$ docker run -d -m 200m --oom-kill-disable nginx:1.14
- linux kunel에서 Out Of Memory Killer를 동작시켜 프로세스들을 중단시키것을 보호
CPU 리소스 제한
옵션 | 의미 |
---|---|
–cpus | 컨테이너에 할당할 CPU core 수를 지정 –cpus=”1.5” 컨테이너가 최대 1.5개의 CPU파워 사용가능 |
–cpuset-cpus | 컨테이너가 사용할 수 있는 CPU나 코어를 할당. –cpuset-cpus=0-4 (cpu index는 0부터) |
–cpu-share | 컨테이너가 사용하는 CPU비중을 1024 값을 기반으로 설정 (상대적 가중치) –cpu=share 2048 기본 값보다 두 배 많은 CPU 자원을 할당 |
-
$ docker run -d --cpus=".5" ubuntu:1.14
- CPU 코어 1개중 50% 까지 사용 가능
-
$ docker run -d --cpu-shares 2048 ubuntu:1.14
- 모든 컨테이너는 기본적으로 default 1024 cpu share값을 가지고 동작함
- 설정함으로서 다른 컨테이너와의 상대적인 리소스를 할당하게 됌
-
$ docker run -d --cpuset-cpus 0-3 ubuntu:1.14
- 0~4번 코어에서 동작 가능
Block I/O 제한
옵션 | 의미 |
---|---|
–blkio-weight –blkio-weight-device |
Block IO의 Quota를 설정할 수 있으며 100~1000까지 선택 (default 500, 상대적인 가중치를 설정해주는 것임) |
–device-read-bps –device-write-bps |
특정 디바이스에 대한 읽기와 쓰기 작업의 초당 제한을 kb, mb, gb 단위로 설정 |
–device-read-iops –device-write-iops |
iops(컨테이너의 read/write 속도)의 쿼터를 설정한다. 초당 quota를 제한해서 I/O를 발생시킴(0 이상의 정수로 표기) 초당 데이터 전송량 = IOPS * 블럭크기(단위 데이터 용량) |
-
$ docker run -it --rm --blkio-weight 100 ubuntu:latest /bin/bash
- 다른 컨테이너(default 500)에 비해 1/5 수준의 block I/O만 할당
-
$ docker run -it --rm --device-write-bps /dev/vda:1mb ubuntu:latest /bin/bash
- /dev/vda에 저장할 때는 초당 최대 1mb로 전송 제한
-
$ docker run -it --rm --device-write-iops /dev/vda:100 ubuntu:latest /bin/bash
- /dev/vda에 대해 전송량을 제한
# run과 함께 --rm 명령어를 사용하면 컨테이너 종료 해당 컨테이너 자동 삭제
리소스 모니터링
- docker monitoring commands
docker stat[옵션] [컨테이너이름]
: 실행중인 컨테이너의 런타임 통계를 확인docker event
: 도커 호스트의 실시간 event 정보를 수집해서 출력docker events -f container=<NAME>
- cAdvisor : 도커 모니터링 툴
- https://github.com/google/cadvisor/
실습
메모리 리소스 제한
메모리 부하 확인할 dockerfile 생성
- docker build -t stress .
- stress : 부하 테스트 프로그램
docker run -m 100m --memory-swap 100m stress:latest stress --vm 1 --vm-bytes 90m -t 5s
- stress 컨테이너 메모리 2코어 100% 사용 및 100Mbyte 메모리 부여(스왑메모리 0) 5초간 작업 로드 90Mbyte 일으킴 -> 잘 작동함
$ docker run -m 100m --memory-swap 100m stress:latest stress --vm 1 --vm-bytes 90m -t 5s
stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
stress: info: [1] successful run completed in 5s
docker run -m 100m --memory-swap 100m stress:latest stress --vm 1 --vm-bytes 150m -t 5s
- 최대 메모리 100M인데 150M 로드를 부하하면 -> 동작 FAIL
$ docker run -m 100m --memory-swap 100m stress:latest stress --vm 1 --vm-bytes 150m -t 5s
stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
stress: FAIL: [1] (415) <-- worker 8 got signal 9
stress: WARN: [1] (417) now reaping child worker processes
stress: FAIL: [1] (421) kill error: No such process
stress: FAIL: [1] (451) failed run completed in 0s
docker run -m 100m stress:latest stress --vm 1 --vm-bytes 90m -t 5s
- swap size를 생략하면 (default 값 : 메모리의 2배) 설정되어 잘 작동함
$ docker run -m 100m stress:latest stress --vm 1 --vm-bytes 90m -t 5s
stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
stress: info: [1] successful run completed in 5s
CPU 리소스 제한
1. CPU 코어 설정
-
컨테이너 별로 작업 로드를 분산시킬 수 있음
-
$ docker run --cpuset-cpus 1 --name c1 -d stress stress --cpu 1
htop
커멘드를 통해 2번째(index 1) CPU에 작업 로드 100% 일으키고 있는 것을 확인 가능
- `$ docker run --cpuset-cpus 0 --name c1 -d stress stress --cpu 1`
1번째 CPU에서 작업하고 있는 것을 확인 가능
2. CPU 리소스 가중치 설정
컨테이너 별로 CPU 가중치를 할당하여 실행하도록 구성
-
$ docker run -c 2048 --name cload1 -d stress:latest
$ docker run --name cload2 -d stress:latest
(default : 1024)$ docker run -c 512 --name cload3 -d stress:latest
$ docker stats
CPU 사용량 등 확인 가능
사용하고 있는 컨테이너별 cpu 가중치를 확인할 수 있음
(CPU돌아가는 소리가 엄청나서 컴퓨터 터지는줄…)
3. Block I/O 제한
-
$ docker run -it --rm --device-write-iops /dev/xvda:10 ubuntu:latest /bin/bash
$ dd if=/dev/zero of=filel bs=1M count=10 oflag=direct
if
: 지정 경로 내에of
: 지정된 파일을 만들고count=10
: 10블록 크기만큼bs=1M
: 한번에 1M씩 읽어들여 출력,oflag=direct
: buffer cache 사용 않고 다이렉트로 I/O 즉, 10M를 읽고 출력하는데 걸리는 시간을 측정하기 위해 사용
10+0 records in 10+0 records out 10485760 bytes (10 MB, 10 MiB) copied, 1.01403 s, 10.3 MB/s # 초당 10.3 MB
-
$ docker run -it --rm --device-write-iops /dev/xvda:100 ubuntu:latest /bin/bash
$ dd if=/dev/zero of=filel bs=1M count=10 oflag=direct
10+0 records in 10+0 records out 10485760 bytes (10 MB, 10 MiB) copied, 0.0412287 s, 254 MB/s # 초당 254 MB
block IO 설정을 통해 확연한 속도 차이를 확인할 수 있음
4. cAdvisor
-
https://github.com/google/cadvisor/
# Quick start VERSION=v0.36.0 # use the latest release version from https://github.com/google/cadvisor/releases sudo docker run \ --volume=/:/rootfs:ro \ --volume=/var/run:/var/run:ro \ --volume=/sys:/sys:ro \ --volume=/var/lib/docker/:/var/lib/docker:ro \ --volume=/dev/disk/:/dev/disk:ro \ --publish=8080:8080 \ --detach=true \ --name=cadvisor \ --privileged \ --device=/dev/kmsg \ gcr.io/cadvisor/cadvisor:$VERSION
-
UI를 통해 확인 가능
-
cAdvisor는 Kubernates에 포함되어 있음
댓글남기기