[컴] docker 에서 systemd 를 사용

 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

  1. Running systemd within a Docker Container | Red Hat Developer, 2014
  2. Systemctl status is not working in my Docker container - General Discussions / General - Docker Community Forums
  3. Docker and systemd | The Startup
  4. Running Docker on WSL2 without Docker Desktop (the right way) - DEV Community
  5. [1.10] –cap-add=SYS_ADMIN change of behavior? · Issue #20082 · moby/moby · GitHub
  6. Systemd not starting - Failed to connect to bus: No such file or directory · Issue #18 · geerlingguy/docker-ubuntu2004-ansible · GitHub

댓글 없음:

댓글 쓰기