docker에서 systemd / systemctl 사용 / docker 에서 systemd 사용법
docker 에서 systemd 를 사용
update:
- redhat/ubi8-init 이라는 docker image 가 있다. 이것을 이용하면 container 내에 systemd 가 자동으로 실행된다.
docker에서 systemd 가 없는 이유
systemd 는 CAP_SYS_ADMIN capability 를 필요로 한다. Docker 는 non privileged container 에서는 이 능력을 없앤버린다.
그리고 docker는 container 하나에 하나의 service를 실행하라고 한다.[ref. 3] 그러니 굳이 처음에 무엇인가를 더 실행하게 할 이유가 없다.
systemd 실행하기
요즘은 CAP_SYS_ADMIN 능력만 추가할 수 있다. 이것을 추가하고, cgroup file system 을 추가해줘야 한다. 이것은 현재 내 linux system 의 cgroup 을 mount 해주는 것으로 해결한다.
- CAP_SYS_ADMIN capability 추가
- cgroup file system 추가
RUN echo "nameserver 8.8.8.8" > /etc/resolv.conf
sudo sed -i -e "s|mirrorlist=|#mirrorlist=|g" -e "s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-Linux-*
dnf install -y systemd
sudo docker run -d -v /sys/fs/cgroup/:/sys/fs/cgroup:ro --cap-add SYS_ADMIN -p 8089:80 --name systemd_websrv centos /sbin/init
systemctl
일반적으로, container 를 실행할 때 init system 을 실행하지 않는다.[ref. 2]
systemctl 은 dbus를 이용해서 systemd 와 통신을 하는 process인데, 만약 dbus 나 systemd 를 실행하지 않으면, systemctl 은 동작하지 않는다.[ref. 2]
windows
/sys/fs/cgroup/
이 필요하기 때문에 wsl2 의 linux distro 내에서 docker를 실행해야 한다.
아래에서 전부 시도해봤지만 실패했다.
- WSL2, Ubuntu 20.04 : 실패
- WSL2, Ubuntu 18.04 : 실패
- WSL2, Debian10 : docker 를 start 하지 못해서 test 를 못해봤다.
- 이 글 에서 가능하다고 이야기 하는 듯 싶다.
References
- Running systemd within a Docker Container | Red Hat Developer, 2014
- Systemctl status is not working in my Docker container - General Discussions / General - Docker Community Forums
- Docker and systemd | The Startup
- Running Docker on WSL2 without Docker Desktop (the right way) - DEV Community
- [1.10] –cap-add=SYS_ADMIN change of behavior? · Issue #20082 · moby/moby · GitHub
- Systemd not starting - Failed to connect to bus: No such file or directory · Issue #18 · geerlingguy/docker-ubuntu2004-ansible · GitHub
댓글 없음:
댓글 쓰기