前提
- MacでのDockerは、boot2dockerを使用しますよね。なのでインストール済みであること。
-
docker pull centos:7
で、既にCentOS7のイメージをインストール済みであること。
問題点
- centos7のコンテナを、今まで(Centos6系など)と同様に、以下のように起動します。
> docker run -i -t -d -p 8888:80 -p 10022:22 --name="container_name" centos:7 /bin/sh
- すると、以下のようなエラーが吐かれてしまいますた。。。
Failed to get D-Bus connection: No connection to service manager.
原因
- CentOS 7ではinitデーモンがsystemdに変更されたため。
解決策
- nsenter を使って、CentOS7のコンテナを起動すると、うまくいきますよー。ってことで、手順は、以下の通りです。
nsenterのインストールから、コンテナ起動まで。
-
分かりやすさのため、コマンドプロンプトのマークの意味は、以下のようにします。
-
>
: OS X 内 -
$
: boot2docker VM内 -
%
: Dockerコンテナ内
-
1. boot2dockerのパスを調べておく
> which boot2docker
/usr/local/bin/boot2docker
2. boot2docker VMに、sshログイン
> boot2docker ssh
3. nsenterをインストール
$ docker run --rm -v /usr/local/bin/boot2docker:/target jpetazzo/nsenter
4. boot2docker VM内のPATHに、/usr/local/bin/boot2docker
を追加する。
$ echo 'export PATH=/usr/local/bin/boot2docker:$PATH' >> ~/.profile
$ source ~/.profile
- OS X 内の
.profile
ではなく、boot2docker VM内の.profile
ですよー。気をつけて!!
5. nsenterのパスが通ったか?を確認
$ which nsenter
/usr/local/bin/boot2docker/nsenter
6. centos7のコンテナを起動
「boot2docker ssh」でログイン状態にあることが前提
ポイント
・特権モードにする(--privileged)
・コンテナで起動されるコマンドは/sbin/initにする
$ sudo docker run --dns 8.8.8.8 --privileged -d -p 8888:80 -p 10022:22 --name="container_name" centos:7 /sbin/init
-
sudo
を付けてコンテナを起動してね。でないと、後でPermission Errorというエラーが吐かれちゃうよー。気を付けて!!
7. nsenterを使用してコンテナに入る。
- 良い子は、ここでも、ちゃんと sudoを付けようね。
$ sudo nsenter -t $(sudo docker inspect --format '{{.State.Pid}}' container_name) -m -u -i -n -p /bin/sh
- これでsystemctlが使えます。
% systemctl get-default
multi-user.target
最後に
- うまくいきましたか? よかったら、ぜひ参考にしてください。