こんにちは。よっしーです(^^)
今日は、dockerでapacheを起動させるときのトラブルシューティングをご紹介します。
dockerイメージに、amazonlinux:2 を使用して、apacheを起動させようとしたところ、エラーになったので、その時の対処方法を備忘に残すとともにシェアします。
実行環境
この記事で使用されているコマンドは下記の環境で実行されています。
% sw_vers
ProductName: macOS
ProductVersion: 13.2.1
BuildVersion: 22D68
% sysctl machdep.cpu.brand_string
machdep.cpu.brand_string: Apple M1 Max
% docker --version
Docker version 20.10.23, build 7155243
使用している docker desktop のバージョンは下図になります。
apacheが起動するまで
下記のDockerfileとdocker-compose.ymlを使用しました。
ディレクトリ構成
下記のディレクトリ構造で、ファイルを配置しています。
web
├── Dockerfile
└── docker-compose.yml
Dockerfile
FROM amazonlinux:2
# yum update & install
RUN yum update -y \
&& yum install -y \
systemd \
httpd
# httpd
RUN systemctl enable httpd
# init
CMD ["/sbin/init"]
docker-compose.yml
version: '3'
services:
web:
build: .
container_name: amzn-linux-2-web
privileged: true
ports:
- 8080:80
ビルド&起動
docker compose build
docker compose up -d
動作確認
ブラウザで http://localhost:8080/ にアクセスすると、何も表示されませんでした。
なぜだ。。。
原因調査
コンテナイメージに入って、コマンドを調査しました。まず、apacheの起動状態がどうなっているかをステータスを確認しようとしたところ下記のようなエラーになっていました。
% docker compose exec -it web bash
bash-4.2# systemctl status httpd
Failed to get D-Bus connection: No such file or directory
エラー解消
エラー文言を検索ワードとして、エラーの解消方法を調べたところ、下記のファイルを修正して、Docker Desktopを再起動すると解消ができることがわかりました。
% grep -n --color 'deprecatedCgroupv1' ~/Library/Group\ Containers/group.com.docker/settings.json
76: "deprecatedCgroupv1": false,
# deprecatedCgroupv1の値を true に修正
% vi ~/Library/Group\ Containers/group.com.docker/settings.json
% grep -n --color 'deprecatedCgroupv1' ~/Library/Group\ Containers/group.com.docker/settings.json
76: "deprecatedCgroupv1": true,
Docker Desktopを再起動する。
再ビルド&再起動
再ビルドは必要ないかもしれませんが、一応、再ビルドして起動させます。
docker compose build
docker compose up -d
動作確認
http://localhost:8080/ にアクセスすると、テストページが表示されましたので、無事、エラーの解消ができて、起動させることができました。
エラーメッセージの解説
Failed to get D-Bus connection: No such file or directory
このエラーメッセージは、プログラムがD-Busに接続できないことを示しています。
D-Busは、Linuxシステムでプロセス間通信を行うために使用されるシステムバスです。多くのディストリビューションでは、systemdやNetworkManagerなど、システムの重要な機能がD-Busを使用してコミュニケーションを行っています。
エラーメッセージのNo such file or directory
部分は、D-Busのソケットファイルが見つからなかったことを示しています。通常、D-Busのソケットファイルは/var/run/dbus/system_bus_socket
にありますが、Dockerコンテナ内で実行されるプロセスは、ホストシステムのファイルシステムを直接アクセスできないため、このファイルにアクセスできません。
このエラーが表示された場合、プログラムがD-Busに依存している場合は、D-Busを提供するサービスをDockerコンテナ内で実行する必要があります。ただし、Dockerコンテナ内でsystemdを実行することは推奨されていないため、代わりにプログラムによって提供される別の方法を使用する必要があるかもしれません。
systemctl を使用すること自体がよろしくなさそう。。。
deprecatedCgroupv1とは
deprecatedCgroupv1
は、DockerがLinuxカーネルの古いCgroupsシステム(Cgroups v1)を使用するかどうかを制御するDocker Desktopの設定の1つです。Cgroupsは、Linuxでプロセスのリソース利用を制御するための機能であり、Dockerはコンテナのリソース管理にCgroupsを使用しています。
Cgroups v1は、Linuxカーネル2.6.24以降でサポートされている古いバージョンのCgroupsであり、Cgroups v2に比べて制限が多く、より複雑な構成が必要です。Dockerは通常、ホストのLinuxカーネルがCgroups v2をサポートしている場合に、自動的にCgroups v2を使用します。ただし、環境によっては、Cgroups v1が必要な場合があります。
deprecatedCgroupv1
設定は、DockerがCgroups v1を使用するかどうかを制御します。設定が有効になっている場合、DockerはCgroups v1を使用します。設定が無効になっている場合、DockerはCgroups v2を使用します。
ただし、2021年以降のDocker Desktopでは、deprecatedCgroupv1
設定が非推奨になり、代わりにcgroupDriver
設定を使用することが推奨されています。cgroupDriver
設定には、systemd
、cgroupfs
、none
のいずれかを指定することができ、Cgroupsのバージョンやドライバーの使用方法を制御することができます。新しいバージョンのDocker Desktopでは、cgroupDriver
設定が提供されます。
Cgroupsとは
Cgroups(Control Groups)は、Linuxカーネルでプロセスグループを制御するための機能であり、CPU、メモリ、ディスクI/O、ネットワーク、およびその他のリソースの使用を制限できます。Cgroupsは、システム管理者がリソース制限を設定し、プロセスのパフォーマンスを最適化するための有用なツールです。
Cgroups v1は、カーネルバージョン2.6.24で最初にリリースされ、最も一般的に使用されているCgroupsバージョンでした。しかし、Cgroups v1にはいくつかの制限がありました。たとえば、階層的な構造がなく、管理が複雑で、メモリ管理が不十分であったり、I/O制限が正確でなかったりしました。
そのため、Cgroups v2が開発されました。Cgroups v2は、カーネルバージョン4.5で最初にリリースされ、Cgroups v1と比較して改善された制限を持っています。Cgroups v2は、階層的な構造をサポートし、管理が簡単で、メモリ管理が改善され、I/O制限が正確になりました。
Cgroups v1は今後サポートされなくなる可能性があり、代わりにCgroups v2が使用されるべきです。Cgroups v1を使用している場合は、Cgroups v2に移行することが推奨されています。
おわりに
今日は、dockerのトラブルシューティングをご紹介しました。
docker で systemctl を使用するのはやめたほうがよさそうですが、もし使わざるおえない状況の方で似たようなエラーに遭遇している場合は、上記のトラブルシューティングを試してみてください。
また明日お会いしましょう!
コメント