Rootless 컨테이너 운영 필수 설정:
Linger 활성화
SSH 세션 종료 시 컨테이너가 죽는 문제 완전 해결
필수 설정
systemd linger
프로덕션 안정성
실제 장애 사례
registry.string.biz 서버에 SSH로 접속해서 rootless Docker 컨테이너를 실행했습니다. 모든 게 정상 작동하는 것을 확인하고 SSH를 종료했는데, 5분 후 모든 컨테이너가 죽어있었습니다.
원인: Linger=no 설정으로 인해 SSH 세션 종료 시 사용자 프로세스 전체가 SIGTERM 받음
Phase 0: 사전 준비 (다운타임 없음)
0.1 Linger란?
Linger(지속)는 systemd의 기능으로, 사용자가 로그아웃해도 해당 사용자의 systemd 사용자 인스턴스를 계속 실행시키는 설정입니다.
비유로 이해하기
SSH로 서버에 접속하는 것은 "사무실에 출근"하는 것과 같습니다.
- Linger=no: 퇴근(SSH 종료)하면 자동으로 불이 꺼지고 모든 장비(컨테이너)가 꺼짐
- Linger=yes: 퇴근해도 사무실 불이 켜져 있고 장비(컨테이너)가 계속 작동
0.2 Rootless 컨테이너와 Linger의 관계
Rootless 컨테이너는 일반 사용자 권한으로 실행되기 때문에, systemd의 사용자 세션(user session)에 종속됩니다.
❌
Linger=no (기본값)
# SSH 접속
ssh ubuntu@registry.string.biz
podman run -d nginx
# SSH 종료
exit
# 5분 후...
# systemd가 사용자 세션 종료
# → 모든 rootless 컨테이너 SIGTERM 🔥
✅
Linger=yes
# SSH 접속
ssh ubuntu@registry.string.biz
podman run -d nginx
# SSH 종료
exit
# 5분 후, 1시간 후, 1주일 후...
# → 컨테이너 계속 실행 ✅
0.3 Linger 활성화 (필수!)
중요: 이 설정 없이는 프로덕션 운영 불가능
Linger를 활성화하지 않으면 SSH 세션이 끊어질 때마다 모든 rootless 컨테이너가 종료됩니다. 반드시 설정해야 합니다.
1
서버 접속
ssh registry.string.biz
# 또는
ssh ubuntu@registry.string.biz
2
현재 Linger 상태 확인
loginctl show-user ubuntu | grep Linger
# 출력 예시:
Linger=no ← 문제! 활성화 필요
3
Linger 활성화
sudo loginctl enable-linger ubuntu
# ubuntu = 사용자 이름
# 다른 사용자라면 해당 사용자명 입력
4
설정 확인
loginctl show-user ubuntu | grep Linger
# 출력 예시:
Linger=yes ← 성공! ✅
0.4 Linger 효과 비교
| 설정 | SSH 세션 종료 시 | 컨테이너 상태 | 프로덕션 사용 |
|---|---|---|---|
| Linger=no | 사용자 세션 종료 (5분 이내) | ❌ 모든 rootless 컨테이너 SIGTERM | ❌ 불가능 |
| Linger=yes | 사용자 세션 유지 | ✅ 컨테이너 계속 실행 | ✅ 필수 설정 |
검증: 실제로 작동하는지 테스트
시나리오 1: Linger=no (문제 재현)
# 1. Linger 비활성화 (테스트용)
sudo loginctl disable-linger ubuntu
# 2. 컨테이너 실행
podman run -d --name test-nginx nginx
# 3. 확인
podman ps
# CONTAINER ID IMAGE ...
# abc123def456 docker.io/library/nginx:latest ...
# 4. SSH 종료
exit
# 5분 후 다시 접속
ssh ubuntu@registry.string.biz
podman ps
# 출력:
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# (아무것도 안 나옴) ← 컨테이너 죽음! 🔥
시나리오 2: Linger=yes (정상 작동)
# 1. Linger 활성화
sudo loginctl enable-linger ubuntu
# 2. 컨테이너 실행
podman run -d --name test-nginx nginx
# 3. 확인
podman ps
# CONTAINER ID IMAGE ...
# abc123def456 docker.io/library/nginx:latest ...
# 4. SSH 종료
exit
# 5분 후, 1시간 후, 1주일 후 다시 접속
ssh ubuntu@registry.string.biz
podman ps
# 출력:
# CONTAINER ID IMAGE STATUS ...
# abc123def456 docker.io/library/nginx:latest Up 7 days ...
# ← 계속 실행 중! ✅
내부 동작 원리
systemd 사용자 세션의 생명주기
Linger=no (기본값) 흐름
1. SSH 로그인
→ systemd-logind가 사용자 세션 생성
→ user@1000.service 시작 (예: ubuntu 사용자 UID 1000)
2. 컨테이너 실행
→ podman이 user@1000.service 아래에서 실행
→ 컨테이너 프로세스도 user@1000.service의 자식 프로세스
3. SSH 로그아웃
→ 마지막 로그인 세션 종료
→ systemd-logind가 "사용자가 더 이상 로그인 안 함" 인식
→ user@1000.service에 SIGTERM 전송 (보통 5분 이내)
→ user@1000.service 종료
→ 모든 자식 프로세스(컨테이너 포함) 종료 🔥
Linger=yes 흐름
1. Linger 활성화
→ systemd가 부팅 시 user@1000.service 자동 시작
→ 로그인 여부와 무관하게 항상 실행 상태
2. SSH 로그인
→ 기존에 실행 중인 user@1000.service 재사용
3. 컨테이너 실행
→ podman이 user@1000.service 아래에서 실행
→ 컨테이너 프로세스도 user@1000.service의 자식 프로세스
4. SSH 로그아웃
→ 로그인 세션만 종료
→ user@1000.service는 계속 실행 (Linger 때문)
→ 컨테이너도 계속 실행 ✅
Linger 파일 위치
# Linger 활성화 시 생성되는 파일
ls -l /var/lib/systemd/linger/
# 출력 예시:
# -rw-r--r-- 1 root root 0 Jan 19 14:32 ubuntu
# 이 파일의 존재 여부로 Linger 활성화 판단
트러블슈팅
문제 1: "Linger를 활성화했는데도 컨테이너가 종료됨"
1
Linger 상태 재확인
loginctl show-user ubuntu | grep Linger
ls -l /var/lib/systemd/linger/ubuntu
2
사용자 서비스 상태 확인
systemctl --user status
# 또는
systemctl status user@$(id -u ubuntu).service
3
다른 원인 체크
컨테이너가 종료되는 다른 원인:
- 컨테이너 자체의 애플리케이션 크래시
- OOM (Out of Memory) Killer
- 디스크 용량 부족
podman system prune같은 정리 명령어 실행
문제 2: "여러 사용자의 Linger 설정"
# 모든 사용자의 Linger 상태 확인
loginctl list-users --no-pager
# 출력 예시:
# UID USER LINGER
# 1000 ubuntu yes
# 1001 alice no
# alice도 Linger 활성화
sudo loginctl enable-linger alice
문제 3: "Linger 비활성화 방법"
# Linger 비활성화 (테스트 완료 후 원복 시)
sudo loginctl disable-linger ubuntu
# 확인
loginctl show-user ubuntu | grep Linger
# Linger=no
경고: 프로덕션 환경에서는 비활성화 금지
실제 운영 중인 서버에서 Linger를 비활성화하면 모든 rootless 컨테이너가 다음 로그아웃 시 종료됩니다. 테스트 목적으로만 사용하세요.
실전 체크리스트
✅ Rootless 컨테이너 운영 전 필수 확인사항
- Linger 활성화 확인
loginctl show-user ubuntu | grep Linger # 출력: Linger=yes ← 필수! - user@UID.service 실행 확인
systemctl status user@$(id -u ubuntu).service # Active: active (running) ← 확인 - 컨테이너 restart 정책 설정
podman run -d --restart=always nginx # 또는 docker run -d --restart=always nginx - SSH 종료 후 재접속 테스트
# 컨테이너 실행 → SSH 종료 → 5분 대기 → 재접속 → 컨테이너 확인
정리
| 항목 | 내용 |
|---|---|
| 문제 | SSH 세션 종료 시 rootless 컨테이너 전체 종료 |
| 원인 | Linger=no (기본값)로 인해 사용자 세션 종료 시 user@UID.service 종료 |
| 해결 | sudo loginctl enable-linger ubuntu |
| 효과 | SSH 로그아웃과 무관하게 컨테이너 계속 실행 |
| 검증 | loginctl show-user ubuntu | grep Linger → Linger=yes 확인 |
| 필수 여부 | ❗ 프로덕션 환경에서 rootless 컨테이너 사용 시 필수 |
이제 안전합니다
Linger를 활성화하면 SSH 세션 종료와 무관하게 rootless 컨테이너가 안정적으로 실행됩니다. 프로덕션 환경에서 필수적인 설정이므로, rootless 컨테이너를 운영하는 모든 서버에서 반드시 설정하세요.
참고 자료
- systemd.exec(5) - https://www.freedesktop.org/software/systemd/man/systemd.exec.html
- loginctl(1) - https://www.freedesktop.org/software/systemd/man/loginctl.html
- Podman Rootless - https://docs.podman.io/en/latest/
⚡ 핵심 요약
- Rootless 컨테이너 = 사용자 세션에 종속
- Linger=no (기본값) = SSH 종료 시 컨테이너 종료
sudo loginctl enable-linger ubuntu= 필수 설정- 프로덕션에서 rootless 컨테이너 쓴다면 Linger는 필수!
'docker' 카테고리의 다른 글
| Rootful vs Rootless Podman네트워크 격리 문제 (0) | 2026.01.13 |
|---|---|
| Docker Compose 대안 (0) | 2026.01.13 |
| Podman vs Docker 2026 (0) | 2026.01.13 |
| Docker Registry v3 권한 제어: docker_auth + Casbin + JWT/JWK로 인증/인가 구현 (0) | 2026.01.12 |
| Podman과 Caddy로 구축하는 프라이빗 컨테이너 레지스트리: 완벽 가이드 (0) | 2025.12.09 |