Dockerコンテナ内でsystemdを実行する(arch Linux)


12

dockerコンテナー(コンテナーでarch linuxを実行している)内でsystemdを実行できるかどうかを確認しようとしています。

すべての機能でdockerを起動し、cgroupsでマウントをバインドします。

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に対して正しく初期化する方法を見つけることから始めます。


systemdmanページには、開始するには良い場所でしょう。Googleは、dockerでsystemdを実行することに関するいくつかの記事も提供しています。
larsks

systemdが必要な理由を説明してもらえますか?
030

回答:


4

Dockerコンテナでsystemdを実行するには、ホストシステムでもsystemdを実行する必要があります。これは、Ubuntuをホストとして使用できないことを意味します。現時点で私が知っている唯一のホストディストリビューションは、Fedora(Ubuntuとは異なり、最新バージョンのDockerを持っています)またはRHEL 7です。


4
Arch Linuxもsystemdを使用しています。
ジェイソンアントマン

8
デフォルトではsystemdに16.04用途としてのubuntu
スコットStensland

4

ここで私のマスターピース:D ubuntuを使用してdockerコンテナー内でsystemdを実行します:D

docker-systemdコンテナーのGitHubリポジトリ

$ 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
技術的にはこれは機能しますが、それを行うにはコンテナのセキュリティを破る必要がありました。これは、運用展開には適していません。
マイケルハンプトン

今日のthuisは以下のセキュリティフラグをより簡単に可能です
グーグル・フランク・DSPEED

2

現在、systemdは、一連の理由、つまり正しい権限がないため、Dockerコンテナ内で正しく実行されません。Dockerアーチコンテナーのハングまたはセグメンテーション違反の内部でsystemdを実行するなど、Dockerプロジェクトのさまざまなgithubの問題、およびinit / processモニタリングに関する関連する問題でこれを確認できます。(私はここでより多くの問題をリンクしたいと思いますが、私はどうやら十分な評判を持っていないようにできません)。

ご覧のとおり、これは現在作業中のトピックであり、動作を改善するためにいくつかのパッチが既にマージされているため、すぐに機能することが期待できます。

どうやら、一部の開発者はすでにブログで文書化れているように、すでにフェドラシステムで実行できるようになっています。


2

Dockerコンテナ内でsystemdを実行できます。ホストのOSは関係ありませんが、ホストの/ sys / fs / cgroupボリュームをマウントする必要があります。このガイドに従って動作するようになりました:http : //developerblog.redhat.com/2014/05/05/running-systemd-within-docker-container/


4
ServerFaultへようこそ。ソリューションにリンクする代わりに、回答の重要なポイントをここに含めてください。そうすれば、リンクターゲットがなくなった場合でも、答えは有用です。
アンドリューシュルマン

リンクする記事には、非常に役立つ情報が含まれています。あなたの答えを完成させるために、その主な実行可能なアドバイスを要約してください(/sys/fs/cgroupあなたが言及したホストのマウントを除いて)。
アミール

そして、さらに有益な情報を含むフォローアップ記事があります:developers.redhat.com/blog/2016/09/13/…–
Amir

1

https://registry.hub.docker.com/u/codekoala/arch/から後方に作業することができました

Docker 1.1は、グループ(ro)が既にコンテナーで提供されているため、これを簡単にします-PrivateTmpマウントを作成できるように、現在はprivアクセスが必要ですが、そうでない場合は、systemdバイナリとして実行するcmdを指定する限り、うまく動作します。


1

debian:8公式コンテナでこれをしようとしているときにこの質問を見つけました。公式のdebian:8(debian:jessie)コンテナでこれを行おうとする他の人にとって、@ 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をプロセス1として取得します。これは、この作業の重要な部分です。


1
systemctl show-environment私のためにreutrns Failed to get D-Bus connection: Unknown error -1。()の--privileged代わりにフラグを使用してコンテナを起動すると、systemctlは通常のように応答します--cap-add SYS_ADMINdocker run -d --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro --name=ubuntu_systemd_test debian:jessie /sbin/init
-czerasz

@twildfarmerありがとうございます。これを試す他の人にも。これが実装されているもう1つのDockerfileは次のとおり
Vivek Kodira

0

2018年の時点で、これは私のために機能しています:docker run -it -e container=docker your-image-name /sbin/init

ただし、これによってシェルが提供されることはないため、画像内でsystemdサービス(sshdなど)をまだ有効にしていない場合は、まず有効にして、有用なことを行う必要があります。


これに使用している画像の詳細を教えてください。Ubuntu、Debian、Arch、Alpine、OpenSUSEを試しましたが、どれも動作しません。バイナリが存在しないか、initがリソースを開けません。
コードブリン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.