docker

Rootless 컨테이너 운영 필수 설정:Linger 활성화

JohnnyDeveloper 2026. 1. 19. 15:31
Rootless 컨테이너 운영 필수 설정: Linger 활성화

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 컨테이너 운영 전 필수 확인사항

  1. Linger 활성화 확인
    loginctl show-user ubuntu | grep Linger
    # 출력: Linger=yes ← 필수!
  2. user@UID.service 실행 확인
    systemctl status user@$(id -u ubuntu).service
    # Active: active (running) ← 확인
  3. 컨테이너 restart 정책 설정
    podman run -d --restart=always nginx
    # 또는
    docker run -d --restart=always nginx
  4. SSH 종료 후 재접속 테스트
    # 컨테이너 실행 → SSH 종료 → 5분 대기 → 재접속 → 컨테이너 확인

정리

항목 내용
문제 SSH 세션 종료 시 rootless 컨테이너 전체 종료
원인 Linger=no (기본값)로 인해 사용자 세션 종료 시 user@UID.service 종료
해결 sudo loginctl enable-linger ubuntu
효과 SSH 로그아웃과 무관하게 컨테이너 계속 실행
검증 loginctl show-user ubuntu | grep LingerLinger=yes 확인
필수 여부 ❗ 프로덕션 환경에서 rootless 컨테이너 사용 시 필수
이제 안전합니다

Linger를 활성화하면 SSH 세션 종료와 무관하게 rootless 컨테이너가 안정적으로 실행됩니다. 프로덕션 환경에서 필수적인 설정이므로, rootless 컨테이너를 운영하는 모든 서버에서 반드시 설정하세요.

⚡ 핵심 요약

  • Rootless 컨테이너 = 사용자 세션에 종속
  • Linger=no (기본값) = SSH 종료 시 컨테이너 종료
  • sudo loginctl enable-linger ubuntu = 필수 설정
  • 프로덕션에서 rootless 컨테이너 쓴다면 Linger는 필수!