【Docker基礎】なぜbashを起動するとApacheが動かなくなるのか

 Docker コンテナ内に Apache(または他のソフトウェア)と bash を同時に動かしたいと考えたとき、実際には「bash か Apache のどちらか一方だけがメインプロセスとして動く」状態になってしまうケースがあります。
 「docker run で bash を指定すると、Apache が動かなくなるのはなぜ?」という疑問に答えるために、コンテナのプロセス構造やメインプロセスの考え方を理解しておきましょう。

コンテナでは「メインプロセス」が1つだけ

 Docker コンテナは、通常 1つのメインプロセス を持って動作します。イメージに書かれた「CMD」や「ENTRYPOINT」で指定されたソフトウェアがメインプロセスとして起動し、それが停止するとコンテナ自体も終了します。

  1. Apache コンテナ
    ・もともと httpd-foreground(Apache)をメインプロセスとして起動
    ・メインプロセスが走っている限りコンテナは動作し、HTTP リクエストを受け付ける。
  2. bash を起動するパターン
    ・メインプロセスとして bash が起動
    ・その場合、Apache は起動されない(実行されず、待機状態にならない)。

“乗っ取った” ように見える構造

 Docker で run コマンドの末尾に /bin/bash を指定すると、コンテナは bash がメインになってしまうため、Apache (httpd) は起動しないまま。
 Apache のコンテナイメージの CMD を上書きした状態とも言え、実行中は bash しか立ち上がらないのです。

具体的な例

# 例: Apache イメージ (httpd) を使い、末尾で bash を指定
docker run -it --name apache-container -p 8080:80 httpd /bin/bash
  • 起動するメインプロセス/bin/bash
  • Apache は起動されない → docker ps で見ても “Up” にはなるが、実際には “bash” が動いているだけ
  • exit すればコンテナ終了

どうすれば Apache と bash を両立できる?

  1. docker exec を使う
    ・まず docker run -d httpd などで Apache を起動 → メインプロセスは Apache
    ・追加で docker exec -it <コンテナ名> /bin/bash で bash に入る。
    ・この場合、メインプロセス (Apache) は走り続け、コンテナが停止しない。
  2. カスタム スクリプト で複数のサービスを起動
    ・ENTRYPOINT で bashhttpd の両方を起動するスクリプトを書き、並列に動かす手法
    ・ただし、単一プロセスを想定する Docker の設計とはやや相性が悪い(ベストプラクティスではない)。

なぜほかのソフトウェア(MySQL など)も同じ?

 Apache 以外のソフトウェア――MySQL、PostgreSQL、NGINX なども、イメージの ENTRYPOINT(または CMD)に記述されたメインプロセスが起動 しているだけです。

  • /bin/bash を指定 → そのプロセスがメインになる → もとのアプリは起動しない

まとめ

  1. コンテナは 1 つのメインプロセス を動かす設計
    • docker run [イメージ名] → 既定のメインプロセスが起動
  2. bash を指定すると、そのコンテナは bash がメイン
    • Apache などのソフトは起動しない
  3. Apache を動かしながら bash を操作するなら
    • docker exec -it <コンテナ名> /bin/bash で稼働中のコンテナ内部に入るのが便利

 結論として、“コンテナの改造” をしたいなら、apache 起動後に docker exec で bash に入るのがおすすめです。 docker run で bash を指定してしまうと Apache 自体が動かず、「bash が動いているだけのコンテナ」という状態になるため、そこから改造後に Apache を手動で起動する必要が出てきます。