본문 바로가기

리눅스

우분투에서 Docker 컨테이너 내에서 systemd를 실행하는 방법

728x90

우분투에서 Docker 컨테이너 내에서 systemd를 실행하는 방법

Docker 컨테이너 내에서 systemd를 실행하는 것은 기본적으로 권장되지 않지만 가능합니다. systemd를 사용하려면 컨테이너가 호스트의 init 프로세스로 설정되어야 합니다.

Dockerfile 작성

vim Dockerfile
FROM ubuntu:22.04

# systemd를 사용할 수 있도록 환경 변수 설정
ENV container docker

# 패키지 설치 및 설정
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
    systemd \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

# systemd가 의존하는 디렉토리 생성
RUN mkdir -p /run/systemd && \
    rm -f /sbin/init

# 컨테이너 실행 시 systemd를 시작하는 명령
CMD ["/lib/systemd/systemd"]

이미지 빌드

docker build -t ubuntu-systemd .

컨테이너 실행

docker run -d --privileged --name my_container ubuntu-systemd

여기서 --privileged 플래그는 컨테이너에 호스트의 전체 권한을 부여하므로 보안에 주의해야 합니다. 가능한 경우 이 옵션을 최소화하여 필요한 권한만 부여하는 것이 좋습니다.

컨테이너 내에서 systemd 사용

docker exec -it my_container /bin/bash

이제 컨테이너 내에서 systemd를 사용할 수 있습니다.

systemd 서비스 확인

systemctl status

 

그러나 이러한 방법은 일반적으로 권장되지 않습니다. Docker는 프로세스 기반의 컨테이너를 지향하므로 systemd를 실행하는 것은 Docker의 철학과 어긋날 수 있습니다. 가능한 경우 Docker 컨테이너에서 실행해야 하는 서비스를 직접 구성하여 프로세스로 실행하는 것이 더 나은 방법입니다.

728x90

빌드된 도커 이미지 사용하기

docker pull anti1346/ubuntu-systemd:latest
docker run -d --privileged -p 2222:22 --name ubuntu-systemd --hostname ubuntu-systemd anti1346/ubuntu-systemd:latest
  • docker run : Docker 컨테이너를 실행하는 명령어입니다.
  • -d : 컨테이너를 백그라운드에서 실행합니다.
  • --privileged : 컨테이너에 호스트의 전체 권한을 부여합니다. 이것은 보안 측면에서 주의해야 할 부분입니다. 가능하면 최소한의 권한만 부여하는 것이 좋습니다.
  • -p 2222:22 : 호스트의 2222 포트를 컨테이너의 22 포트로 포트 포워딩합니다. 이것은 호스트의 2222 포트를 통해 SSH에 접속할 수 있도록 합니다.
  • --name ubuntu-systemd : 컨테이너에 ubuntu-systemd라는 이름을 지정합니다.
  • --hostname ubuntu-systemd : 컨테이너의 호스트네임을 ubuntu-systemd로 설정합니다.
  • anti1346/ubuntu-systemd:latest : 실행할 이미지의 이름과 버전을 지정합니다. 이 경우 anti1346/ubuntu-systemd 레포지토리에서 가장 최신 버전의 이미지를 사용합니다.
docker exec -it ubuntu-systemd bash
  • docker exec : Docker 컨테이너 내에서 특정한 명령어를 실행하는데 사용됩니다.
  • -it : 이 옵션은 명령을 대화형으로 실행하고 터미널을 통해 입력 및 출력을 할 수 있도록 합니다. -i는 표준 입력(standard input)을 유지하고 -t는 유사 터미널(pseudo-TTY)을 할당합니다.
  • ubuntu-systemd : 실행 중인 컨테이너의 이름이나 ID입니다. 이 경우 ubuntu-systemd라는 이름의 컨테이너에 대해 작업을 수행합니다.
  • bash : 컨테이너 내에서 실행할 명령어입니다. 이 경우 bash 셸을 실행하여 사용자가 컨테이너 내에서 대화형으로 작업할 수 있도록 합니다.
root@ubuntu-systemd:/$ systemctl status
● ubuntu-systemd
    State: running
     Jobs: 0 queued
   Failed: 0 units
    Since: Fri 2024-03-22 09:25:49 KST; 20min ago
   CGroup: /
           ├─init.scope 
           │ ├─  1 /lib/systemd/systemd
           │ ├─288 bash
           │ ├─298 systemctl status
           │ └─299 (pager)
           └─system.slice 
             ├─systemd-journald.service 
             │ └─23 /lib/systemd/systemd-journald
             ├─ssh.service 
             │ └─47 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
             ├─systemd-resolved.service 
             │ └─36 /lib/systemd/systemd-resolved
             └─system-getty.slice 
               ├─getty@tty6.service 
               │ └─59 /sbin/agetty -o -p -- \u --noclear tty6 linux
               ├─getty@tty1.service 
               │ └─42 /sbin/agetty -o -p -- \u --noclear tty1 linux
               ├─getty@tty3.service 
               │ └─57 /sbin/agetty -o -p -- \u --noclear tty3 linux
               ├─getty@tty5.service 
               │ └─62 /sbin/agetty -o -p -- \u --noclear tty5 linux
               ├─getty@tty2.service 
               │ └─56 /sbin/agetty -o -p -- \u --noclear tty2 linux
               └─getty@tty4.service 
                 └─58 /sbin/agetty -o -p -- \u --noclear tty4 linux

 

참고URL

- github : https://github.com/anti1346/ubuntu-systemd

 

728x90