Docker上のCentOSだと自作systemdが動かない時の対応方法

#どういう状況だってばよ！？
1. CentOSで定期実行を実現する為にsystemdを自作したい。
2. 実機のCentOSだと自作systemdが動くのに、Docker上のCentOSだとなぜかダメ。
3. 具体的にはDocker上だと下記のエラーでこける。

>System has not been booted with systemd as init system (PID 1). Can't operate.
>Failed to connect to bus: Host is down


#あたいはこんな環境でやってます
この記事は下図のようにWindows10のDocker Desktopをインストール済で、Docker-composeももれなくセットでインストールされている前提になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/0bb8ea75-3bb6-d194-cb85-9c3b614cd6a3.png)


#まずはdocker-compose.ymlを新規作成
どこかのフォルダにdocker-compose.ymlという設定ファイルがある訳ではないです。
また、docker-compose.ymlを置く場所はひとまずどこでもよかとです。

Docker初心者なので『docker-compose.ymlって設定ファイルどこにあるの…？どこに置かなきゃいけないの…？』なんて右往左往してました…(´・ω・`)

docker-compose.yml ≒ **コンテナ作成手順書（指示書）** って捉えるといいかな～って思います。

んで、今回は『C:\Users\waokitsune\centos8_systemd_test』というフォルダにdocker-compose.ymlを作成してみました。

#docker-compose.ymlの中身
[参考サイトさん](https://tihiro.hatenablog.com/entry/2020/03/20/165252) を参照させてもらいました。
（centosという名前のイメージは既にある前提のymlになります）

```
version: "3.8"
services:
  centos8_systemd_test:
    image: centos
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:ro
    cap_add:
      - SYS_ADMIN
    command: /sbin/init
```


#PowerShellでDocker-composeにymlを食わせる
PowerShellを起動してまずはdocker-composeが置いてある場所へ行き…

```
cd C:\Users\waokitsune\centos8_systemd_test
```
docker-composeコマンドでコンテナ作成。

```
docker-compose up -d
```
成功するとこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/8c817308-48ce-7b84-23e3-3f551e2edf77.png)


#ymlを食わせて出来たコンテナを使うぞい
Docker Desktopのダッシュボード開いて、端末起動！
ああ…なんか頭痛が痛いみたいなコンテナ名になっちゃってますね…(´・ω・`)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/e36a0f26-baf0-46cb-fd6d-4f58c0085d57.png)

まずは ```ps aux``` でプロセスを見てみましょい。
なんか行けそうな気がします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/558b718a-99d7-ae92-aaa4-5d394d1cbdb6.png)

ちなみに自作systemdが動かなかったコンテナの ```ps aux``` 結果はこちら。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/82a59995-0fc1-23fb-27b7-da16eb6e2e65.png)

テキストファイルを作成するシェルスクリプトファイル『zoi.sh』をルート直下に作成します。

```sh:zoi.sh
#!/usr/bin/bash
touch /zoizoi.txt
```

作ったシェルスクリプトファイルに実行権限を与えてあげます。

```
chmod 755 /zoi.sh
```


そして、『/etc/systemd/system』フォルダーに『zoi.service』ファイルを作成します。
作ったシェルスクリプトをキックするだけの簡単なやつです。

```zoi.service
[Unit]
Description=kyoumoitinitigannbaruzoi

[Service]
Type=simple
ExecStart=/zoi.sh

[Install]
WantedBy=multi-user.target
```

準備ができたので『zoi.service』を起動してみます。

```
systemctl start zoi.service
```
エラー無く終了したっぽいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/3b10eb9c-a4eb-3598-1560-b66fe3fef448.png)
本当か？本当にそうかぁ～？
```systemctl status zoi.service``` で確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/042a220f-37a6-f1ff-ed12-72c0e20e80ac.png)
白丸なので正常終了っぽいです。
（シェルスクリプトに実行権限与え忘れてサービス起動した痕跡があるのは~~モアイ教~~ご愛敬）

```ls /``` でも確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/f7e2c75a-b776-4551-c5b6-a6cb7d4cd9ca.png)
シェルスクリプトによってテキストファイルが作成されてます。

OKっす。

無事、Docker上のCentOSで自作systemdを動かせました。


#蛇足
docker-compose.ymlがあると『まったく同じ環境をまた作る』が簡単にできて便利だと思いました。


#参考サイトさん
https://futureys.tokyo/lets-run-the-web-application-for-development-by-docker-desktop-and-access-it-by-browser/


#バージョン
Windows10 Pro バージョン1909 OSビルド19042.630
Docker Desktop:2.5.0.1（49550） Engine:19.03.13 Compose:1.27.4
PSVersion 5.1.19041.610
CentOS Linux release 8.2.2004 (Core)