Chạy systemd bên trong một container docker (arch linux)


12

Tôi đang cố gắng xem liệu tôi có thể chạy systemd bên trong một container docker (đang chạy arch linux trong container không).

Tôi bắt đầu docker với tất cả các khả năng và liên kết gắn kết trong các nhóm:

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

tuy nhiên, nếu tôi cố chạy hệ thống nhị phân systemd:

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

Cố gắng tìm ra cách khởi tạo mọi thứ một cách chính xác để bắt đầu systemd.


Các systemdtrang người đàn ông sẽ là một nơi tốt để bắt đầu. Google cũng mang lại một số bài viết về việc chạy systemd dưới docker.
larsks

Bạn có thể giải thích tại sao bạn cần systemd?
030

Câu trả lời:


4

Để chạy systemd trong bộ chứa Docker, hệ thống máy chủ cũng phải chạy systemd. Điều này có nghĩa là bạn không thể sử dụng Ubuntu làm máy chủ lưu trữ. Tại thời điểm này, các bản phân phối máy chủ duy nhất tôi biết về công việc đó là Fedora (không giống như Ubuntu, có phiên bản Docker mới nhất) hoặc RHEL 7.


4
Arch Linux cũng sử dụng systemd.
Jason Antman

8
Ubuntu vào ngày 16.04 sử dụng systemd theo mặc định
Scott Stensland

4

Ở đây, chủ nhân của tôi: D đang chạy systemd bên trong một container docker với ubfox: D Tôi có Ubuntu làm việc với systemd bên trong docker

GitHub Repo cho container docker-systemd của tôi

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

Đầu ra:

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
Về mặt kỹ thuật, nó hoạt động, nhưng bạn phải phá vỡ bảo mật của container để làm điều đó. Điều này không thích hợp cho việc triển khai sản xuất.
Michael Hampton

Ngày nay, việc truy cập có thể dễ dàng hơn với các cờ bảo mật ít hơn
google-frank-dspeed

2

Hiện tại systemd không chạy chính xác trong một container docker, do toàn bộ lý do, nghĩa là thiếu các đặc quyền chính xác. Bạn có thể đọc về một loạt các vấn đề github trong dự án docker như chạy systemd bên trong docker arch container treo hoặc segfaults và các vấn đề liên quan liên quan đến giám sát init / process. (Tôi muốn liên kết nhiều vấn đề hơn ở đây, nhưng tôi không thể vì tôi dường như không có đủ danh tiếng).

Như bạn có thể thấy, đây là một chủ đề hiện đang được thực hiện và một vài bản vá đã được hợp nhất để cải thiện hành vi, do đó chúng ta có thể mong đợi điều này sẽ sớm hoạt động.

Rõ ràng một số nhà phát triển đã quản lý để có được nó chạy trên các hệ thống fedora, như họ đã ghi lại trong blog của họ .


2

Bạn có thể chạy systemd bên trong một container docker. Hệ điều hành máy chủ không thành vấn đề, mặc dù bạn sẽ cần phải gắn kết khối lượng / sys / fs / cgroup của máy chủ. Tôi đã làm cho nó hoạt động theo hướng dẫn này: http://developerblog.redhat.com/2014/05/05/rasty-systemd-within-docker-container/


4
Chào mừng bạn đến với ServerFault. Thay vì liên kết đến một giải pháp, vui lòng bao gồm các điểm cần thiết của nó ở đây trong câu trả lời của bạn. Bằng cách đó, câu trả lời của bạn sẽ vẫn hữu ích nếu mục tiêu liên kết biến mất.
Andrew Schulman

Bài viết bạn liên kết để chứa thông tin rất hữu ích. Để câu trả lời của bạn được hoàn thành, vui lòng tóm tắt những lời khuyên chính có thể hành động của nó (bên cạnh việc gắn máy chủ /sys/fs/cgroup, mà bạn đã đề cập).
Amir

Và đây là một bài viết tiếp theo với thông tin hữu ích hơn nữa: developers.redhat.com/blog/2016/09/13/iêu
Amir

1

Tôi đã có thể làm việc ngược từ đây: https://registry.hub.docker.com/u/codekoala/arch/

Docker 1.1 làm cho điều này dễ dàng hơn khi các nhóm (ro) đã được cung cấp trong các thùng chứa - Tôi hiện vẫn cần quyền truy cập riêng tư để nó có thể tạo ra các mount PrivateTmp, nhưng nếu không, miễn là bạn chỉ định cmd để chạy như nhị phân systemd - nó hoạt động độc đáo.


1

Tìm thấy câu hỏi này trong khi cố gắng làm điều này trong debian: 8 container chính thức. Đối với bất kỳ ai khác đang cố gắng thực hiện điều này trên container chính thức: 8 (debian: jessie), câu trả lời của @ Frank-from-DSPEED hoạt động với một sửa đổi nhỏ như được mô tả trong bài đăng trung tâm git cũ :

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

Sau đó từ trong container:

systemctl show-environment

Điều này hoạt động hoàn hảo đối với tôi và vì đây chỉ là môi trường phát triển, vấn đề bảo mật không quan trọng với tôi.

Lưu ý: Lệnh / sbin / init được / sbin / init là Quy trình 1, đây là một phần quan trọng để thực hiện công việc này.


1
systemctl show-environmentreutrns cho tôi Failed to get D-Bus connection: Unknown error -1. Khi tôi khởi động container bằng một --privilegedcờ thay vì --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 trả lời như bình thường
czerasz

@twildfarmer cảm ơn bạn. Ngoài ra cho bất cứ ai khác thử điều này. Một Dockerfile khác mà điều này đã được triển khai là: syslog.me/2016/03/31/an-init-system-in-a-docker-container
Vivek Kodira

0

Kể từ năm 2018, giờ đây nó hoạt động với tôi: docker run -it -e container=docker tên hình ảnh của bạn /sbin/init

Tuy nhiên, điều này sẽ không cung cấp cho bạn trình bao, do đó trước tiên bạn cần kích hoạt một số dịch vụ systemd (ví dụ: sshd) bên trong hình ảnh nếu điều đó chưa được thực hiện, để làm bất cứ điều gì hữu ích.


Bạn có thể cho biết chi tiết về hình ảnh bạn đang sử dụng cho việc này? Tôi đã thử Ubuntu, Debian, Arch, Alpine và OpenSUSE và không ai trong số họ hoạt động. Nhị phân không tồn tại hoặc init không mở tài nguyên.
Mã Bling
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.