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 サーバーを起こさないとダメなのかも。
今日はここまで。
お問い合わせはお気軽に!
お問い合わせはないと思いますが、とりあえず。