(コンテナーで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が正しく起動する方法を見つけることを試みます。
私はこれから逆方向に作業することができました: https://registry.hub.docker.com/u/codekoala/Arch/
Docker 1.1では、グループ(ro)が既にコンテナーで提供されているため、これが簡単になりました。PrivateTmpマウントを作成できるように、まだプライベートアクセスが必要ですが、systemdバイナリとして実行するようにcmdを指定する限り、うまく機能します。
Dockerコンテナーでsystemdを実行するには、Hostシステムでもsystemdを実行する必要があります。これは、ホストとしてUbuntuを使用できないことを意味します。現時点で私が知っている唯一のホストディストリビューションはFedora(Ubuntuとは異なり、最新バージョンのDockerを備えています)またはRHEL 7です。
ここで私のマスターピース: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
Dockerコンテナー内でsystemdを実行できます。ホストの/ sys/fs/cgroupボリュームをマウントする必要がありますが、ホストOSは関係ありません。このガイドに従って動作するようにしました: http://developerblog.redhat.com/2014/05/05/running-systemd-within-docker-container/
現在、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に取得します。これは、この作業を行う上で重要な部分です。
2018年現在、これは私にとってはうまくいきます:docker run -it -e container=docker
your-image-name/sbin/init
ただし、これによってシェルが提供されるわけではないので、有用なことを行うには、イメージ内のsystemdサービス(sshdなど)をまだ有効にしていない場合は、有効にする必要があります。