はじめに
表題の様な件が起こり調査を行ったので、その結果をまとめておきたいと思います。まずは準備も兼ねて問題の再現から行います。
dockerをインストール・起動します。
# yum -y install docker
# systemctl start docker
HubからCentOS7のイメージをプルしてビルドします。
# vi Dockerfile
FROM centos:7
RUN yum -y update
# docker build -t centos:7 ./
# docker images
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 7 dcbb85881b03 17 minutes ago 373 MB
docker.io/centos 7 5e35e350aded 3 months ago 203 MB
作成したイメージを元にコンテナを起動するのですが、systemctlを使いたいので管理者権限を付与して起動します。
# docker run -itd --privileged --name centos7 centos:7
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8d5c12f1794a centos:7 "/bin/bash" 13 seconds ago Up 13 seconds centos7
# docker exec -it centos7 /bin/bash
これで準備が完了しました。試しにsystemctl
コマンドを使ってみようとすると次のようなエラーが吐かれます。
# systemctl
Failed to get D-Bus connection: Operation not permitted
対応
原因としてはこのコンテナではsystemd
が起動していないからです。Dockerでは (諸説ありますが) 1コンテナ1プロセスと言われている位で、余り余計なプロセスは立ち上げない事が理想なので、VMの様に使うことはベストプラクティスではないようです。自分は使っていますが……
そこでコンテナ内でsystemd
を立ち上げたければコンテナ起動時に引数でコマンドを渡してあげる必要があります。
# docker run -itd --privileged --name centos7 centos:7 /sbin/init
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
35fe787bd7d2 centos:7 "/sbin/init" 36 seconds ago Up 36 seconds centos7
# docker exec -it centos7 /bin/bash
通常/sbin/init
はsystemd
へのリンクになっているので、これでsystemctl
が使えるようになるはずです。
# systemctl
UNIT LOAD ACTIVE SUB DESCRIPTION
proc-sys-fs-binfmt_misc.automount loaded active waiting Arbitrary Executable File Formats File System Automount Point
dev-xvda1.device loaded activating tentative /dev/xvda1
-.mount loaded active mounted /
dev-hugepages.mount loaded active mounted Huge Pages File System
dev-mqueue.mount loaded active mounted POSIX Message Queue File System
etc-hostname.mount loaded active mounted /etc/hostname
~ 略 ~
これで使えるようになりました。