Docker コンテナ停止の謎を解く:エラーログの読み方入門
Docker コンテナが起動しない場合に、ログを確認して問題を特定する方法についての記事です。
例えば、`docker logs` コマンドを使用してログを確認し、エラーメッセージを解析する手順を説明する。
Docker コンテナの状態確認
Docker コンテナの起動状態を確認する基本的なコマンドについて説明します。
起動コンテナの確認
sudo docker ps
起動コンテナの確認例
これらの出力から、どのコンテナがどのような状態であるかを把握できます。
[user-id@123-456-789 ]$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3939e6e18b4d nginxproxy/acme-companion "/bin/bash /app/entr…" 15 seconds ago Up 13 seconds letsencrypt
994c1d14cf6b nginxproxy/nginx-proxy "/app/docker-entrypo…" 15 seconds ago Up 14 seconds 0.0.0.0:80->80/ tcp, 0.0.0.0:443->443/tcp nginx-proxy
上記コマンドで起動しているモノが分かります。
起動させたのに起動していないとき、Docker コンテナの停止しているコンテナは次のコマンドで確認できます。
sudo docker ps -a
コンテナの停止状態も含めた例
起動中のコンテナも表示されています。STATUS の列で停止しているモノを確認します。
STATUS の Exited は停止したものを表しています。
[user-id@123-456-789]$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
67db1cb5643d nginx:alpine "/docker-entrypoint.…" 53 seconds ago Exited (1) 51 seconds ago nginx-web
3939e6e18b4d nginxproxy/acme-companion "/bin/bash /app/entr…" 53 seconds ago Up 51 seconds letsencrypt
994c1d14cf6b nginxproxy/nginx-proxy "/app/docker-entrypo…" 53 seconds ago Up 51 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp nginx-proxy
異常終了したコンテナのログを確認する方法
コンテナのログを確認する基本コマンド
「sudo docker logs container-name」で Docker コンテナのログを確認できます。
1つ上の 「 sudo docker ps -a」の実行例で停止しているコンテナ名「nginx-web」を例で表すと次の通りです。
sudo docker logs nginx-web
ログの例
[user-id@123-456-789]$ sudo docker logs nginx-web
[sudo] password for user-id:
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: can not modify /etc/nginx/conf.d/default.conf (read-only file system?)
/docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2024/03/26 01:12:30 [emerg] 1#1: cannot load certificate "/etc/nginx/certs/default.crt": BIO_new_file() failed (SSL: error:80000002:system library::No such file or directory:calling fopen(/etc/nginx/certs/default.crt, r) error:10000080:BIO routines::no such file)
nginx: [emerg] cannot load certificate "/etc/nginx/certs/default.crt": BIO_new_file() failed (SSL: error:80000002:system library::No such file or directory:calling fopen(/etc/nginx/certs/default.crt, r) error:10000080:BIO routines::no such file)
ログの解釈
ここでログの細かい解説はしませんが、時間を割いて英文を読むか、生成AIなどにログの各行の意味を読み解いてもらうと仕事が捗るでしょう。
上記ログの要約
このログから、主に二つの問題が見つかります:
設定ファイル( /etc/nginx/conf.d/default.conf )が読み取り専用のファイルシステム上にあり、変更ができない状態です。
SSL証明書が見つからず、nginxが起動できない問題があります。
これらの問題を解決するには、読み取り専用の問題を解決し、必要なSSL証明書を適切な場所に配置する必要があります。
ログを生成 AI で解析するときのアドバイス
エラーログなどを全てコピーして、生成 AI に貼りつればピンポイントで解答は帰ってきます。
例えば、「下記のエラーログの問題点と解決案を教えて」と付け加えれば。
しかし、ログで何が起きているか、細かく確認したいときは一言「ログの 1つ 1つ を日本語で解説して」と付け加えると分かりやすいときがあります。
まとめ
ログなどは自分で読み解ければそれが一番ベストですが、時間コストを考えると ChatGTP-4 などを代表とする生成 AI に任せた方が効率がよいでしょう。
生成 AI はログを読み込ませると、解説をまとめを出してくれます。
詳細な文脈を理解する場合は英文の原文を読めるようにしておきたいですね。