본문 바로가기

리눅스

[draft] CentOS 8 Docker 컨테이너에서 systemctl 사용하기

CentOS 8 Docker 컨테이너에서 systemctl 사용하기(/sbin/init)

일반적으로 Docker 컨테이너 내부에서는 systemctl 명령이 정상적으로 동작하지 않습니다. 그 이유는 컨테이너가 systemd(init 시스템) 를 기본으로 실행하지 않기 때문입니다.

하지만 CentOS 8 컨테이너를 systemd 기반으로 실행하면 컨테이너 내부에서도 systemctl을 사용할 수 있습니다.

테스트 환경

운영체제 정보

$ cat /etc/redhat-release 
CentOS Linux release 7.9.2009 (Core)
Host OS는 CentOS 7이지만 컨테이너 이미지는 CentOS 8 입니다.

1. systemd를 사용하는 CentOS 8 컨테이너 실행

Docker 컨테이너 실행

docker run -it -d \
  --name centos8 \
  --privileged \
  --cap-add=SYS_ADMIN \
  centos:8 /sbin/init
  • --privileged : systemd 동작에 필요한 권한 부여
  • --cap-add=SYS_ADMIN : systemctl 사용을 위한 capability
  • /sbin/init : systemd(PID 1) 실행

2. 컨테이너 실행 확인

docker ps -a
CONTAINER ID   IMAGE      COMMAND        CREATED          STATUS          PORTS     NAMES
8ec200c2c626   centos:8   "/sbin/init"   14 seconds ago   Up 10 seconds             centos8

3. 컨테이너 내부 진입 및 systemctl 확인

컨테이너 접속

docker exec -it centos8 bash

systemctl 상태 확인

systemctl status
● 8ec200c2c626
    State: running
     Jobs: 0 queued
   Failed: 0 units
    Since: Wed 2023-01-18 00:17:23 UTC; 1min 0s ago
   CGroup: /docker/8ec200c2c626b5f67898a0d4e6ff358bcfbdd12ef43ad026ed65b9297b7b7b85
           ├─system.slice
           │ ├─dbus.service
           │ │ └─48 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
           │ ├─systemd-udevd.service
           │ │ └─34 /usr/lib/systemd/systemd-udevd
           │ └─systemd-journald.service
           │   └─21 /usr/lib/systemd/systemd-journald
           └─init.scope
             └─1 /sbin/init
PID 1이 /sbin/init이며 systemd가 정상적으로 동작 중인 상태입니다.

4. 서비스 관리 예시

컨테이너 내부에서 일반 서버처럼 서비스 제어가 가능합니다.

systemctl start sshd
systemctl enable sshd
systemctl status sshd