Intro

리눅스 서버를 다루다 보면 데몬과 서비스, 소켓이라는 용어를 자주 만날 수 있다. 예를 들면 docker의 daemon.json, mysql.socket, mysql.service 등. 각각이 무엇을 의미하는 것인지 알아보자.

데몬과 서비스

데몬(daemon)

멀티태스킹 운영체제에서 사용자가 직접 제어하지 않고 백그라운드에서 실행되면서 작업을 수행하는 프로그램 자체를 가리킨다. 주로 Unix/Linux 계열에서 사용하는 용어이다. 일반적으로 프로세스로 실행되며, 프로그램명 뒤에 데몬을 뜻하는 d 를 붙이기도 한다.(ex. syslogd)

보통 시스템이 시작될 때 함께 실행되며, 시스템 종료 시까지 계속 동작한다. 특정 사용자의 세션과 무관하게 동작하며 데몬 자체적으로 상태를 관리한다.

Daemon 은 도깨비나 유령을 뜻하는 단어에서 유래하였는데, 이는 사용자가 직접 신경쓰지 않아도 백그라운드에서 일을 처리해 주는 데몬의 역할과 딱 맞아 떨어진다.

예시 데몬 설명
syslogd 시스템 로그를 관리하는 데몬
crond 예약된 작업을 실행하는 데몬
httpd Apache 웹 서버 데몬
sshd SSH 데몬

서비스(Service)

데몬을 관리하고 제어하는 개념의 프로그램을 가리킨다. 서비스는 데몬을 포함하거나, 데몬처럼 백그라운드에서 실행되는 데몬 자체를 의미한다. 시스템 관리 도구(systemd, init, upstart 등)에 의해 관리되며, 이러한 도구를 통해 서비스의 시작, 중지, 재시작, 상태 확인 등이 이뤄진다.

서비스 관리 도구는 서비스의 상태를 추적하고, 서비스가 중단되었을 때 재시작하는 등의 작업을 자동으로 수행할 수 있다.

이와는 별개로 마이크로소프트 윈도우에서 데몬과 같이 백그라운드에서 실행되며 작업을 수행하는 프로그램 자체를 서비스라고 지칭한다.

예시 서비스 설명
httpd.service Apache 웹 서버 서비스
sshd.service SSH 데몬 서비스
docker.service 도커 서비스

종합

데몬은 백그라운드에서 특정 작업을 수행하는 프로그램 자체를 가리키며, 서비스는 데몬을 포함하여 백그라운드에서 실행되며 시스템 관리 도구에 의해 관리되는 프로그램을 가리킨다.

또한 데몬은 자체적으로 상태를 관리하며, 문제 발생 시 자동으로 재시작되지 않을 수 있으나, 서비스는 관리 도구가 상태를 관리하며 문제가 발생하면 자동으로 재시작될 수 있다.

소켓(socket)

네크워크 통신의 종단점(가장 끝이 되는 지점)을 뜻한다. 두 시스템 간 네트워크 통신을 가능하게 하는 소프트웨어 인터페이스. Unix/Linux에서 소켓은 클라이언트와 데몬이 안전하고 효율적으로 통신할 수 있도록 도와주는 도구로 볼 수 있다.

사용자 -> 클라이언트 -> 소켓 -> 데몬

예를 들어 Docker 프로그램에는 docker.socket 이라는 소켓인 존재한다. 이는 Docker 데몬과 클라이언트 간 IPC를 처리하며 통신을 관리하는 데 사용된다. 소켓은 /var/run/docker.socket 파일로 존재하며, 클라이언트가 Docker 명령을 실행하면 이 명령은 docker.socket을 통해 Docker 데몬으로 전달된다. 그리고 실행 결과는 다시 docker.socket을 통해 클라이언트에게 전달된다.

여기서 생기는 의문. 왜 소켓을 클라이언트와 데몬 중간에 놓는 걸까? 클라이언트와 데몬이 직접 통신하게끔 해도 되지 않을까? 소켓을 두는 이유를 알아보자.

통신의 표준화

소켓은 운영 체제 간의 통신을 추상화한 표준화된 인터페이스를 제공한다. 그래서 클라이언트와 데몬이 동일한 호스트에 있을 때에도,다른 호스트에서 네트워크를 통해 연결되어 작업을 할 때에도 관계없이 동일한 방식으로 통신할 수 있다.

쉽게 말해 클라이언트와 데몬이 서로통신하는 방법이 정해져 있기 때문에, 통신의 상황이나 복잡한 세부사항을 신경 쓰지 않아도 쉽게 작업을 처리할 수 있다는 것이다.

확장성 및 관리 용이성

소켓을 사용하면 여러 프로그램이 동시에 데몬과 대화할 수 있다는 장점이 있다.

보안

소켓 파일은 보안 장치의 역할도 하는데, 허용된 사용자(소켓 파일에 접근할 수 있는 사용자)만이 소켓 파일을 통해 데몬과 통신할 수 있게 접근 제어를 한다. 이를 통해 데몬이 직접 네트워크에 노출되지 않도록 하여, 네트워크 기반의 공격 표면을 줄이는 데 도움이 된다.

IPC (프로세스 간 통신)

Unix 도메인 소켓은 동일 호스트 내에서의 프로세스 간 통신에 효율적이다. 네트워크를 거치지 않아 더 빠르고, 컴퓨팅 자원도 덜 쓴다는 장점이 있다. 또한 다양한 프로그래밍 언어와 라이브러리에서 표준화된 방식으로 IPC를 구현할 수도 있다.

추가 - 클라이언트를 따로 두는 이유는?

명확한 역할 분담

클라이언트와 데몬 간의 책임을 명확히 분리할 수 있다는 장점이 있다. 클라이언트는 명령을 보내고 결과를 받것과 관련한 작업만 처리하며, 데몬은 실제로 명령을 처리하는 역할을 담당한다.

이는 프로그래밍에서 볼 수 있는 모듈화와 비슷하다고 할 수 있다. 이러한 모듈화된 구조는 시스템 설계를 쉽게 하고, 각각의 컴포넌트를 독립적으로 개발할 수 있어 유지보수와 테스트, 배포가 용이하다.

예시: 도커(Docker)

1
2
3
4
5
6
7
8
9
10
11
# 설치 시 (구성 요소)
docker-ce      # 도커 소프트웨어 패키지. 엔진 포함.
docker-cli     # 클라이언트.사용자와 데몬 중간에서 통신.
containerd.io  # 컨테이너 런타임. 컨테이너의 라이프사이클을 관리.

# 서비스 관리
docker.service  # 도커 데몬을 관리하는 서비스 유닛 파일. 데몬을 시작, 중지, 재시작하는 역할.
docker.socket   # 데몬과 클라이언트 간 통신을 관리하는 소켓 유닛 파일.

# 설정 파일
/etc/docker/daemon.json. # 도커 데몬의 다양한 설정 지정.

Reference

데몬 :[https://ko.m.wikipedia.org](https://ko.m.wikipedia.org/wiki/%EB%8D%B0%EB%AA%AC_(%EC%BB%B4%ED%93%A8%ED%8C%85)
데몬과 서비스 : https://velog.io/@my8za
Red Hat Doc : https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/
Ubuntu Doc : https://help.ubuntu.com/
Unix domain socket : https://en.wikipedia.org/wiki/Unix_domain_socket