1. 도커의 구조
[root@localhost ~]# which docker
/usr/bin/docker
[root@localhost ~]# ps auxfw |grep docker
root 1567 0.0 2.9 684176 114544 ? Ssl 5월24 8:48 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
컨테이너나 이미지를 다루는 명령어는 /usr/bin/docker로 실행되지만,
도커 엔진의 프로세스는 /usr/bin/dockerd 파일로 실행됩니다.
이는 docker 명령어가 실제 도커 엔진이 아닌 클라이언트로서의 도커이기 때문입니다.
도커는 클라이언트로서의 도커, 서버로서의 도커로 구분됩니다.
서버로서의 도커란 실제로 컨테이너 생성과 이미지를 관리하는 주체가 되며 이는 dockerd 프로세스로서 동작합니다.
도커 클라이언트란 도커 엔진의 기능을 수행하기 위해 CLI를 제공하는 것이라고 할 수 있습니다. 다시말해, 도커데몬은 API입력을 받아 도커 엔진의 기능을 수행하는데 이 API를 사용할 수 있도록 CLI를 제공하는 것이 도커클라이언트입니다.
사용자가 docker 명령어를 입력하면 도커 클라이언트를 사용하는 것이 되며, 입력된 명령어를 로컬에 존재하는 도커 데몬에게 API로서 전달합니다. 이 때 도커 클라이언트는 /var/run/docker.sock에 위치한 소켓을 통해 도커 데몬의 API를 호출합니다.
간단히 정리하자면 도커데몬을 제어하는 순서는 다음과 같습니다.
1) 사용자가 docker 명령어 입력
2) /usr/bin/docker는 /var/run/docker.sock 소켓을 사용해 도커데몬에게 명령어 전달
3) 도커데몬은 이 명령어를 파싱하고 해당하는 작업 수행
4) 수행 결과를 도커 클라이언트에 반환하고 사용자에게 결과 출력
2. 도커 데몬 실행
service docekr start/stop
systemctl start/stop docker
일반적으로 위와 같이 docker 데몬을 시작/정지할 수 있습니다.
systemctl enable docker
우분투에서는 도커가 설치되면 자동으로 서비스로 등록되어 재부팅이후에도 자동실행이 됩니다.
레드햇 계열의 OS는 자동으로 실행되도록 설정되지 않아 위와 같이 서비스를 활성화 해주어야 합니다.
[root@localhost ~]# dockerd
INFO[2021-06-03T10:52:02.926599689+09:00] Starting up
INFO[2021-06-03T10:52:02.947499401+09:00] parsed scheme: "unix" module=grpc
INFO[2021-06-03T10:52:02.947553230+09:00] scheme "unix" not registered, fallback to default scheme module=grpc
INFO[2021-06-03T10:52:02.947618572+09:00] ccResolverWrapper: sending update to cc: {[{unix:///run/containerd/containerd.sock <nil> 0 <nil>}] <nil> <nil>} module=grpc
INFO[2021-06-03T10:52:02.947651185+09:00] ClientConn switching balancer to "pick_first" module=grpc
INFO[2021-06-03T10:52:02.952639993+09:00] parsed scheme: "unix" module=grpc
INFO[2021-06-03T10:52:02.952686883+09:00] scheme "unix" not registered, fallback to default scheme module=grpc
INFO[2021-06-03T10:52:02.952722595+09:00] ccResolverWrapper: sending update to cc: {[{unix:///run/containerd/containerd.sock <nil> 0 <nil>}] <nil> <nil>} module=grpc
INFO[2021-06-03T10:52:02.952744250+09:00] ClientConn switching balancer to "pick_first" module=grpc
INFO[2021-06-03T10:52:02.964842987+09:00] [graphdriver] using prior storage driver: overlay2
INFO[2021-06-03T10:52:03.384328806+09:00] Loading containers: start.
INFO[2021-06-03T10:52:03.450682859+09:00] Firewalld: docker zone already exists, returning
INFO[2021-06-03T10:52:03.780399962+09:00] Firewalld: interface br-cf451fe3c6d7 already part of docker zone, returning
INFO[2021-06-03T10:52:03.812048830+09:00] Firewalld: interface br-cf451fe3c6d7 already part of docker zone, returning
INFO[2021-06-03T10:52:03.937501102+09:00] Firewalld: interface br-5935a5f634be already part of docker zone, returning
INFO[2021-06-03T10:52:03.969284564+09:00] Firewalld: interface br-5935a5f634be already part of docker zone, returning
INFO[2021-06-03T10:52:04.094120193+09:00] Firewalld: interface docker0 already part of docker zone, returning
INFO[2021-06-03T10:52:04.124611799+09:00] Firewalld: interface docker0 already part of docker zone, returning
INFO[2021-06-03T10:52:04.362041925+09:00] Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option --bip can be used to set a preferred IP address
INFO[2021-06-03T10:52:04.468765361+09:00] Firewalld: interface docker0 already part of docker zone, returning
INFO[2021-06-03T10:52:04.563610198+09:00] Loading containers: done.
INFO[2021-06-03T10:52:04.606281828+09:00] Docker daemon commit=8728dd2 graphdriver(s)=overlay2 version=20.10.6
INFO[2021-06-03T10:52:04.606387716+09:00] Daemon has completed initialization
INFO[2021-06-03T10:52:04.646684102+09:00] API listen on /var/run/docker.sock
도커 서비스를 종료한 뒤 /usr/bin/dockerd 명령어로 도커 서비스를 직접 실행할 수 있습니다.
마지막줄의 docker.sock 이 listen 상태로 입력받을 수 있는 상태가 된 것을 확인할 수 있습니다.
하지만 직접 도커데몬을 실행하면 하나의 터미널을 차지하는 포그라운드 상태로 실행되기에 도커 명령어를 입력하려면 터미널을 하나 더 열어야 하고 포그라운드 터미널에서 인터럽트 발생(ctrl+C) 시 서비스가 종료되어 운영 및 관리 측면에서 바람직하지 않습니다.
실제 운영환경에서는 도커 데몬을 직접 실행하기 보단 systemctl 이나 service 명령어로 관리하는 것이 좋습니다.
'docker' 카테고리의 다른 글
도커 컨테이너 다루기(12) - 도커데몬[3] (0) | 2021.06.08 |
---|---|
도커 컨테이너 다루기(11) - 도커데몬[2] (0) | 2021.06.08 |
도커 컨테이너 다루기(9) - Dockerfile로 빌드할 때 주의할 점 (0) | 2021.06.04 |
도커 컨테이너 다루기(8) - 도커파일(Dockerfile)[2] (1) | 2021.06.03 |
도커 컨테이너 다루기(8) - 도커파일(Dockerfile)[1] (1) | 2021.06.01 |