MacOS에서 systemd를 사용하는 Rocky Linux 컨테이너

MacOS에서 systemd를 사용하는 Rocky Linux 컨테이너

이 질문이 있는데 올바른 위치에서 질문하고 싶습니다. 그렇지 않은 경우 언제든지 안내해 주시기 바랍니다.

여러 Ansible 역할을 개발하고 있으며분자캐릭터를 테스트하기 위한 도구입니다. Molecule은 컨테이너를 차례로 사용하여 역할을 테스트합니다.

저는 RHEL 8 기반 운영 체제 전용 역할을 개발했습니다. Rocky Linux는 RHEL에 가장 가까운 운영 체제 중 하나이기 때문에 컨테이너의 운영 체제로 사용하기로 결정했습니다.

역할 내에는 systemd를 사용/활용하여 수행되는 작업이 있습니다. 그러나 컨테이너에는 기본적으로 systemd를 사용할 수 없습니다. 실제로 컨테이너에서 systemd를 사용할 수 있도록 하는 몇 가지 "해결 방법"이 있는데 이것이 내 목표입니다.

그래서 Rocky Linux 컨테이너 내부에 systemd를 빌드하는 컨테이너를 만들었습니다.이 Dockerfile을 따르세요.

컨테이너를 만들고 시작해 보았습니다.

$ docker build -t my_test .
[+] Building 1.4s (6/6) FINISHED
...

그런 다음 컨테이너를 실행하려고 시도했지만 오류가 발생했습니다.

$ docker run --tty --privileged --volume /sys/fs/cgroup:/sys/fs/cgroup:ro my_test
Failed to insert module 'autofs4': No such file or directory
systemd 239 (239-51.el8) running in system mode. (+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN2 -IDN +PCRE2 default-hierarchy=legacy)
Detected virtualization docker.
Detected architecture x86-64.

Welcome to Rocky Linux 8.5 (Green Obsidian)!

Set hostname to <dea75c1001fd>.
Initializing machine ID from random generator.
Failed to create /init.scope control group: Read-only file system
Failed to allocate manager object: Read-only file system
[!!!!!!] Failed to allocate manager object, freezing.
Freezing execution.

질문: Rocky Linux 컨테이너에서 systemd를 사용하여 컨테이너를 성공적으로 구축하는 방법은 무엇입니까?

정보: MacOS 10.15.7, Docker 버전 20.10.11, 빌드 dea9396

답변1

systemd내부 컨테이너를 갖고 활성화된 시스템에서 실행하려면 systemd왜 외계인과 비표준 쓰레기로 귀찮게 해야 할까요 docker?

모든 최신 systemd시스템은 systemd-nspawnd기본적으로 컨테이너를 지원합니다. https://www.freedesktop.org/software/systemd/man/systemd-nspawn.html

이러한 컨테이너는 systemd기본 내부에서 실행되며 서비스 관리 및 기타 기능을 포함한 거의 모든 기능이 작동합니다. 이러한 유형의 컨테이너는 부피가 큰 허브에 의존하지 않으므로 docker내부 커널에서 지원하는 모든 운영 체제를 쉽게 설치할 수 있습니다.

실제로 nspawn 컨테이너는 다른 것보다 freebsd 감옥이나 실제 가상 머신처럼 작동합니다 docker. 귀하의 사용 사례에서는 이것이 완벽하게 이해됩니다.

편집하다:

죄송합니다. MacOS를 사용하고 계신지 몰랐습니다.

나는 한동안 MacOS를 다루어 왔으며 그들의 Linux 에뮬레이션이 존재하지 않는다고 확신합니다. 그 반대라고 하더라도 이 커널 모듈을 MacOS에 성공적으로 로드할 수 없을 것입니다. 완전히 다른 시스템 아키텍처:

Failed to insert module 'autofs4': No such file or directory

몇 년 전에 작성된 일부 사용자 모드 Linux 커널 에뮬레이션 연구에 대해 들었지만 이것이 docker이를 처리할 수 있을지 완전히 확신할 수 없었습니다.

간단히 말해서, 특정 작업에 잘못된 도구를 사용하고 있는 것입니다.

올바른 방법은 경량 가상 머신을 실행하고 그 안에서 systemd를 실행하는 것입니다. 그런 다음 정신적으로 해당 VM을 컨테이너로 생각할 수 있지만 결국에는 중요하지 않습니다.

사용 사례를 테스트하기 위해 일부 Linux 관련 컨테이너화 엔진을 실행해야 하는 경우 작은 centors/rhel/rocky VM을 구축하고 여기에 컨테이너화 프레임워크를 설치합니다( nspawn기본적으로 존재함).

답변2

다음은 파일을 사용하여 볼륨과 필요한 디렉터리를 docker-compose.yml마운트하여 MacOS의 Docker 컨테이너에서 systemd를 작동시키는 예입니다 ./sys/fs/cgrouptmpfs

https://github.com/moby/moby/issues/30723#issuecomment-365927679

docker-compose 파일에 다음을 추가합니다.

    privileged: true
    cap_add:
      - SYS_ADMIN
    security_opt:
      - seccomp:unconfined
    tmpfs:
      - /run
      - /run/lock
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:ro

이 질문 스레드의 다른 부분에서는 Mac의 Docker가 자체 Linux 가상 머신을 사용하므로 컨테이너가 이를 마운트하고 /sys/fs/cgroupMac에 존재할 필요가 없다고 설명되어 있습니다.

관련 정보