トラブルシュート!! Docker で Apache HTTP サーバーを動かす話

(更新

Error with Apache on Docker linked to Linux’s seccomp and clone call.

相模原市で IoT 設計を受託しているファームロジックスです。

今日は、私の専門外の話になりますが、Docker 上で Apache HTTP サーバーを動かす話題です。なんだか当たり前なテーマなので、すんなり動くと思ったのですが、かなり苦労してしまった、というのが話の発端です。

私の使っている Docker のバージョンが古いのか、このような問題で悩んでいる人が少ないようで、参考になる情報が見つけにくいので、記事としてまとめさせて頂きました。

Apache httpd の公式イメージを入手する

まずはこちらのサイトを参考にしました。

非常にあっさり書かれていて、なんだか簡単にできそうです。

まずは手元の Docker ホストで試してみましょう。Docker のバージョンは、Debian 10(Buster)上の 18.09.7 です。かなり古いです。

$ docker run -dit --name my-apache-app -p 8080:80 \
  -v "$PWD":/usr/local/apache2/htdocs/ httpd:2.4

起動させると、次のように、すぐ exit してしまいます。。。

$ docker ps -a
CONTAINER ID  IMAGE      COMMAND             CREATED        STATUS                    PORTS  NAMES
5686b9165b94  httpd:2.4  "httpd-foreground"  7 seconds ago  Exited (0) 2 seconds ago         my-apache-app

動かない原因を調べる

まずは、-dオプションを外してフォアグラウンドで動かしてみましょう。

$ docker run -it --name my-apache-app -p 8080:80 \
  -v "$PWD":/usr/local/apache2/htdocs/ httpd:2.4
(snip)
[Thu Jul 27 01:14:01.627441 2023] [mpm_event:alert] [pid 8:tid 139623774713728] (1)Operation not permitted: AH00480: ap_thread_create: unable to create worker thread
[Thu Jul 27 01:14:01.629769 2023] [mpm_event:alert] [pid 9:tid 139623774713728] (1)Operation not permitted: AH00480: ap_thread_create: unable to create worker thread
[Thu Jul 27 01:14:01.631317 2023] [mpm_event:alert] [pid 7:tid 139623774713728] (1)Operation not permitted: AH00480: ap_thread_create: unable to create worker thread
[Thu Jul 27 01:14:03.627803 2023] [mpm_event:alert] [pid 1:tid 139623774713728] AH02324: A resource shortage or other unrecoverable failure was encountered before any child process initialized successfully... httpd is exiting!

「Operation not permitted: AH00480: ap_thread_create: unable to create worker thread」というのが、すぐに exit してしまう理由のエラーのようです。

ネットで調べると、メモリ不足だ、生成するスレッドの数が制限にかかっているのだ、スタックサイズを小さくしてやれば良い、などの情報が見つかります。しかし、いろいろやってみたのですが、問題は解決しませんでした。

Linux の seccomp が関係しているぽい

1時間以上も原因が分からなかったのですが、「Operation not permitted」と Docker というキーワードで検索していたところ、次のような貴重な情報を見つけました。

どうも、Linux の seccomp という機能を使った、Docker のセキュリティ機能が httpd スレッド生成の邪魔をしているように思われたので、--security-opt="seccomp=unconfined" オプションを試してみることにしました。

$ docker run -it --security-opt="seccomp=unconfined" \
  --name my-apache-app -p 8080:80 \
  -v "$PWD":/usr/local/apache2/htdocs/ httpd:2.4
(snip)
[Thu Jul 27 01:23:08.937114 2023] [mpm_event:notice] [pid 1:tid 139894356268928] AH00492: caught SIGWINCH, shutting down gracefully

これで、unable to create worker thread のエラーは出なくなりました。httpd が勝手に終了してしまいますが、これは -d オプションを外せば解決します。

ただし、この方法はセキュリティ的に穴を空けることになるので、公開用 HTTP サーバーとしては使わないほうが良いと思います。

追記: GitHub の issue に議論を見つけた

ここに議論を見つけました。

This is going to be a seccomp-related failure — you’ll want to update libseccomp2, Docker, and runc on your host.

Docker や libseccomp2 をアップデートするのが、正しいやり方のようです。私の環境では、他の Docker コンテナに影響を与えてしまうと面倒なので、今回はやめておきます。そろそろ、新しい Docker サーバーを起こさないとダメなのかも。

今日はここまで。

お問い合わせはお気軽に!

お問い合わせはないと思いますが、とりあえず。

お問い合わせを頂いた後、継続して営業活動をしたり、ニュースレター等をお送りしたりすることはございません。
御返答は 24時間以内(営業時間中)とさせて頂いております。もし返答が届かない場合、何らかの事情でメールが不達となっている可能性がございます。大変お手数ですが、別のメールアドレス等で督促頂けますと幸いです。