Docker가 실제로 어디 있는지 알아보겠습니다.
# which docker
/usr/bin/docker
docker 명령어는 /usr/bin/docker에 있는 파일을 통해 사용되고 있습니다.
이번에는 실행 중인 도커 프로세스를 확인해보겠습니다.
# ps aux | grep docker
root 17594 0.0 0.1 14860 1064 pts/0 S+ 09:19 0:00 grep --color=auto docker
root 21906 0.0 7.7 911984 77864 ? Ssl Mar07 0:54 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
확인해보니 /usr/bin/docker가 실행 중인 줄 알았는데 /usr/bin/dockerd가 실행 중입니다. 뭔가 이상합니다. 도커 구조를 살펴보겠습니다.
Docker 데몬(dockerd)은 API 요청을 수신하고 이미지, 컨테이너, 네트워크 및 볼륨과 같은 Docker 객체를 관리합니다.
Docker 클라이언트는 많은 Docker 사용자가 Docker와 상호작용하는 기본방법입니다. docker run
과 같은 명령을 사용하면 클라이언트가 이러한 명령을 API로서 dockerd로 보내 실행합니다. 이때 Docker 클라이언트는 /var/run/docker.sock에 있는 유닉스 소켓을 통해 도커 데몬의 API를 호출합니다. 도커 클라이언트가 사용하는 유닉스 소켓은 같은 호스트 내에 있는 도커 데몬에게 명령을 전달할 때 사용됩니다. tcp로 원격에 있는 도커 데몬을 제어하는 방법도 있습니다.
Docker registries는 Docker 이미지를 저장합니다. Docker Hub는 누구나 사용할 수 있는 공용 레지스트리이며 Docker는 기본적으로 Docker Hub에서 이미지를 찾습니다.
# service docker stop
# dockerd
...
used to set a preferred IP address
INFO[2021-03-13T09:30:42.018349427Z] Loading containers: done.
INFO[2021-03-13T09:30:42.055862531Z] Docker daemon commit=363e9a8 graphdriver(s)=overlay2 version=20.10.4
INFO[2021-03-13T09:30:42.056762465Z] Daemon has completed initialization
INFO[2021-03-13T09:30:42.086503239Z] API listen on /var/run/docker.sock
도커 데몬을 실행시키면 마지막에 /var/run/docker.sock에서 입력(listen)을 받을 수 있는 상태라는 메시지가 출력됩니다.
도커 데몬에서 어떤 일이 일어나고 있는지 가장 확실하고 정확하게, 그리고 자세히 알아내는 방법은 도커 데몬을 디버그 옵션으로 실행하는 것입니다. 이렇게 하면 Remote API의 입출력뿐만 아니라 로컬 도커 클라이언트에서 오가는 모든 명령어를 로그로 출력합니다. 디버그 모드는 도커 데몬을 실행할 때 -D 옵션을 추가해서 사용할 수 있습니다.
# dockerd -D
INFO[2021-03-16T16:46:51.072759627Z] Starting up
DEBU[2021-03-16T16:46:51.073371657Z] Listener created for HTTP on unix (/var/run/docker.sock)
INFO[2021-03-16T16:46:51.073633924Z] detected 127.0.0.53 nameserver, assuming systemd-resolved, so using resolv.conf: /run/systemd/resolve/resolv.conf
DEBU[2021-03-16T16:46:51.073998912Z] Golang's threads limit set to 6840
INFO[2021-03-16T16:46:51.074444262Z] parsed scheme: "unix" module=grpc
그런데 원치 않는 로그까지 너무 많이 출력되며, 호스트에 있는 파일을 읽거나 도커 데몬을 포그라운드 상태로 실행해야 한다는 단점이 있어 도커가 제공하는 명령어를 통해 도커 데몬을 모니터링 해보겠습니다.
events
명령어는 도커가 기본으로 제공하는 명령어 입니다. events
명령어는 도커 데몬에 어떤 일이 일어나고 있는지를 실시간 스트림 로그로 보여줍니다.
# docker events
위 명령어를 입력해도 어떠한 이벤트도 도커 데몬에 발생하지 않아서 아무것도 출력되지 않습니다. 새로운 터미널을 연 뒤에 ubuntu 이미지를 pull 해보겠습니다.
# docker events
2021-03-16T16:58:01.862463109Z image pull ubuntu:latest (name=ubuntu)
특정 항목에 대한 출력 결과만 보고 싶다면 --filter 옵션을 설정하면 됩니다. 출력의 종류는 container, image, volume, network, plugin, daemon이 있습니다.
docker events --filter 'type=image'
type외에도 공식문서를 참조하면 다른 조건들에 대한 출력 결과를 볼 수 있습니다.
stats
명령어는 실행 중인 모든 컨테이너의 자원 사용량을 스트림으로 출력합니다.
# docker stats
stats
명령어는 실행 중인 모든 컨테이너의 CPU, 메모리 제한 및 사용량, 네트워크 입출력(I/O), 블록 입출력(하드웨어 입출력) 정보를 출력합니다.
system df
명령어는 도커에서 사용하고 있는 이미지, 컨테이너, 로컬 볼륨의 총 개수 및 사용 중인 개수, 크기, 삭제함으로써 확보 가능한 공간을 출력합니다.
# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 1 1 72.9MB 0B (0%)
Containers 2 0 8B 8B (100%)
Local Volumes 0 0 0B 0B
Build Cache 0
RECLAMIMABLE 항목은 사용 중이지 않은 이미지를 삭제함으로써 확보할 수 있는 공간을 의미합니다.
참고자료 : https://docs.docker.com/get-started/overview/
참고자료 : https://www.oreilly.com/library/view/getting-started-with/9781838645700/4da0f0db-5661-4599-91f7-53fc1ec62698.xhtml