▶︎ 개요
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
systemctl
명령이 정상적으로 먹히고 있는 것을 볼 수 있다.
이제 이 이미지를 조금씩 수정해서 여러 애플리케이션용으로 빌드해주면 될 것 같다.