Redis의 deamonize 옵션은 기본적으로 꺼져 있는데, 이를 키게 되면 Redis를 데몬 프로세스로 실행하게 된다.
데몬은 사용자가 제어하는 것이 아닌 백그라운드에서 돌면서 여러 작업을 하는 프로그램을 말한다. 일반적으로 데몬은 프로세스로 실행하지만, 부모 프로세스를 가지지 않으며 보통 포크를 통해 자식 프로세스가 만들어지고 이후 부모 프로세스를 죽이는 과정을 통해 자식 프로세스가 부모 프로세스가 되는 과정을 거치도록 한다. 이러한 방법을 fork off and die라고 한다.
시스템은 시동할 때 데몬을 시작하는 경우가 많으며, 이러한 데몬들은 네트워크 요청, 하드웨어 동작, 여타 프로그램에 반응하는 기능을 담당하게 된다.
데몬을 만드려면 보통 다음과 같은 과정을 거친다.
- 프로세스를 제어하고 있는 터미널로부터 분리한다. (fork 호출, 부모 프로세스는 exit 호출)
- 프로세스를 세션 리더로 만든다.
- 프로세스를 프로세스 그룹의 리더로 만든다. (setsid() 호출)
- (한 번이나 두 번) 포크한 뒤 프로세스를 종료하여 자식 프로세스가 백그라운드에 남게 한다. 하지만 부모 프로세스를 종료하지 않고 일반적인 작업을 수행할 수도 있다.
- 루트 디렉터리(”/”)를 현재 작업 디렉터리로 만든다.
- umask를 0으로 변경해서 호출한 쪽의 umask와 상관 없이 open(), creat() 등의 호출을 수행할 수 있도록 한다.(umask(0) 호출)
- 상속받았으며, 부모 프로세스가 열고 있는 파일들을 자식 프로세스에서 모두 닫는다. 여기에서 0, 1, 2번 파일 서술자도 포함한다.
- 로그 파일이나 콘솔 또는 /dev/null을 stdin, stdout, stderr로 설정한다.
결과적으로 데몬의 실행 과정은 부모의 프로세스를 종료하고 자식 프로세스가 부모 프로세스의 위치를 차지하게 되는 과정을 거친다. 그 과정에서 부모 프로세스가 죽는다면, 컨테이너는 PID 1 프로세스(부모 프로세스)의 활동이 끝났다고 간주하고 컨테이너를 종료시킨다.

여기 보면 호스트 머신에서 컨테이너를 프로세스로 인식하고 있기 때문에 PID 1 = 호스트 머신에서는 다른 프로세스 번호가 된다. 그렇기에 PID 1 프로세스가 종료되면 컨테이너가 종료되는 것이다.
그렇기 때문에 Redis 컨테이너는 deamonize 옵션을 꺼야 한다.
실제로 테스트 해봤다.


실제로 conf 파일을 활용해서 dammonize 옵션을 키고 실행하면 redis container가 실행 후 정상적으로 종료 exited(0)을 내뱉는 것을 확인할 수 있다.

참고 자료
👩💻 프로세스 / 데몬 / 서비스 차이 한방 정리
프로세스 (Process) 프로세스는 메모리에 적재되어 CPU에 의해 실행되는 컴퓨터 프로그램을 지칭한다. 각 프로세스는 고유한 프로세스 ID(PID)를 가지며, 운영체제는 프로세스 간의 자원 공유를 관리
inpa.tistory.com
데몬 (컴퓨팅) - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 리눅스 데스크톱 환경의 구성 요소 중 일부는 데몬이며, 여기에는 D-Bus, 네트워크매니저 (이른바 unetwork), 펄스오디오 (usound), Avahi가 포함된다. 멀티태스킹 운영
ko.wikipedia.org
Why Redis in Docker need set daemonize to no?
I run my Docker container as below cmd, but the container can't work. When I change the config daemonize yes to daemonize no in redis-6379.conf, it works! Who can tell me why? ➜ ls 6379.log docker-
stackoverflow.com