cloud/question

Question <4> | Detach mode란?

yjlee06 2024. 11. 12. 22:53
반응형
-detach를 알기 전에

원격으로 리눅스에 붙거나 wsl을 사용하다 보면 터미널을 닫음과 동시에 해당 터미널에서 작동시켰던 프로세스까지 종료되는 경험을 하신 적이 있으신가요? 이러한 현상이 발생했던 이유는 터미널 세션에 속해있는 프로세스는 터미널이 종료됨과 동시에 종료 되도록 작동하기 때문이였습니다.

 터미널을 기준으로 돌아간다?

터미널에서 실행시킨 작업들은 터미널 종료 즉 세션이 끝나는 시점에 일괄 종료가 되어버립니다. 만약 터미널이 끝나더라도 작동할 수 있게 하고 싶을 때는 nohup와 &을 사용할 수 있습니다. 해당 옵션을 한 번에 사용한다면 세션이 종료되어도 host 프로세스가 종료될 때까지 백그라운드에서 돌아가도록 합니다. 이러한 방식은 docker의 detach옵션과 흡사하다고 볼 수 있겠습니다.

도커 투툐리얼에서도 대부분 사용되는 옵션 " --detach "

detach의 한글 뜻은 "분리"입니다. 쉽게 설명하자면 사용자와 컨테이너 간 연결성을 분리시키는 것과 같다고 볼 수 있습니다. detach는 nohup처럼 사용자가 터미널을 종료하더라도 백그라운드에서 작동하기에 영향을 받지 않습니다. 
 

하지만 이러한 상황에서는 오류가 발생합니다.

프로그램 자체적으로 백그라운드 작동이 필요할 땐 사용하면 오류를 발생할 수 있습니다. 대표적으로 nginx가 있습니다. 컨테이너는 활동이 없을 시 또는 루트 프로세스가 모두 종료되면 exit가 되도록 개발되었습니다. service nginx start를 실행한다면 루트 프로세스에서 작업을 진행 후 종료됩니다. 이때 백그라운드 프로세스가 생성되었을지라도 컨테이너 입장에서는 모든 루트 프로세스가 종료되었기에 컨테이너를 exit 시키게 됩니다. 
 

그러면 어떻게 해야 할까?
docker run -d -p 80:80 my_image nginx -g 'daemon off;'

docker run 명령어 뒤에 -g 'daemon off'를 입력하면 nginx 서비스가 포그라운드에서 실행되므로 컨테이너가 종료되는 문제를 해결할 수 있습니다.