Docker Daemon
지금까지 docker를 다룰 때 항상 docker라는 명령어를 맨 앞에 붙여서 사용했었다.
docker ps -a
docker logs -f my-container
...
이러한 docker 명령어는 실제로 누가 처리하고 있을까?
# which docker
/usr/bin/docker
리눅스에서 which 명령어는 명령어의 파일이 위치한 경로를 출력한다.
docker는 usr/bin/docker라는 폴더에 있다고 나온다.
참고로 usr는 Unix System Resource의 약자이다. 맨 처음에 user인줄,,,
그렇다면 얘가 컨테이너를 생성하고 삭제 하는 역할을 할까?
반은 맞고 반은 틀리다.
/usr/bin/docker에 있는 docker 파일은 사용자의 명령어만 받아들일 뿐 컨테이너를 직접 생성하고 삭제하지 않는다.
도커의 구조
도커는 클라이언트로서의 도커, 서버로서의 도커 2가지로 나뉜다.
아니 여태까지 도커를 잘만 써왔건만 이건 처음 듣는 소린데??!
사실 우리가 써왔던 도커는 클라이언트로서의 도커에 해당된다.
맨 앞에 docker라는 명령어를 입력해 클라이언트로서의 도커에게 명령어를 전달하게 되면,
클라이언트는 해당 명령어를 파싱한 이후, 유닉스 소켓을 이용해 서버로서의 도커에게 API 형태로 전달한다.
즉, 클라이언트로서의 도커는 우리가 직간접적으로 API를 호출할 수 있도록 CLI(Command Line Interface)를 제공한다.
이를 도식화 하면 다음과 같다.
서버와의 통신에 사용되는 유닉스 소켓은 /var/run/docker.sock이다.
소켓을 이용해 통신하므로 눈치가 빠르다면 굳이 로컬이 아니어도 원격으로 통신할 수 있다는 것을 알 수 있다.
도커 서버라고 쓰지 않고 도커 데몬이라고 써두었는데,
실제로 실행중인 도커 프로세스를 확인해보면 docker가 아니라 dockerd가 실행되고 있는 것을 확인할 수 있다.
도커 데몬은 도커 프로세스가 실행되어 서버로서 입력을 받을 준비가 된 상태를 의미한다.
데몬(Daemon)
갑자기 데몬이라는 용어가 나왔다. 얘는 어디서 나온걸까?
Disk And Execution MONitor의 약자로, 유닉스 계열의 운영체제에서 사용된다고 한다. 완전 억지네..
도커 및 쿠버네티스 스터디를 준비하면서 Daemon이라는 용어에 대해 처음으로 알게 되었다.
Daemon을 이해하기 위해서는 먼저 포그라운드 프로세스와 백그라운드 프로세스에 대해 이해하고 있어야 한다.
포그라운드 프로세스란, 사용자와 상호작용 하는 프로세스로 터미널과 키보드와 밀접한 관련이 있다.
예를 들어 터미널에 ls 라는 명령어를 입력하면 파일 목록들이 주르륵 나오는데,
이는 ls 라는 포그라운드 프로세스가 생성된 다음 그 결과를 터미널에 출력하는 것이다.
vim 에디터나 bash 같은 쉘도 포그라운드 프로세스의 일종으로 생각할 수 있다.
백그라운드 프로세스란, 사용자와 상호작용 하지 않고, 시스템 상에서 돌아가는 프로세스이다.
nginx같은 웹서버라던지, MySQL 데이터베이스 서버가 있다.
마지막으로 데몬 프로세스는 백그라운드 프로세스의 일종인데,
PPID(부모 프로세스 ID)가 1이거나 다른 데몬 프로세스의 ID인 백그라운드 프로세스가 데몬 프로세스이다.
일반적으로 프로세스는 부모 프로세스가 죽게 되면 고아 프로세스가 되어 죽기 마련인데,
데몬 프로세스는 init 프로세스를 부모로 두어 PPID가 1이므로 시스템의 생명 주기와 동일하다.
즉, 시스템 서비스의 작업을 지속적으로 끝까지 처리하는 백그라운드 프로세스라고 생각하면 된다.
도커 데몬 제어 -H
도커 데몬까지 알아보았다.
이번에는 도커 데몬을 기존의 방법과는 달리 색다르게 제어할 수 있는 방법을 소개한다.
우리는 도커 데몬을 도커 클라이언트(CLI) 환경을 통해서 제어했었다.
dockerd # docker daemon 프로세스 실행, 디폴트 유닉스 소켓 지정됨
dockerd -H unix:///var/run/docker.sock # -H 옵션을 통해 유닉스 소켓 지정
도커 데몬인 dockerd 프로세스를 실행할 때 -H 옵션을 주면 통신에 필요한 유닉스 소켓을 지정할 수 있다.
위의 예시에서 /var/run/docker.sock은 디폴트 유닉스 소켓으로 지정이 되어있어 위와 아래의 명령어는 차이가 없다.
-H 옵션은 여러 개를 지정할 수 있어 다음과 같이 지정할 수 있다.
dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
이는 호스트의 모든 nic에 할당된 IP주소와 2375번 포트로
도커 데몬을 제어함과 동시에 도커 클라이언트도 사용할 수 있게 해준다.
기존 유닉스 소켓 이외로, 외부 환경에서 도커 데몬을 제어하고 싶어서 -H 옵션을 하나 더 추가했다.
마지막 두줄을 보면 도커 데몬이 제대로 listen하고 있는것을 확인할 수 있다.
다른 탭을 열어서 curl 명령어로 도커 데몬에게 말을 걸어보자.
위의 curl 명령은 docker version 명령어와 동일한 역할을 한다.
보통은 curl 명령어 보다는 언어별 라이브러리를 통해 제어하는 방법을 많이 사용한다고 한다!
'Infra > Docker' 카테고리의 다른 글
[Docker] Docker Swarm (0) | 2023.06.28 |
---|---|
[Docker] Docker Compose (0) | 2023.06.27 |
[Docker] Dockerfile (1) | 2023.05.20 |
[Docker] 도커 볼륨과 네트워크 (0) | 2023.05.19 |
[Docker] 도커 이미지와 컨테이너 (0) | 2023.05.18 |