web-dev-qa-db-ja.com

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

(コンテナーでArch Linuxを実行している)Dockerコンテナー内で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が正しく起動する方法を見つけることを試みます。

12
Michael Neale

私はこれから逆方向に作業することができました: https://registry.hub.docker.com/u/codekoala/Arch/

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

1
Michael Neale

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

4
Michael Hampton

ここで私のマスターピース:DはubuntuでDockerコンテナ内でsystemdを実行しています:D私はUbuntuがDocker内のsystemdで動作しました

私の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
4
frank-dspeed

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

2
Tony H

現在、systemdは、さまざまな理由、つまり適切な権限がないために、Dockerコンテナー内で正しく実行されません。これについては、Dockerプロジェクトのさまざまなgithubの問題-- docker Archコンテナー内でsystemdを実行すると、ハングまたはsegfaultsがハングする と、init /プロセスの監視に関する関連する問題を確認できます。 (ここにもっと問題をリンクしたいのですが、どうやら十分な評判がないのでできません)。

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

彼らのブログに を文書化したように、何人かの開発者はすでにそれをFedoraシステムで実行させることに成功しているようです。

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
twildfarmer

2018年現在、これは私にとってはうまくいきます:docker run -it -e container=dockeryour-image-name/sbin/init

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

0
Robin Green