กำลังเรียกใช้ systemd ภายในคอนเทนเนอร์ docker (arch linux)


12

ฉันพยายามที่จะดูว่าฉันสามารถเรียกใช้ systemd ภายในคอนเทนเนอร์นักเทียบท่า (ซึ่งเรียกใช้ arch linux ในคอนเทนเนอร์)

ฉันเริ่มนักเทียบท่าด้วยความสามารถทั้งหมดและผูกเมานต์ใน cgroups:

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

อย่างไรก็ตามถ้าฉันพยายามรัน systemd binary:

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

พยายามค้นหาวิธีเริ่มต้นสิ่งต่าง ๆ อย่างถูกต้องเพื่อให้ systemd เริ่มต้นขึ้น


systemdหน้าคนจะเป็นสถานที่ที่ดีที่จะเริ่มต้น Google ให้ผลหลายบทความเกี่ยวกับการเรียกใช้ systemd ภายใต้นักเทียบท่า
larsks

คุณช่วยอธิบายได้ไหมว่าทำไมคุณถึงต้องการ systemd?
030

คำตอบ:


4

ในการรัน systemd ในคอนเทนเนอร์ Docker ระบบโฮสต์ต้องรัน systemd ด้วย หมายความว่าคุณไม่สามารถใช้ Ubuntu เป็นโฮสต์ได้ ในเวลานี้มีเพียงดิสทริบิวชั่นที่ฉันรู้จักคือ Fedora (ซึ่งต่างจาก Ubuntu, มี Docker รุ่นล่าสุด) หรือ RHEL 7


4
Arch Linux ยังใช้ systemd
เจสัน Antman

8
อูบุนตูตั้งแต่ 16.04 ใช้ systemd เป็นค่าเริ่มต้น
Scott Stensland

4

ที่นี่ pice หลักของฉัน: D ที่กำลังเรียกใช้ systemd ภายในคอนเทนเนอร์นักเทียบท่าที่มี ubuntu: D ฉันมี Ubuntu ที่ทำงานกับ systemd อยู่ใน docker

GitHub Repo สำหรับระบบ docker-systemd ของฉัน

$ 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

วันนี้ผู้คนสามารถทำได้ง่ายขึ้นด้วยการตั้งค่าสถานะความปลอดภัยให้น้อยลง
google-frank-dspeed

2

ปัจจุบัน systemd ไม่ทำงานอย่างถูกต้องภายในคอนเทนเนอร์นักเทียบท่าเนื่องจากเหตุผลทั้งชุดเช่นการขาดสิทธิ์ที่ถูกต้อง คุณสามารถอ่านได้ในประเด็น github ที่หลากหลายในโครงการนักเทียบท่าเช่นการเรียกใช้ systemd ภายในคอนเทนเนอร์ archer archer hangs หรือ segfaultsและปัญหาที่เกี่ยวข้องเกี่ยวกับการตรวจสอบ init / process (ฉันต้องการเชื่อมโยงปัญหามากขึ้นที่นี่ แต่ฉันไม่สามารถทำได้เพราะฉันไม่มีชื่อเสียงเพียงพอ)

อย่างที่คุณเห็นนี่เป็นหัวข้อที่กำลังดำเนินการอยู่ในปัจจุบันและมีการรวมแพตช์สองสามตัวเพื่อปรับปรุงพฤติกรรมเพื่อให้เราสามารถคาดหวังว่ามันจะทำงานได้ในไม่ช้า

เห็นได้ชัดว่านักพัฒนาซอฟต์แวร์บางคนจัดการเพื่อให้มันทำงานบนระบบ fedora ได้เนื่องจากพวกเขาได้บันทึกไว้ในบล็อกแล้ว


2

คุณสามารถเรียกใช้ systemd ภายในคอนเทนเนอร์นักเทียบท่า ระบบปฏิบัติการโฮสต์ไม่สำคัญแม้ว่าคุณจะต้องติดตั้งไดรฟ์ข้อมูล / sys / fs / cgroup ของโฮสต์ ฉันได้มันไปทำงานตามคู่มือนี้: http://developerblog.redhat.com/2014/05/05/running-systemd-within-docker-container/


4
ยินดีต้อนรับสู่ ServerFault แทนที่จะเชื่อมโยงกับโซลูชันโปรดรวมประเด็นสำคัญ ๆ ไว้ในคำตอบของคุณ วิธีนี้จะทำให้คำตอบของคุณยังคงมีประโยชน์หากเป้าหมายลิงก์หายไป
Andrew Schulman

บทความที่คุณลิงค์มีข้อมูลที่มีประโยชน์มาก เพื่อให้คำตอบของคุณเสร็จสมบูรณ์โปรดสรุปคำแนะนำที่สามารถนำไปปฏิบัติได้จริง (นอกเหนือจากการติดตั้งโฮสต์/sys/fs/cgroupที่คุณพูดถึง)
อาเมียร์

และนี่คือบทความติดตามผลพร้อมข้อมูลที่เป็นประโยชน์เพิ่มเติม: developers.redhat.com/blog/2016/09/13/…
อาเมียร์

1

ฉันสามารถทำงานย้อนหลังได้จาก: https://registry.hub.docker.com/u/codekoala/arch/

Docker 1.1 ช่วยให้ง่ายขึ้นเมื่อมีการจัดกลุ่ม (ro) ไว้ในคอนเทนเนอร์ - ปัจจุบันฉันยังต้องการการเข้าถึงแบบส่วนตัวดังนั้นจึงสามารถสร้างการเมาท์ส่วนตัว PrivateTmp ได้ แต่อย่างอื่นตราบใดที่คุณระบุ cmd ให้ทำงานเป็น systemd binary - มันทำงานได้ดี


1

พบคำถามนี้ขณะที่พยายามทำสิ่งนี้ในเดเบียน: 8 ตู้คอนเทนเนอร์อย่างเป็นทางการ สำหรับคนอื่นที่พยายามทำสิ่งนี้บนเดเบียนอย่างเป็นทางการ: คอนเทนเนอร์ 8 (เดเบียน: เจสซี) คำตอบของ @ Frank-from-DSPEED จะทำงานโดยมีการดัดแปลงเล็กน้อยตามที่อธิบายไว้ในฮับ ​​git ที่เก่ากว่า :

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 เป็น Process 1 ซึ่งเป็นส่วนสำคัญในการทำให้งานนี้


1
systemctl show-environmentreutrns 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 ชื่อภาพของคุณ /sbin/init

สิ่งนี้จะไม่ให้เปลือกคุณดังนั้นคุณจะต้องเปิดใช้งานบริการ systemd (เช่น sshd) ในภาพก่อนหากยังไม่ได้ดำเนินการเพื่อทำสิ่งที่มีประโยชน์


คุณสามารถให้รายละเอียดเกี่ยวกับภาพที่คุณใช้กับภาพนี้ได้หรือไม่? ฉันได้ลองใช้ Ubuntu, Debian, Arch, Alpine และ OpenSUSE แล้วและพวกมันก็ไม่ทำงาน อย่างใดอย่างหนึ่งไบนารีไม่อยู่หรือ init ล้มเหลวในการเปิดแหล่งข้อมูล
Codebling
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.