도커 컨테이너 (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.