Docker - 컨테이너 정리
컨테이너?
컨테이너는 하나의 Application 프로세스
각 컨테이너는 완전하게 분리된 공간에서 각각 따로 동작
컨테이너 안에 base image를 설치하고 (node js, mysql 등), source code를 포함하여 실행
base image, source image, 실행 명령어는 uuid로 구분
컨테이너 이미지는 파일로 저장되어있으며, 해당파일을 실행하면 컨테이너(실행중인 프로세스)
컨테이너 동작방식
hub.docker.com 에 수많은 컨테이너 이미지가 저장되어 있음
docker search nginx <- nginx를 허브에서 찾아봐주세요.
docker pull nginx:latest <- nginx 최신버전을 가져와주세요.
docker run -d --name web -p 80:80 nginx:latest <- 이름이 name 인 컨테이너에서 nginx를 80번 포트에서 실행해주세요.
컨테이너 생성
개발할 프로그램과 실행환경을 모두 컨테이너로 생성할 수 있음
MSA(Micro Service Architecture) 전체 시스템을 모듈화 시켜 운용
Dockerfile을 이용해 컨테이너 빌드
Dockerfile이란?고유의 지시어(Instruction; FROM, COPY CMD etc.)을 가지고 해당 파일을 사용해 컨테이너 빌드를 도와주기 위한 명령어의 집합
컨테이너 배포
Docker HOST
이름이 ~~ Dockerfile을 만들고
docker bulild -t ~~:latest .
docker login
docker push ~~:latest
컨테이너 이미지
도커 이미지 탐색 docker search [옵션] <이미지이름:태그명>
이미지 다운로드 docker pull [옵션] <이미지이름:태그명>
다운받은 이미지 목록 출력 docker images
다운받은 이미지 상세보기 docker inspect [옵션] <이미지이름:태그명>
이미지 삭제 docker irmi [옵션] <이미지이름:태그명>
컨테이너 실행
컨테이너 생성 docker create [옵션] <컨테이너 이름> <이미지이름:태그명>
컨테이너 실행 docker start [옵션] <컨테이너 이름>
컨테이너 생성/실행 docker run [옵션] <이미지이름:태그명>
실행중인 컨테이너 목록 확인 docker ps [옵션]
컨테이너 상세보기 docker inspect <컨테이너 이름>
ex: docker inspect --format '{{.NetworkSettings.IPAddress}}' webserver
동작중인 컨테이너 중지 docker stop [옵션] <컨테이너 이름>
컨테이너 삭제 docker rm [옵션] <컨테이너 이름>
Tip: alias cip="<명령어>" 로 단축키 등록 가능
ex: alias cip="docker inspect --format '{{.NetworkSettings.IPAddress}}'" 등록 후
cip webserver 사용
실행중인 컨테이너 관리
실행중인 컨테이너 목록 확인 docker ps [옵션]
포그라운드로 실행중인 컨테이너에 연결 docker attach [옵션] <컨테이너 이름>
동작중인 컨테이너에 NEW 명령어 추가 실행 docker exec [옵션] <컨테이너 이름>
ex: docker -it webserver /bin/bash (i: interactive, t: terminal 터미널실행)
컨테이너에서 동작되는 프로세스 확인 docker top [옵션] <컨테이너 이름>
동작중인 컨테이너가 생성한 로그 보기 docker logs [옵션] <컨테이너 이름> (-f 실시간)
컨테이너 리소스 제한
컨테이너가 필요로 하는 만큼의 리소스만 할당해야 한다.
CPU, Memory, Disk I/O 제한 가능
메모리 리소스 제한
컨테이너가 사용할 최대 메모리 양 지정 --memory or -m
ex: docker run -d -m 512 nginx:1.14
컨테이너가 사용할 스왑 메모리 영역에 대한 설정(생략 시 메모리의 2배) --memory-swap
ex: docker run -d -m 200m --memory-swap 300m nginx:1.14
--memory 값보다 적은 값으로 구성하는 소프트 제한 값 설정 --memory-reservation
ex: docker run -d -m 1g --memory-reservation 500m nginx:1.14
OOM Killer가 프로세스 kill 하지 못하도록 보호 --oom-kill-disable
ex: docker run -d -m 200m --oom-kill-disable nginx:1.14
CPU 리소스 제한
컨테이너가 할당할 CPU core수를 지정 --cpus
ex: docker run -d --cpus=".5" ubuntu:latest
컨테이너가 사용할 수 있는 CPU나 코어를 할당. cpu index는 0부터 --cpuset-cpus
ex: docker run -d --cpuset-cpus 0-3 ubuntu:latest
컨테이너가 사용하는 CPU 비중을 1024값을 기반으로 설정(다른컨테이너에 비해 상대적인 값. A 컨테이너가 1024, B 컨테이너가 2048이면 B 컨테이너는 A 컨테이너의 2배의 CPU 사용을 함) --cpu-share
ex: docker run -d --cpu-share 2048 ubuntu:latest
Block I/O 제한
Block IO의 Qunta를 설정할 수 있으며 100 ~ 1000 까지 선택(default:500), 컨테이너 가중치 기반
--blkio-weight, --blkio-weight-device
ex: docker run -it --rm --blkio-weight 100 ubuntu:latest /bin/bash
특정 디바이스에 대한 읽기와 쓰기 작업의 초당 제한을 kb, mb, gb 단위로 설정
--device-read-bps, --device-wright-bps
ex: docker run -it --rm --device-write-bps /dev/vda:1mb ubuntu:latest /bin/bash
ex: docker run -it --rm --device-write-bps /dev/vda:10mb ubuntu:latest /bin/bash
컨테이너의 read/write 속도의 쿼터를 설정. 초당 quota를 제한해서 I/O를 발생시킴. 0 이상의 정수로 표기
초당 데이터 전송량 = IOPS * 블럭크기(단위 데이터 용량)
--device-read-iops, --device-write-iops
ex: docker run -it --rm --device-write-iops /dev/vda:10 ubuntu:latest /bin/bash
ex: docker run -it --rm --device-write-iops /dev/vda:100 ubuntu:latest /bin/bash
리소스 모니터링 (docker monigoring commands)
실행중인 컨테이너의 런타임 통계 확인 docker stat [options] [container..]
도커 호스트의 실시간 event 정보를 수집해서 출력
docker event -f container = <MAME>
docker image -f container = <MAME>
구글에서만든 모니터링 툴 cAdvisor
stress container 생성
컨테이너 빌드 : 부하 테스트 프로그램 stress를 설치 하고 동작시키는 컨테이너 빌드
CPU 부하 테스트: 2개 cpu core 를 100% 사용하도록 부하 발생: stress --cpu-2
메모리 부하 테스트 : 프로세스 수 2개와 사용할 메모리 만큼 부하 발생 : stress --vm 2 vm-bytes <사용할 크기>
컨테이너 Storage
volume 옵션 사용
-v <host path>:<container mount path>
-v <host path>:<vontainer mount path>:<read write mode>
-v <container mount path>
docker run -d -v /dbdata:/var/lib/mysql
docker run -d -v /webdata:/var/www/html:ro
ex:
docker run -d --name db -v /Users/dj/Desktop/Docker/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=1234 --platform linux/amd64 mysql:latest
Port-Forwording
-p hostPort:containerPort
용어정리
Docker Host: 도커 데몬이 동작되고 있는 시스템
Docker Daemon : systemctl start docker(도커 실행)
Docker Client Command : docker search... (밑줄친 도커를 의미)
Docker Hub : 직접 만들거나, hub.docker.com 운용
Container Images : 실행할 프로그램이 파일에 저장
Container : Container Images를 실행하여 실행중일 때