Docker 에서 systemctl이 실행이 안되는 이유와 해결 방법

Ja L·2024년 6월 15일
0

docker

목록 보기
5/5

Docker에서 systemctl 수행 불가 상황

docker pull rockylinux:8.9 
docker ps -a 

docker run --name pg15 -it -d -p 1122:22 5432:5432 rockylinux:8.9 bash
docker exec -it pg15 bash

(중략)

[root@204b0624983f /]# systemctl start postgresql-15
System has not been booted with systemd as init system (PID 1). Can't operate. Failed to connect to bus: Host is down

원인이 뭘까?

Docker 환경에서 'systemctl'을 사용하려고 할 때 발생하는 에러는 주로 Docker 컨테이너가 기본적으로 시스템 서비스 관리자를 포함하지 않기 때문에 발생합니다. 일반적으로 Docker 컨테이너는 단일 프로세스를 실행하도록 설계되어 있으며, 'systemd'와 같은 서비스 관리자는 포함되지 않습니다. 'systemctl'은 'systemd'를 사용하여 시스템 서비스를 제어하는 명령어입니다. 따라서 'systemd'가 없는 환경에서는 'systemctl'이 작동하지 않습니다.

systemd는 뭘까?
현대 리눅스 배포판에서 사용되는 시스템 및 서비스 관리자입니다. 주요 명령어로는 'systemctl', 'journalctl', 'systemd-analyze' 등이 있습니다. 현대 리눅스 시스템에서 중요한 구성 요소로 자리잡고 있으며, 시스템 관리의 효율성과 유연성을 크게 향상시킵니다.


해결

docker run --name pg15_1 -it -d -p 1122:22 --privileged=true --network pg-network pg_15_2 /sbin/init

📌 Key point
1. --privileged=true
2. /sbin/init

두 가지 옵션, 즉 'privileged=true'와 '/sbin/init'를 사용하면 이 문제를 해결할 수 있습니다. 이 두가지 옵션의 역할은 다음과 같습니다.

  1. 'privileged=true' 옵션
  • 역할: 이 옵션을 사용하면 컨테이너가 호스트 시스템의 모든 장치에 접근할 수 있는 권한을 가지게 됩니다. 기본적으로 Docker 컨테이너는 격리된 환경에서 실행되며 제한된 권한을 가집니다. 그러나 --privileged 플래그를 설정하면 컨테이너는 더 많은 권한을 가지게 되어 호스트 시스템의 다양한 리소스에 접근할 수 있습니다.
  • 효과: 이를 통해 systemd가 정상적으로 작동하는데 필요한 다양한 시스템 자원에 접근할 수 있게 되어, 컨테이너 내에서 systemctl을 사용할 수 있습니다.
  1. '/sbin/init' 옵션
  • 역할: 이 옵션은 컨테이너의 PID 1 프로세스로 '/sbin/init' (즉, 'systemd')을 설정합니다. Docker 컨테이너는 기본적으로 명령어나 스크립트를 실행할 수 있지만, 'systemd'와 같은 init 시스템을 실행하지 않습니다. 이 옵션을 사용하면 컨테이너가 실행될 때 'systemd'가 시작됩니다.
  • 효과: 이를 통해 컨테이너 내에서 'systemd'가 프로세스 및 서비스 관리를 담당하게 되어 'systemctl' 명령어를 사용할 수 있게 됩니다.
profile
DB Engineer

0개의 댓글