●▲■ 개발일기

systemd가 뭔가요? 도커에서는 왜 systemd를 지원하지 않나요? 본문

👉 Linux

systemd가 뭔가요? 도커에서는 왜 systemd를 지원하지 않나요?

●▲■ PRINT 2025. 4. 4. 15:02

# systemd란?

systemd는 Linux 운영 체제에서 사용되는 시스템 및 서비스 관리자입니다. 2010년에 처음 소개되었으며, 현재 대부분의 주요 Linux 배포판에서 기본 init 시스템으로 채택되었습니다.

## systemd의 주요 기능

1. **부팅 프로세스 관리**: 시스템 부팅 시 필요한 서비스를 병렬로 시작하여 부팅 속도를 향상시킵니다.
2. **서비스 관리**: 시스템 서비스의 시작, 중지, 재시작 및 상태 모니터링을 담당합니다.
3. **의존성 관리**: 서비스 간의 의존성을 관리하여 올바른 순서로 시작되도록 합니다.
4. **로깅**: 시스템 및 서비스 로그를 수집하고 관리합니다(journald).
5. **소켓 활성화**: 필요할 때만 서비스를 시작하는 소켓 기반 활성화를 지원합니다.
6. **타이머**: cron과 유사한 예약 작업 기능을 제공합니다.
7. **마운트 관리**: 파일 시스템 마운트 포인트를 관리합니다.

# Docker에서 systemd를 지원하지 않는 이유

Docker는 systemd를 기본적으로 지원하지 않으며, 이에는 여러 이유가 있습니다:

## 1. 컨테이너 설계 철학

- **단일 프로세스 모델**: Docker 컨테이너는 기본적으로 단일 프로세스를 실행하도록 설계되었습니다. 하나의 애플리케이션이나 서비스만 실행하는 것이 권장됩니다.
- **경량화**: 컨테이너는 가능한 한 가볍게 유지되어야 하며, systemd와 같은 무거운 시스템 데몬은 이 철학에 맞지 않습니다.

## 2. 기술적 제약

- **특권 요구**: systemd는 많은 시스템 리소스와 특권에 접근해야 하는데, 이는 컨테이너의 격리 모델과 충돌합니다.
- **PID 네임스페이스**: systemd는 PID 1로 실행되어야 하며, 컨테이너 내부의 PID 네임스페이스와 호스트 시스템의 PID 네임스페이스 간의 복잡한 관계를 만듭니다.
- **cgroups 접근**: systemd는 cgroups에 대한 광범위한 접근이 필요하지만, 컨테이너는 제한된 cgroups 접근만 허용합니다.

## 3. 보안 고려사항

- **권한 상승**: systemd를 실행하려면 컨테이너에 추가 권한을 부여해야 하는데, 이는 보안 위험을 증가시킵니다.
- **공격 표면 확대**: 추가 서비스와 기능은 잠재적인 공격 표면을 넓힙니다.

## Docker에서 서비스 관리 대안

Docker 컨테이너에서는 다음과 같은 방법으로 서비스를 관리합니다:

1. **엔트리포인트 스크립트**: 여러 프로세스를 관리하기 위한 간단한 스크립트를 사용합니다.
2. **Supervisor, s6, runit**: 경량 프로세스 관리자를 사용하여 여러 프로세스를 관리합니다.
3. **Docker Compose**: 여러 컨테이너를 조율하여 복잡한 애플리케이션을 구성합니다.
4. **Kubernetes**: 대규모 컨테이너 오케스트레이션을 위한 솔루션을 사용합니다.

Docker의 설계 철학은 "한 컨테이너, 한 관심사"이므로, 여러 서비스가 필요한 경우 일반적으로 여러 컨테이너를 사용하는 것이 권장됩니다.