[Docker] 도커 데몬

공혁준·2022년 5월 15일
0

Docker

목록 보기
7/9
post-thumbnail

📌 도커 데몬에 대해 다룹니다.

도커의 구조

  • 컨테이너나 이미지를 다루는 명령어는 /usr/bin/docker 에서 실행
  • 도커 엔진의 프로세스는 /usr/bin/dockerd 파일로 실행

이처럼 도커 구조는 크게 두 가지로 나뉜다.

  • 클라이언트로서의 도커
    • 도커 데몬은 API 입력을 받아 도커 엔진의 기능을 수행하는데, 이 API를 사용할 수 있도록 CLI(Command Line Interface)를 제공
    • 사용자가 docker로 시작하는 명령어를 입력하는 것은 도커 클라이언트를 사용하는 것이다.
    • 도커 클라이언트는 /var/run/docker.sock에 위치한 유닉스 소켓을 통해 도커 데몬의 API를 호출한다.
  • 서버로서의 도커
    • 실제로 컨테이너를 생성하고 실행하며 이미지를 관리하는 주체
    • 도커 프로세스가 실행되어 서버로서 입력을 받을 준비가 된 상태를 도커 데몬이라고 이야기한다.

도커 데몬 실행

도커 데몬은 아래와 같은 명령어로 시작, 정지할 수 있다. 우분투에서는 도커가 설치되면 자동으로 서비스로 등록되고 호스트가 재시작되면 자동으로 실행된다.

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

-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

도커 데몬에 보안 적용: --tlsverify

❗️도커는 기본적으로 보안 연결이 설정돼 있지 않다. 보안이 적용돼 있지 않으면 Remote API를 위해 바인딩된 IP 주소와 포트 번호만 알면 도커를 제어할 수 있다.

도커 데몬에 TLS 보안을 적용할 때 사용될 파일은 총 5개

  • 도커 데몬
    • ca.pem, server-cert.pem, server-key.pem
  • 도커 클라이언트
    • ca.pem, cert.pem, key.pem

아래 링크에서 자세한 보안 적용 방법을 알 수 있다.
https://docs.docker.com/engine/security/protect-access/

도커 스토리지 드라이버 변경: --storage-driver

도커는 특정 스토리지 백엔드 기술을 사용해 도커 컨테이너와 이미지를 저장하고 관리한다. 도커를 사용하는 환경에 따라 스토리지 드라이버는 자동으로 정해지지만 도커 데몬 실행 옵션에서 스토리지 드라이버를 변경할 수도 있다.

지원하는 드라이버로는 OverlayFS, AUFS, Btrfs, Devicemapper, VFS, ZFS 등이 있다. 이 중 하나만 선택해 도커 데몬에 적용할 수 있고, 적용된 스토리지 드라이버에 따라 컨테이너와 이미지는 별도로 생성된다.

무조건 좋은 스토리지 드라이버라는 것은 없기 때문에 상황에 따라 각 드라이버의 장단점을 감안해 선택하는 것이 바람직하다. 스토리지 선택 가이드에 대해서는 도커 스토리지 공식문서를 참고하는 것이 좋다.

https://docs.docker.com/storage/storagedriver/select-storage-driver/

컨테이너 저장 공간 설정

컨테이너 내부에서 사용되는 파일시스템의 크기는 도커가 사용하고 있는 스토리지 드라이버에 따라 조금씩 다르다. 도커 엔진이 AUFS나 overlay2 등의 스토리지 드라이버를 사용하도록 설정돼 있다면 컨테이너는 호스트와 저장 공간의 크기를 공유한다.

devicemapper에서의 컨테이너 저장 공간 설정

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에서의 컨테이너 저장 공간 설정

스토리지 드라이버로 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 옵션으로 적용할 수 있다.

도커 데몬 모니터링

모니터링을 하는 이유?

  • 많은 수의 도커 서버를 효율적으로 관리하기 위해
  • 문제가 생겼을 때 그 원인을 찾아내기 위해
  • 도커를 PaaS로써 제공하기 위해 실시간으로 도커 데몬의 상태를 체크하기 위해

도커 데몬 디버그 모드

도커 데몬에서 어떤 일이 일어나고 있는지 가장 확실하고 정확하게, 그리고 자세하게 알아내는 방법은 도커 데몬을 디버그 옵션으로 실행하는 것이다.

dockerd -D

-D 옵션을 추가해서 사용할 수 있다.

events, stats, system df 명령어

events

docker events
docker system events

도커 데몬에 어떤 일이 일어나고 있는지를 실시간 스트림 로그로 보여준다.
도커 클라이언트가 입력하는 모든 명령어가 출력되는 것은 아니며, attach, commit, copy, create 등의 컨테이너 관련 명령어, delete, import, load, pull, push 등의 이미지 관련 명령어, 볼륨, 네트워크, 플러그인 등에 관한 명령어의 수행 결과가 출력된다.

stats

docker stats

실행 중인 모든 컨테이너의 자원 사용량을 스트림으로 출력한다.
CPU, 메모리 제한 및 사용량, 네트워크 입출력(I/O), 블록 입출력(하드웨어 입출력) 정보를 출력한다.

system df

docker system df

도커에서 사용하고 있는 이미지, 컨테이너, 로컬 볼륨의 총 개수 및 사용 중인 개수, 크기, 삭제함으로써 확보 가능한 공간을 출력한다.

CAdvisor

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 등을 이용해 여러 호스트의 데이터를 수집하는 것이 일반적이다.

profile
몰입을 즐기는 개발자입니다.

0개의 댓글