centos docker container에서는 기본적으로 systemctl을 사용할 수 없다.
docker hub의 official centos image에 따르면, systemd가 포함은 되어있지만 default로 inactive하다.(centos:7 부터)
(systemctl은 systemd를 관리하는 명령어이다.)
hub.docker.com/_/centos/#Systemd_integration
systemd를 사용하기 위해서는 추가 작업이 필요하다.
해결방법
-
systemd를 사용할 수 있는 base 이미지 만들기
FROM centos:7 ENV container docker RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \ systemd-tmpfiles-setup.service ] || rm -f $i; done); \ rm -f /lib/systemd/system/multi-user.target.wants/*;\ rm -f /etc/systemd/system/*.wants/*;\ rm -f /lib/systemd/system/local-fs.target.wants/*; \ rm -f /lib/systemd/system/sockets.target.wants/*udev*; \ rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \ rm -f /lib/systemd/system/basic.target.wants/*;\ rm -f /lib/systemd/system/anaconda.target.wants/*; VOLUME [ "/sys/fs/cgroup" ] CMD ["/usr/sbin/init"]
-
위에서 만든 base 이미지를 바탕으로 이미지를 생성한다.
ex)FROM local/c7-systemd RUN yum -y install httpd; yum clean all; systemctl enable httpd.service EXPOSE 80 CMD ["/usr/sbin/init"]
-
docker run에서 cgroups mount
$ docker run -ti -v /sys/fs/cgroup:/sys/fs/cgroup:ro -p 80:80 <image name:tag>
- ubuntu를 사용한다면
-v /tmp/$(mktemp -d):/run
도 cgroup과 함께 추가해준다.
- ubuntu를 사용한다면
부가 설명
-
systemd는 CAP_SYS_ADMIN capability가 필요하지만 docker의 non previlieged container는 보안 문제로 CAP_SYS_ADMIN capability가 없다.
하지만 previleged container는 비권장 사항이다. -
또한, systemd는 cgroup 파일을 필요로하니, –v /sys/fs/cgroup:/sys/fs/cgroup:ro를 통해 read-only mode로 마운트한다.
-
systemd만을 사용하기 위해서
rm -rf <wants들>
를 이용해서 삭제한다.
참고 링크
developers.redhat.com/blog/2014/05/05/running-systemd-within-docker-container/
unix.stackexchange.com/a/490783
'linux, docker, kubernetes' 카테고리의 다른 글
Cgroup (0) | 2021.01.15 |
---|---|
apt vs apt-get 비교(APT, dpkg) (0) | 2021.01.10 |
linux remote ssh 접속 (0) | 2021.01.10 |