Arch Linux Docker 컨테이너에서 systemd 서비스를 실행하는 방법은 무엇입니까?

Arch Linux Docker 컨테이너에서 systemd 서비스를 실행하는 방법은 무엇입니까?

Docker 컨테이너에서 systemd 서비스를 실행할 수 있는 다양한 방법이 있는 것으로 보입니다. 최신 예는 다음과 같습니다.직접적인 제안--volume=/sys/fs/cgroup:/sys/fs/cgroup:ro --cap-add=SYS_ADMIN --security-opt=seccomp:unconfined그러나 여전히 .실패하다:

오류: 서비스를 시작할 수 없습니다. [ntpd]: '/usr/sbin/systemctl start ntpd' 실행 중 1이 반환되었습니다. 버스에 연결할 수 없습니다. 해당 파일이나 디렉터리가 없습니다.

최신 Arch Linux 배포판이 포함된 docker 1.12.1 컨테이너의 systemd 231에서 간단한 서비스를 실행하려면 최소한 무엇을 해야 합니까?

답변1

systemd가 필요한 Ansible 플레이북을 테스트하는 동안 동일한 문제가 발생했습니다. 말씀하신 대로 컨테이너를 시작하고 종료하는 것이 가상 머신보다 훨씬 쉽기 때문에 docker가 가장 좋은 방법인 것 같습니다.
첫 번째기본/아치리눅스이미지는 더 이상 사용되지 않습니다. 사용해야 합니다.아치리눅스/베이스대신에. 그런 다음 완전히 권한 없이 systemd를 실행하려면 몇 가지 작업을 수행해야 합니다.

  • container=systemd가 하드웨어 시스템을 부팅할 때 일반적으로 수행하는 많은 작업을 수행하려고 시도하지 않도록 변수를 제공하십시오 .
  • systemd는 cgroup을 적극적으로 사용하므로 /sys/fs/cgroup호스트에서 파일 시스템을 바인드 마운트합니다.
  • /sys/fs/fuse번들 설치가 필요하지 않지만 퓨즈에 의존하는 소프트웨어 관련 문제를 방지하는 데 도움이 됩니다.
  • systemd는 어디서나 사용하는 것이 좋은 생각이라고 생각 하지만 권한이 없는 방식으로 실행하면 원하는 모든 곳에 tmpfs설치할 수 없으므로 에 미리 설치되어 있으며 ,tmpfstmpfs/tmp/run/run/lock
  • 마지막으로 컨테이너 내부에서 그래픽 항목을 실행하고 싶지 않기 때문에 sysinit.target기본 실행 단위로 지정하고 다른 것은 아무것도 지정하지 않아야 합니다.multi-user.target

결과 명령줄은 다음과 같습니다.

docker run \
  --entrypoint=/usr/lib/systemd/systemd \
  --env container=docker \
  --mount type=bind,source=/sys/fs/cgroup,target=/sys/fs/cgroup \
  --mount type=bind,source=/sys/fs/fuse,target=/sys/fs/fuse \
  --mount type=tmpfs,destination=/tmp \
  --mount type=tmpfs,destination=/run \
  --mount type=tmpfs,destination=/run/lock \
    archlinux/base --log-level=info --unit=sysinit.target

귀하의 예에서 ntpd와 같은 특정 서비스를 실행하는 것에 대해 이야기하는 경우 다음을 추가해야 합니다.

--cap-add=SYS_TIME

그렇지 않으면 ntpd아무도 컨테이너의 기본값을 시스템 시간으로 설정하기를 원하지 않기 때문에 권한이 거부되어 실패하게 됩니다.

PS 저는 systemd가 어떻게 작동하는지 배우는 데 꽤 많은 시간을 보냈고 많은 OS 이미지에서 작동하도록 관리했습니다. 나는 기사에서 내 경험을 설명했습니다.도커 컨테이너에서 systemd 실행. 러시아어로 되어 있지만 Google 번역이 귀하의 브라우저에서 작동해야 한다고 생각합니다. 감사해요

관련 정보