도커 컨테이너 (arch linux) 내에서 systemd 실행


12

도커 컨테이너 (컨테이너에서 아치 리눅스를 실행하는) 내에서 systemd를 실행할 수 있는지 확인하려고합니다.

모든 기능으로 docker를 시작하고 cgroup에서 마운트를 바인딩합니다.

docker run -it --rm --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro ..

그러나 systemd 바이너리를 실행하려고하면 :

Trying to run as user instance, but the system has not been booted with systemd.

시스템 시작에 올바르게 초기화하는 방법을 찾으려고합니다.


systemd매뉴얼 페이지를 시작하기에 좋은 장소가 될 것입니다. Google은 또한 docker에서 systemd를 실행하는 방법에 대한 몇 가지 기사를 제공합니다.
larsks

왜 시스템이 필요한지 설명해 주시겠습니까?
030

답변:


4

Docker 컨테이너에서 systemd를 실행하려면 호스트 시스템도 systemd를 실행해야합니다. 즉, Ubuntu를 호스트로 사용할 수 없습니다. 현재 내가 아는 유일한 배포판은 Fedora (Ubuntu와 달리 Docker의 최신 버전이 있음) 또는 RHEL 7입니다.


4
아치 리눅스는 또한 systemd를 사용합니다.
Jason Antman

8
16.04 용도로 우분투는 기본적으로 systemd
스콧 Stensland에게

4

여기 내 마스터 pice : D 우분투가있는 도커 컨테이너 내부에서 systemd 실행 : D 우분투가 docker 내부에서 systemd로 작업했습니다.

내 도커 시스템 컨테이너를위한 GitHub Repo

$ docker run -it --cap-add SYS_ADMIN -v /sys/fs/cgroup:/sys/fs/cgroup:ro dockerimages/docker-systemd

산출:

systemd 218 running in system mode. (+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT -GNUTLS +ACL +XZ -LZ4 -SECCOMP +BLKID -ELFUTILS +KMOD -IDN)
Detected virtualization 'docker'.
Detected architecture 'x86-64'.

Welcome to Ubuntu Vivid Vervet (development branch)!

Set hostname to <502ec40509a5>.
[  OK  ] Created slice Root Slice.
[  OK  ] Created slice System Slice.
         Starting Emergency Shell...
[  OK  ] Started Emergency Shell.
Startup finished in 5ms.
Welcome to emergency mode! After logging in, type "journalctl -xb" to view
system logs, "systemctl reboot" to reboot, "systemctl default" or ^D to
try again to boot into default mode.
root@502ec40509a5:~# exit

6
기술적으로 이것은 효과가 있지만 컨테이너의 보안을 해제해야했습니다. 프로덕션 배포에는 적합하지 않습니다.
Michael Hampton

오늘 thuis 덜 보안 플래그를 더 쉽게 할 수있다
구글 - 프랭크 - dspeed

2

전체 시스템이 올바른 권한이 없기 때문에 현재 시스템이 도커 컨테이너 내에서 올바르게 실행되지 않습니다. docker arch container hangs 또는 segfaults에서 systemd를 실행하는 것과 같은 docker 프로젝트의 다양한 github 문제 및 초기화 / 프로세스 모니터링과 관련된 관련 문제를 읽을 수 있습니다 . (여기에 더 많은 문제를 연결하고 싶지만 평판이 충분하지 않으므로 분명히 할 수 없습니다).

보시다시피, 이것은 현재 진행중인 주제이며 몇 가지 패치가 이미 병합되어 동작을 개선하여 곧 작동 할 것으로 예상됩니다.

분명히 일부 개발자 는 블로그에 문서화 되어있는 것처럼 이미 페도라 시스템에서 실행할 수있었습니다 .


2

도커 컨테이너 내에서 systemd를 실행할 수 있습니다. 호스트의 / sys / fs / cgroup 볼륨을 마운트해야하지만 호스트 OS는 중요하지 않습니다. 이 가이드에 따라 작동하도록했습니다 : http://developerblog.redhat.com/2014/05/05/running-systemd-within-docker-container/


4
ServerFault에 오신 것을 환영합니다. 솔루션에 연결하는 대신 여기에 솔루션의 필수 사항을 답변에 포함하십시오. 이렇게하면 링크 대상이 사라지면 답변이 여전히 유용합니다.
Andrew Schulman

링크 된 기사에는 매우 유용한 정보가 포함되어 있습니다. 귀하의 답변이 완료되도록하기 위해 /sys/fs/cgroup, 귀하가 언급 한 호스트의 마운트 외에 주요 실행 가능한 조언을 요약하십시오 .
Amir

그리고 여기에 유용한 정보가
Amir

1

나는 이것에서 거꾸로 일할 수 있었다 : https://registry.hub.docker.com/u/codekoala/arch/

Docker 1.1은 컨테이너에 그룹 (ro)이 이미 제공되어있어 이것을 쉽게 만듭니다. 현재 여전히 개인 액세스가 필요하므로 PrivateTmp 마운트를 만들 수 있지만 cmd를 시스템 바이너리로 실행하도록 지정하면 멋지게 작동합니다.


1

debian : 8 공식 컨테이너 에서이 작업을 수행하는 동안이 질문을 찾았습니다. 공식 debian : 8 (debian : jessie) 컨테이너 에서이 작업을 수행하려는 다른 사람들을 위해 @ Frank-from-DSPEED의 답변은 이전 git hub post에 설명 된 것처럼 약간 수정되었습니다 .

docker run -d \
    -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
    --cap-add SYS_ADMIN \
    debian:jessie  /sbin/init
docker exec -it <your-new-container-name-or-ID> bash

그런 다음 컨테이너에서 :

systemctl show-environment

이것은 나에게 완벽하게 작동하며 이것이 단지 개발 환경이기 때문에 보안 문제는 중요하지 않습니다.

참고 : / sbin / init 명령은 / sbin / init를 프로세스 1로 가져옵니다.이 작업의 핵심 부분입니다.


1
systemctl show-environment나를 위해 reutrns Failed to get D-Bus connection: Unknown error -1. 나는 함께 컨테이너를 시작하면 --privileged대신 플래그 --cap-add SYS_ADMIN( docker run -d --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro --name=ubuntu_systemd_test debian:jessie /sbin/init평소처럼) systemctl의 응답
czerasz

@twildfarmer 감사합니다. 또한 이것을 시도하는 다른 사람을 위해. 이것이 구현 된 또 다른 Dockerfile은 다음과 같습니다. syslog.me/2016/03/31/an-init-system-in-a-docker-container
Vivek Kodira

0

2018 년 현재, 이것은 나를 위해 작동합니다 : docker run -it -e container=docker your-image-name /sbin/init

그러나 셸을 제공하지는 않으므로 이미지 내부에서 일부 시스템화 된 서비스 (예 : sshd)를 활성화하지 않은 경우 먼저 활성화해야합니다.


이 이미지에 어떤 이미지를 사용하고 있는지 자세히 설명해 주시겠습니까? 나는 Ubuntu, Debian, Arch, Alpine 및 OpenSUSE를 시도했지만 그중 아무것도 작동하지 않습니다. 이진 파일이 없거나 init가 자원을 열지 못합니다.
코딩
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.