Linux에서는 SIGTERM 신호를 보내면 프로세스가 종료 절차를 수행하고,
만약 종료되지 않았다면 사용자가 직접 SIGKILL 신호를 보내서 강제 종료 시켜야 한다.
리눅스와 달리 도커에서는 SIGTERM 신호 또한 강제 종료를 시킨다.
때문에 graceful shutdown 할 수 있게 세팅하는 것이 좋다.
1. Docker Container 종료 개념
1-1. SIGKILL : 즉시 강제 종료
1-2. SIGTERM : 10초 대기 후 프로세스가 종료되지 않으면, SIGKILL 신호를 보내 강제 종료
2. Docker container Graceful shutdown
1-1. graceful shutdown 이란
➡️ 서비스가 종료될 때 현재 처리 중인 요청을 마무리하고 리소스를 적절하게 해제하여 서비스 중단을 부드럽게 처리하는 것
1-2. 서버 객체 반환
변경 전
const start = async () => {
const client = redis.createClient({ url: REDIS_URL });
await client.connect();
const app = createApp(client);
app.listen(PORT, () => {
console.log(`Start at port ${PORT}`);
});
};
start();
변경 후
const start = async () => {
const client = redis.createClient({ url: REDIS_URL });
await client.connect();
const app = createApp(client);
const server = app.listen(PORT, () => {
console.log(`Start at port ${PORT}`);
});
return server;
};
const server = start();
1-3. 서버 안전하게 종료하는 함수 추가
- server.close([callback])
- 정의: 서버나 스트림을 종료하는 함수로, Node.js의 HTTP 서버 객체나 기타 스트림 객체에서 사용됨.
- 매개변수
- callback(선택): 서버가 종료된 후 호출할 콜백 함수
- callback(선택): 서버가 종료된 후 호출할 콜백 함수
- process.exit([code])
- 정의: Node.js 프로세스 종료 함수
- 매개변수
- code(선택): 종료 코드. 기본값은 0이고, 정상 종료를 의미함.
- 동작
- 이벤트 루프 즉시 종료
- 프로세스는 주어진 종료 코드로 종료됨.
- 열려 있는 모든 I/O 작업 즉시 중단
const gs = async () => {
const _server = await server;
_server.close(() => {
console.log("docker container graceful shutdown");
process.exit();
});
}
➡️ 새로운 연결을 중지하고, 현재 처리 중인 요청이 완료될 때까지 기다린 후 서버를 종료
1-4. 신호 처리기 설정
- process.on(event, listener)
- 정의: Node.js 프로세스 객체에서 이벤트를 수신하기 위해 리스너를 등록하는 함수
- 매개변수
- event: 수신할 이벤트 이름 ex) exit, SIGTERM, SIGINT, uncaughtException
- listener: 이벤트 발생 시 호출할 콜백 함수
process.on('SIGTERM', gs);
process.on('SIGINT', gs);
'자율 학습 > 스터디' 카테고리의 다른 글
| [LeetCode] 933. Number of Recent Calls (0) | 2025.03.11 |
|---|---|
| [LeetCode] 735. Asteroid Collision 문제 풀이 (0) | 2025.03.11 |
| [Docker] Dockerfile COPY 개선 (0) | 2024.06.23 |
| [Docker, Redis] 애플리케이션 도커 이미지 만들기 (host.docker.internal) (0) | 2024.06.23 |
| [Docker] dockerfile 작성해서 도커 image 만들기 (커스텀 이미지) (0) | 2024.06.20 |