Profile picture

[Docker] systemctl 명령어가 가능한 ubuntu 컨테이너 만들기

JaehyoJJAng2023년 06월 03일

▶︎ 개요

Docker로 Ubuntu 서버를 띄워보자.


‣ Image 내려받기

docker pull ubuntu:latest

‣ systemctl 해결하기

Docker를 통해 Ubuntu나, CentOS와 같은 리눅스 컨테이너를 생성하게 되면

기본적으로 systemctl 명령어 사용이 불가능하다.

Docker 컨테이너는 격리된 환경에서 실행 되므로 호스트 시스템 데몬에 직접적인 접근이 불가능하다.

또한 컨테이너는 보안을 강화하기 위해 격리되어 있으며, 호스트 시스템에 대한 액세스를 제한해야 하는데

systemctl을 통해 시스템 데몬을 조작하게 되면 보안상의 위험이 초래할 수 있기 때문이다.

위 부분을 해결해야 추후 Docker Container가 재기동 되더라도 해당 service가 자동으로 기동되게 만들 수 있기 때문에 systemctl이 먹히지 않는 문제를 해결해보려 한다.


먼저 Dockerfile을 만들어 작업해보자.

Dockerfile

FROM ubuntu:22.04

ENV TZ=Asia/Seoul
ENV container docker

RUN sed -i 's/kr.archive.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list
RUN apt-get update && apt-get upgrade -y \
&& apt install -y init systemd \
&& apt install -y build-essential \
&& apt install -y net-tools iputils-ping \
&& apt-get autoremove -y \
&& rm -rf var/lib/{apt,dpkg,cache,log}

VOLUME [ "/sys/fs/cgroup" ]
CMD [ "/sbin/init" ]

  • FROM
    • Build 기반이 될 이미지 정의
  • ENV
    • 컨테이너 내부 환경변수 정의
  • RUN
    • 명령어 실행
  • VOLUME
    • Docker host에 있는 해당하는 경로의 directory를 mapping

Dockerfile에 권한을 아래와 같이 부여

chmod -R 774 Dockerfile

위 Dockerfile을 기반으로 이미지 빌드

docker build --tag yshrim12/ubuntu-systemctl .

우분투 컨테이너 생성

docker run -d -it --name ubuntu \
--privileged=true \
yshrim12/ubuntu-systemctl \
/sbin/init

여기서 참고할 만한 것은 systemd의 경우 CAP_SYS_ADMIN capability가 필요하지만

docker의 non privileged container는 보안 문제로 인해 CAP_SYS_ADMIN_capability가 없다는 점이다.

또한 privileged container는 비 권장사항이기도 하다.

systemd의 경우 cgroup File을 필요로 하기 때문에 위와 같이 -v /sys/fs/cgroup:/sys/fs/cgroup:ro를 통해 Docker host의 cgroup을 mapping 해주고, 컨테이너 내부에서 파일 수정이 불가능하도록 Read-Only로 마운트 해주었다.


‣ 실행 결과

생성된 컨테이너 내부로 진입해보자.

docker exec -it ubuntu /bin/bash
root@4c8961e462d9:/# systemctl

image
systemctl 명령이 정상적으로 먹히고 있는 것을 볼 수 있다.

이제 이 이미지를 조금씩 수정해서 여러 애플리케이션용으로 빌드해주면 될 것 같다.


Loading script...