February 14, 2016

Docker コンテナ内でサービスを起動する

今更だけど、良く忘れるので。 普通にコンテナを作って、その中で systemctl を実行すると以下の様に怒られる。

$ Failed to get D-Bus connection: Operation not permitted

そんなときは --privileged で起動すればよい。

$ docker run --privileged -itd --name https-test -p 8443:443 local/el72 /sbin/init
$ docker exec -it https-test bash

/sbin/init で起動してから execbash を呼び出すのがミソ。 attach-d を付けずにフォアグランドで起動しても何も出来ない。(当然と言えば当然)

Docker のデザイン前提で考えれば 1コンテナ = 1プロセスなので、このやり方がスマートでないことは明白なんだけど、色々なサービスが絡まる検証をしたいときはこの方法が最も手軽。(もちろんプロダクションで使おうなどとは考えていない)

vagrantkvm でも良いんだけど、使い捨てを短期間の内に何度ども何度ども行うときはこれが一番楽である。ちなみに docker build--privileged 出来ないし、当分出来るようにしないと思われる。

また、Atomic Host の atomic run でも同じ事が出来ると思われるが、こっちの場合 pid/run も共有されるのでちょっと用途と合わない事が多い感じ。

なお、何故か RHEL/CentOS7.2 ( kernel-3.10.0-327.4.5.el7.x86_64 / docker-1.8.2-10.el7.x86_64 ) だとこれで起動した後 docker stop が効かない・・・。詳しくは見てないけど、Fedora23 ( kernel-4.3.5-300.fc23.x86_64 / docker-1.9.1-6.git6ec29ef.fc23.x86_64 ) だと上手く止められるので、kernel か docker か、それとも systemd か、その辺なのだろう。(さらっとログを見た感じ SELinux は関係なさそう)

あまり意図した使われ方でないハズなので、黙って Fedora でやることにする。

© Kazuhisa Hara 2014-2018