📌 도커 데몬에 대해 다룹니다.
이처럼 도커 구조는 크게 두 가지로 나뉜다.
도커 데몬은 아래와 같은 명령어로 시작, 정지할 수 있다. 우분투에서는 도커가 설치되면 자동으로 서비스로 등록되고 호스트가 재시작되면 자동으로 실행된다.
service docker start
service docker stop
레드햇 계열의 운영체제는 도커를 자동으로 실행하려면 아래의 명령어로 docker 서비스를 활성화한다.
systemctl enable docker
dockerd 명령어 또한 /usr/bin/dockerd 로서 존재하기 때문에 docker 명령어처럼 바로 사용할 수도 있다.
dockerd
dockerd
에 옵션을 추가하여 직접 실행할 수도 있지만 설정 파일의 DOCKER_OPTS
에 입력해두면 서비스로 도커를 실행하여도 지정한 옵션을 사용할 수 있다.
우분투 14.04의 경우 docker는 /etc/default/docker 파일을 읽어 도커 데몬을 서비스로 실행한다. 이 파일에 DOCKER_OPTS
를 추가하고 dockerd
에 대한 옵션을 추가해주면 옵션을 사용할 수 있다.
-H
옵션은 도커 데몬의 API를 사용할 수 있는 방법을 추가한다.
아무런 옵션을 사용하지 않으면 도커 클라이언트인 /usr/bin/docker를 위한 유닉스 소켓인 /var/run/docker.sock을 사용한다.
-H
에 IP 주소와 포트 번호를 입력하면 원격 API인 Docker Remote API로 도커를 제어할 수 있다. Remote API는 로컬에 있는 도커 데몬이 아니더라도 제어할 수 있고 RESTful API 형식을 띠고 있어서 HTTP 요청으로 도커를 제어할 수 있다.
dockerd -H unix://var/run/docker.sock -H tcp://0.0.0.0:2375
위 명령어를 사용하면 호스트의 모든 인터페이스 카드에 할당된 IP 주소와 2375번 포트로 도커 데몬을 제어함과 동시에 도커 클라이언트도 사용할 수 있다.
dockerd -H tcp://192.168.99.100:2375
위와 같이 IP 주소가 192.168.99.100 인 도커 호스트에서 -H
로 Remote API를 허용했다면 다른 호스트에서 다음과 같이 Remote API를 사용할 수 있다.
curl 192.168.99.100:2375/version --silent | python -m json.tool
192.168.99.100:2375/version 으로 HTTP 요청을 전송하는 것은 docker version
이라는 명령어와 같다.
셸의 환경변수를 설정해 원격에 있는 도커를 제어할 수도 있다.
export DOCKER_HOST="tcp://192.168.99.100:2375"
docker version
또는 도커 클라이언트에 -H
옵션을 설정해 사용할 수도 있다.
docker -H tcp://192.168.99.100:2375 version
❗️도커는 기본적으로 보안 연결이 설정돼 있지 않다. 보안이 적용돼 있지 않으면 Remote API를 위해 바인딩된 IP 주소와 포트 번호만 알면 도커를 제어할 수 있다.
도커 데몬에 TLS 보안을 적용할 때 사용될 파일은 총 5개
아래 링크에서 자세한 보안 적용 방법을 알 수 있다.
https://docs.docker.com/engine/security/protect-access/
도커는 특정 스토리지 백엔드 기술을 사용해 도커 컨테이너와 이미지를 저장하고 관리한다. 도커를 사용하는 환경에 따라 스토리지 드라이버는 자동으로 정해지지만 도커 데몬 실행 옵션에서 스토리지 드라이버를 변경할 수도 있다.
지원하는 드라이버로는 OverlayFS, AUFS, Btrfs, Devicemapper, VFS, ZFS 등이 있다. 이 중 하나만 선택해 도커 데몬에 적용할 수 있고, 적용된 스토리지 드라이버에 따라 컨테이너와 이미지는 별도로 생성된다.
무조건 좋은 스토리지 드라이버라는 것은 없기 때문에 상황에 따라 각 드라이버의 장단점을 감안해 선택하는 것이 바람직하다. 스토리지 선택 가이드에 대해서는 도커 스토리지 공식문서를 참고하는 것이 좋다.
https://docs.docker.com/storage/storagedriver/select-storage-driver/
컨테이너 내부에서 사용되는 파일시스템의 크기는 도커가 사용하고 있는 스토리지 드라이버에 따라 조금씩 다르다. 도커 엔진이 AUFS나 overlay2 등의 스토리지 드라이버를 사용하도록 설정돼 있다면 컨테이너는 호스트와 저장 공간의 크기를 공유한다.
devicemapper 드라이버는 기본적으로 10GB의 저장 공간을 할당받도록 설정돼있다. 스토리지 드라이버에 상관없이 컨테이너의 저장 공간을 제한하는 기능을 도커 엔진에서 제공하지는 않지만, devicemapper, overlay2 등 일부 스토리지 드라이버에 한해서 저장 공간을 제한하는 것은 가능하다.
DOCKER_OPTS=".... --storage-driver=devicemapper --storage-opt dm.basesize=20G ...."
다음과 같이 옵션을 추가해주면 컨테이너의 기본 저장 공간의 크기를 20GB로 설정한다.
이후 도커를 재시작하면 설정이 적용된다.
docker run -it --storage-opt size=25G centos:7
--storage-opt
옵션을 도커 컨테이너 생성 시에 주면 공간의 크기를 제어할 수 있다. 이 때, 실행 옵션으로 주는 값은 dm.basesize
보다 커야한다.
스토리지 드라이버로 overlay2를 사용하고 있고, 도커 데이터가 저장되어 있는 디스크가 xfs 파일 시스템인 경우 project quota 기능을 이용해 컨테이너 저장 공간을 제한할 수 있다.
mkfs.xfs /dev/{새로운디스크}
mkdir /mnt/xfs
mount /dev/{새로운디스크} /mnt/xfs -o rw,pqutoa
사용할 디스크를 xfs 파일 시스템으로 포맷한 후, 디스크를 마운트한다.
DOCKER_OPTS="--storage-driver=overlay2 --data-root=/mnt/xfs"
위 옵션을 도커 데몬에 추가한 후, 도커를 재시작한다.
docker run -it --storage-opt size=10G centos:7
컨테이너 실행 시 --storage-opt
옵션으로 적용할 수 있다.
모니터링을 하는 이유?
도커 데몬에서 어떤 일이 일어나고 있는지 가장 확실하고 정확하게, 그리고 자세하게 알아내는 방법은 도커 데몬을 디버그 옵션으로 실행하는 것이다.
dockerd -D
-D
옵션을 추가해서 사용할 수 있다.
docker events
docker system events
도커 데몬에 어떤 일이 일어나고 있는지를 실시간 스트림 로그로 보여준다.
도커 클라이언트가 입력하는 모든 명령어가 출력되는 것은 아니며, attach
, commit
, copy
, create
등의 컨테이너 관련 명령어, delete
, import
, load
, pull
, push
등의 이미지 관련 명령어, 볼륨, 네트워크, 플러그인 등에 관한 명령어의 수행 결과가 출력된다.
docker stats
실행 중인 모든 컨테이너의 자원 사용량을 스트림으로 출력한다.
CPU, 메모리 제한 및 사용량, 네트워크 입출력(I/O), 블록 입출력(하드웨어 입출력) 정보를 출력한다.
docker system df
도커에서 사용하고 있는 이미지, 컨테이너, 로컬 볼륨의 총 개수 및 사용 중인 개수, 크기, 삭제함으로써 확보 가능한 공간을 출력한다.
CAdvisor는 구글이 만든 컨테이너 모니터링 도구로, 컨테이너로서 간단히 설치할 수 있고 컨테이너별 실시간 자원 사용량 및 도커 모니터링 정보 등을 시각화해서 보여준다.
CAdvisor를 사용하기 위해 다음 명령어를 입력한다. CAdvisor는 컨테이너 에이전트의 형태로 도커 모니터링에 필요한 자료를 수집한다.
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 \
google/cadvisor:latest
이미지 pull 및 컨테이너 생성이 완료되면 호스트의 8080번 포트로 CAdvisor 대시보드에 접근할 수 있다. CAdvisor에서는 생성된 모든 컨테이너의 자원 사용량 뿐만 아니라 도커 데몬의 정보, 상태, 호스트의 자원 사용량까지 한 번에 확인할 수 있다.
❗️그러나 CAdvisor는 단일 도커 호스트만을 모니터링할 수 있다는 한계가 있다.
여러 개의 호스트를 도커로 사용하고 있는 경우에는 쿠버네티스나 스웜 모드 등과 같은 오케스트레이션 툴을 설치한 뒤에 프로메테우스(Prometheus), InfluxDB 등을 이용해 여러 호스트의 데이터를 수집하는 것이 일반적이다.