본문 바로가기

리눅스

도커 컨테이너에서 systemd를 실행하는 방법

728x90

도커 컨테이너에서 systemd를 실행하는 방법

기본적으로 Ubuntu의 Docker 이미지는 init 시스템이 없으며, systemd를 사용하지 않습니다. 이는 Ubuntu 컨테이너가 주로 단일 프로세스로 실행되도록 설계되어 있기 때문입니다.

만약 init 시스템을 사용하고 싶다면, systemd를 사용하는 Ubuntu 이미지를 선택해야 합니다. 하지만 이 방법은 보통 권장되지 않습니다. Docker 컨테이너는 단일 프로세스로 동작하는 것이 이상적이며, 여러 서비스를 동시에 관리하기 위해 컨테이너를 여러 개 실행하는 것이 일반적입니다.


systemd를 사용하는 Ubuntu Docker 이미지를 실행하려면 다음과 같이 하실 수 있습니다.

 

  • Docker Hub에서 systemd를 사용하는 Ubuntu 이미지를 다운로드합니다.
docker pull ghcr.io/linuxserver/ubuntu-systemd
  • 컨테이너를 실행하면서 init 시스템을 활성화합니다.
docker run -d --name my_ubuntu --cap-add SYS_ADMIN --security-opt seccomp:unconfined \
  -v /sys/fs/cgroup:/sys/fs/cgroup:ro ghcr.io/linuxserver/ubuntu-systemd
  • 컨테이너 내부로 들어갑니다.
docker exec -it my_ubuntu /bin/bash

이렇게 하면 /sbin/init 또는 systemctl을 사용하여 서비스를 관리할 수 있습니다.

728x90

Dockerfile을 사용하여 systemd를 사용하는 Ubuntu 컨테이너를 작성하는 방법

  • Dockerfile 생성
    • Dockerfile을 생성합니다.
# Ubuntu base 이미지 사용
FROM ubuntu:22.04

# DEBIAN 프런트엔드를 비대화식으로 설정
ARG DEBIAN_FRONTEND=noninteractive

ENV TZ=Asia/Seoul

# Ubuntu mirror를 Kakao로 변경
RUN sed -i 's/kr.archive.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list

# systemd를 설치하고 활성화
ENV container docker

RUN apt-get update \
  && apt-get install -y systemd \
  && apt-get install -y build-essential \
    tzdata \
    vim curl \
  && apt-get clean autoclean \
  && apt-get autoremove -y \
  && rm -rf /var/lib/{apt,dpkg,cache,log} \
  && apt-get update 

# systemd 초기화 시스템 활성화를 위한 설정
STOPSIGNAL SIGRTMIN+3
CMD ["/sbin/init"]
  • Docker 이미지 빌드
    • 다음 명령어를 사용하여 Docker 이미지를 빌드합니다.
docker build -t my_ubuntu_systemd .
  • Docker 컨테이너 실행
    • 이미지를 사용하여 Docker 컨테이너를 실행합니다.
docker run -d --name my_ubuntu_container --privileged my_ubuntu_systemd

위의 명령어로 systemd를 사용하는 Ubuntu 컨테이너가 실행됩니다.

 

주의할 점은 이 방법은 일반적인 상황에서는 권장되지 않습니다. 컨테이너는 보통 단일 프로세스로 실행하는 것이 이상적이며, 여러 서비스를 동시에 관리하기 위해 컨테이너를 여러 개 실행하는 것이 더 효율적입니다. 따라서 이렇게 systemd를 사용하는 방법은 특정 상황에서만 사용하는 것이 좋습니다.

 

728x90