コンテナでapacheを起動するときの備忘録

コンテナでApacheを使用するときに必要になったことを備忘録としてまとめました。

【環境】
OS：AmazonLinux２
Apacheのバージョン：2.4

インストールについて
-
下記で実施。

```
yum install -y httpd.x86_64
```

コンテナでの動作について
-
コンテナが起動する時には一緒にApacheも起動するようにしたい。
現状の状態を下記コマンドで確認。

```
bash-4.2# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:httpd.service(8)
```

コンテナで自分で下記コマンドを実行すればApacheは起動するのだが、理想はコンテナが起動した時にはもうサービスが走っている状態にしたい。

```
httpd -k start
```


####systemctlを使わないとstatusが確認できない？

最初から結論が出てしまうけど

>Apacheの起動確認は root権限で実行する

https://blog.s-giken.net/350.html

と言うことはhttpdのステータスの確認には必ずsystemd（systemctl）が絡む雰囲気ですね。
まぁコンテナで起動するとき等はrootになっているはずだから関係ないけど。

####そもそもsystemctlとは？
systemdを操作する為のコマンドです。

####ではsystemdとは？
https://ja.wikipedia.org/wiki/Systemd

>システム管理デーモン、ライブラリおよびユーティリティの一式であり、管理および設定における中心的プラットフォーム

システム管理の為のプロセスという事ですね

>主要なLinuxディストリビューションのほとんどはsystemdをデフォルトのinitシステムとして採用している

業務ではinitしか見かけなかったので知らなかった(UNIX)

####念の為initシステムとは？
https://ja.wikipedia.org/wiki/Init

>、UNIXおよびUnix系システムのプログラムのひとつであり、他の全てのプロセスを起動する役目を持つ。デーモンとして動作し、一般にPID 1 を付与される

では本題へ

####コンテナでsystemctlが使えない

上記により、Linuxではサービス起動時にsystemctlコマンドを使用するという事を理解。
ただ、起動したコンテナではsystemctlが使用できなかった。
結論から先に言うと、コンテナ起動時に下記を実行するよう追記したところ、systemctlコマンドが使用できるようになった。
下記ページがとても参考になった
https://qiita.com/mikene_koko/items/4c71c969f55e3fe24190

docker-compose.yml

```
services:
  app:
    build:
      context: ..
      dockerfile: docker/test/Dockerfile.development
    command:
      - /sbin/init
    privileged: true
```


####なぜ/sbin/initなのか整理

http://www.seinan-gu.ac.jp/~shito/old_pages/hacking/shell/sh/boot_shutdown.html#1

>システム起動時で，カーネルのロードが終了すると最後に，全てのプロセスの親として，プロセスの管理を行うinitデーモン(/sbin/Init)が起動される

これがないと何も始まらないから、という事ですね
ただ、<a href = https://qiita.com/mby/items/5fbba9e6cfd202ea0ce5#compose%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AEinit%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E4%BD%BF%E3%81%86 >親プロセスをオプション指定して設定することもできるので</a>あえて/sbin/initを使用する必要もないのでは、、

という疑問の答えは下記が参考になリました
https://momozo.tech/2020/02/22/centos7%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%A7systemctl%E3%81%8C%E4%BD%BF%E3%81%88%E3%81%AA%E3%81%84%E6%99%82/


コンテナでsystemdプロセスが起動していない
↓
/sbin/initはsystemdへのリンクになっている
↓
実行するとsystemdプロセスがPID1で起動しsystemctlが使用できるようになる

尚、**privileged**オプションは、コンテナ内では基本的に全てのデバイス（デーモンなど）の起動をデフォルトで許可しておらず、これを許可するためのオプションです


####systemctlを使用しなくて済む方法

色々書いたけど、そもそもapacheコンテナを起動する際に「start」ってコマンドを渡さないとhttpd起動しないとか、絶対他に方法あるでしょ。

現状はコンテナ起動直後はこうなっている

```
bash-4.2# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:httpd.service(8)
```

deadとか表示されると異常終了のようで一瞬怯むけど（自分だけ？）これは正常終了している状態。
ただデフォルトで終了状態ではなく、起動状態にしたい。

方々探して全然方法が見つからない、と思っていたら先人がいた。
https://qiita.com/akashima/items/6b0679b95db170f94f22

####先人の記事を参考に

**今までの状態は以下**
・Dockerfile内ではhttpdのインストールと設定ファイルのコピーのみ
・docker-compose.ymlでhttpdの起動をしようとしていた
・/sbin/initもcomposeファイル側で実行

**記事を参考に下記に変更**
・Dockerfile内でhttpdサービスの起動まで（イメージの時点で起動している）
・/sbin/initもイメージ作成時に起動するようDockerfileに追記

本当はビルドし直しが嫌いなのでDockerfileでは最低限の事しかしたくなかったけど、Doｃｋｅｒ-Hubの公式情報として記載があるならそれが正しいのだろう、きっと。

・・・・・・・・・・

イメージのビルドが終わらない（通信環境弱者）
しかもパッケージのダウンロードでタイムアウト繰り返してビルド失敗して動作確認まで辿り着けず（通信環境弱者）
やっぱりやりたくないので、composeファイル側で起動する方法を再考する事にした。（まず通信環境再考しろ）