2016-08-26 30 views
25

Có vẻ như systemd không hoạt động hoặc không có sẵn trong hình ảnh Docker của Ubuntu.systemd và systemctl trong hình ảnh Docker của Ubuntu

Tôi đang chạy vùng chứa Docker từ các hình ảnh ubuntu:16.04ubuntu:16.10.

Nếu tôi thực hiện systemctl status ssh trong hộp chứa 16,04, kết quả là lỗi Failed to connect to bus: No such file or directory. Trong vùng chứa 16.10 lỗi là bash: systemctl: command not found.

Nếu tôi làm which systemctl systemctl được tìm thấy trong vùng chứa 16.04 nhưng không nằm trong vùng chứa 16.10.

Tôi đã phát hiện thấy rằng /lib/systemd tồn tại.

Tôi đã thử cài đặt systemd với apt-get install systemd libpam-systemd systemd-ui. Sau đó which systemctl phát hiện systemctl trong 16.10 nhưng systemctl status ssh vẫn cung cấp cho các lỗi Failed to connect to bus: No such file or directory

câu hỏi chính của tôi là: Làm thế nào có thể systemd và systemctl được kích hoạt để sử dụng trong hình ảnh Ubuntu Docker?

Tại sao systemd không hoạt động trong các bộ chứa Docker của Ubuntu? Là systemd không được sử dụng trong instantiating container?

Tôi không tìm thấy bất kỳ tài liệu nào về chủ đề này cho hình ảnh Docker Ubuntu/Ubuntu, chỉ thông tin về quá trình chuyển đổi Ubuntu từ Upstart đến systemd. Có tài liệu nào đưa ra lời giải thích đầy đủ không?

+0

Nếu bạn muốn có hệ thống init đầy đủ chức năng, hãy sử dụng máy ảo. – user2105103

+0

Có một số đề xuất để bắt chước một hệ thống init tại PID-1 bên trong một thùng chứa. Về cơ bản nó sẽ phản ứng với SIGTERM được gửi bởi "docker stop" phân phối nó đến các quá trình khác trong container. Và nó sẽ có thể gặt hái zombie từ các quá trình nền bị giết. => Bây giờ nó chỉ còn lại để chọn một trong những triển khai được xung quanh. Một số chỉ chuyển một "init" thực trong C/C++, một số khác đang thực hiện một số mã xung quanh tín hiệu (3) và waitpid (3) ở một ngôn ngữ cấp cao - lib chuẩn "tín hiệu" của Python cũng hoạt động cho điều đó. (như được hiển thị trong kịch bản thay thế docker-systemctl của tôi) –

Trả lời

23

Đây là theo thiết kế. Docker sẽ chạy một tiến trình trong nền trước trong vùng chứa của bạn và nó sẽ được sinh ra dưới dạng PID 1 trong vùng tên pid của vùng chứa. Docker được thiết kế để cô lập quá trình, không phải cho ảo hóa hệ điều hành, vì vậy không có các tiến trình và daemon hệ điều hành khác chạy bên trong vùng chứa (như systemd, cron, syslog, v.v.), chỉ có điểm vào hoặc lệnh bạn chạy.

Nếu chúng bao gồm lệnh systemd, bạn sẽ tìm thấy nhiều thứ không hoạt động vì điểm nhập của bạn thay thế init. Systemd cũng sử dụng các cgroup mà docker hạn chế bên trong các thùng chứa vì khả năng thay đổi các nhóm có thể cho phép một quá trình thoát khỏi sự cô lập của vùng chứa. Nếu không có systemd chạy như init bên trong thùng chứa của bạn, không có daemon nào để xử lý lệnh khởi động và dừng của bạn.

+0

Không có thảo luận về bất kỳ điểm nào của bạn trong hướng dẫn bạn đã liên kết để tôi không thấy làm thế nào bạn có thể nói rằng đó là "khá nhiều lưu ý đầu tiên trong hướng dẫn "và nó thực sự không hữu ích khi chỉ cần liên kết đến trang đầu của tài liệu. Tôi đã học được từ các video Đào tạo Docker Tự Paced rằng Entrypoint của một container có PID 1, vì vậy ngầm hiểu rằng Entrypoint thay thế systemd. Tuy nhiên sau khi đọc rất nhiều phần của tài liệu Docker tôi cảm thấy tôi chưa đọc một lời giải thích đầy đủ và rõ ràng. –

+1

Để làm một cái gì đó hữu ích gần như luôn luôn là một hình ảnh cơ sở chứa môi trường hoạt động, sự hiểu biết của tôi là sự khác biệt duy nhất giữa điều này và một hệ điều hành đầy đủ là nó không có hạt nhân và thay vào đó sử dụng hạt nhân của hệ điều hành chủ. Có lẽ một kiến ​​thức về hệ điều hành được giả định. Tôi mới dùng Linux. Tôi cần giải thích chi tiết về sự khác biệt giữa Môi trường hoạt động Distro Ubuntu/Linux thông thường và Môi trường hoạt động Distro Ubuntu/Linux Dockerized. –

+1

Điểm khác là Video đào tạo theo nhịp độ đầu tiên ngụ ý rằng nhiều quy trình có thể chạy bên trong một thùng chứa để tôi cảm thấy rằng tuyên bố của bạn về "không có quy trình nào khác" chạy trong vùng chứa ít nhất là một phần không chính xác. Cảm ơn bạn đã phản hồi của bạn. –

Các vấn đề liên quan