Dockerトラブルシューティング:よくあるエラーと解決策ガイド 🛠️

Dockerは現代のソフトウェア開発とデプロイメントに不可欠なツールとなりました。コンテナ化技術により、アプリケーションの実行環境を簡単に構築、共有、実行できます。しかし、その便利さの一方で、利用中に様々なエラーに遭遇することも少なくありません。😭

この記事では、Docker初心者が陥りやすい一般的なエラーから、少し複雑な問題まで、具体的なエラーメッセージとその原因、そして効果的な解決策を詳しく解説します。エラーに直面しても慌てず、このガイドを参考に冷静に対処していきましょう!💪

よくあるエラーと対処法

具体的なエラーメッセージとその解決策を見ていきましょう。

エラー1: docker: command not found

🤔 原因

このエラーは、Dockerがシステムにインストールされていないか、インストールされていてもPATH環境変数が正しく設定されていない場合に発生します。

💡 対処法

  1. Dockerのインストール確認: まず、Dockerが正しくインストールされているか確認します。インストールされていない場合は、Docker公式サイトの手順に従ってインストールしてください。
  2. PATH環境変数の確認: Dockerがインストールされているにも関わらずエラーが出る場合、Dockerの実行ファイルへのパスがPATH環境変数に含まれていない可能性があります。

    LinuxやmacOSの場合、.bashrc.zshrcなどのシェル設定ファイルにDockerのパスを追加します。通常、Dockerは /usr/bin/docker/usr/local/bin/docker などにインストールされます。

    Windowsの場合、システムの環境変数設定でDockerのインストールディレクトリ(通常は C:\Program Files\Docker\Docker\resources\bin)をPATHに追加します。

  3. シェルの再起動または再ログイン: PATH設定を変更した後は、ターミナル(シェル)を再起動するか、システムに再ログインして変更を反映させてください。

エラー2: Cannot connect to the Docker daemon / permission denied while trying to connect to the Docker daemon socket

🤔 原因

このエラーは、主に以下の理由で発生します。

  • Dockerデーモン(Docker Engineのバックグラウンドサービス)が起動していない。
  • 現在のユーザーがDockerデーモンと通信するための権限を持っていない(特にLinux環境)。

💡 対処法

  1. Dockerデーモンの状態確認と起動:

    Linux (systemdを使用するシステム):

    sudo systemctl status docker
    # 起動していない場合
    sudo systemctl start docker
    # システム起動時に自動起動させる場合
    sudo systemctl enable docker

    macOS / Windows (Docker Desktop):

    Docker Desktopアプリケーションが起動しているか確認し、起動していなければ起動します。タスクトレイやメニューバーのアイコンの状態も確認しましょう。

  2. ユーザー権限の確認 (Linux):

    Linuxでは、Dockerコマンドを実行するためにsudoを使用するか、現在のユーザーをdockerグループに追加する必要があります。

    (推奨) ユーザーをdockerグループに追加する:

    # docker グループが存在しない場合は作成
    sudo groupadd docker
    
    # 現在のユーザーを docker グループに追加 ( ${USER} は現在のユーザー名に置き換えられます )
    sudo usermod -aG docker ${USER}

    重要: グループに追加した後、変更を有効にするためには一度ログアウトして再ログインするか、newgrp docker コマンドを実行して新しいグループセッションを開始する必要があります。システム再起動が必要な場合もあります。

    (非推奨) Dockerソケットのパーミッションを変更する:

    セキュリティリスクがあるため推奨されませんが、一時的な解決策として以下を実行できます。

    sudo chmod 666 /var/run/docker.sock
  3. Dockerサービスの再起動:

    上記を試しても解決しない場合、DockerサービスやDocker Desktopの再起動を試みてください。

    # Linux
    sudo systemctl restart docker
    
    # Windows (PowerShell - 管理者権限)
    Stop-Service docker
    Start-Service docker
    
    # macOS / Windows (Docker Desktop)
    Docker Desktopのメニューから Restart を選択するか、アプリを完全に終了して再起動します。

エラー4: Unable to find image 'イメージ名:タグ' locally / Error response from daemon: pull access denied for イメージ名, repository does not exist or may require 'docker login' / manifest for イメージ名:タグ not found

🤔 原因

これらのエラーは、Dockerが指定されたイメージを見つけられない場合に発生します。原因はいくつか考えられます。

  • イメージ名やタグが間違っている(タイポなど)。
  • 指定したイメージがローカルにもリモートリポジトリ(Docker Hubなど)にも存在しない。
  • プライベートリポジトリのイメージにアクセスしようとしているが、docker login していない、または権限がない。
  • ネットワークの問題でリモートリポジトリに接続できない。
  • Docker Hubなどでイメージ名やタグが変更された、または削除された。
  • (manifest not found の場合) 指定したタグが存在しない、または指定したプラットフォーム(CPUアーキテクチャ)向けのイメージが存在しない。

💡 対処法

  1. イメージ名とタグの確認:

    コマンドやDockerfileで指定しているイメージ名とタグが正しいか、タイポがないか再確認します。

    ローカルに存在するイメージを確認:

    docker images
  2. Docker Hub等でのイメージ存在確認:

    Docker Hub や使用している他のコンテナリポジトリで、指定したイメージ名とタグが存在するか検索して確認します。

  3. docker login の実行:

    プライベートリポジトリのイメージを使用している場合や、pull access denied エラーが出る場合は、リポジトリにログインする必要があります。

    # Docker Hub の場合
    docker login
    
    # 他のプライベートリポジトリの場合 (例: AWS ECR)
    # aws ecr get-login-password --region リージョン | docker login --username AWS --password-stdin アカウントID.dkr.ecr.リージョン.amazonaws.com
  4. ネットワーク接続の確認:

    一時的なネットワークの問題でリポジトリに接続できない可能性もあります。ネットワーク接続を確認してください。

  5. タグの指定:

    タグを指定せずにイメージ名を指定した場合、デフォルトでlatestタグが使用されます。latestタグが存在しないイメージもあるため、明示的に存在するタグを指定する必要がある場合があります。Docker Hub等で利用可能なタグを確認してください。

    docker pull イメージ名:特定のタグ
  6. プラットフォームの確認 (manifest not found):

    異なるCPUアーキテクチャ(例: M1 Mac (arm64) で amd64 イメージをプルしようとする)の場合、目的のプラットフォーム用のイメージが存在しないことがあります。docker build時に--platformオプションを指定するか、利用可能なプラットフォームのイメージタグを探します。

  7. イメージの再ビルド:

    ローカルでビルドしたイメージが見つからない場合、ビルドプロセス自体が失敗している可能性があります。ビルドログを確認し、再度ビルドしてみてください。

    docker build -t イメージ名:タグ .

エラー5: standard_init_linux.go:xxx: exec user process caused "no such file or directory"

🤔 原因

このエラーは、コンテナが起動しようとしている実行ファイル(DockerfileのENTRYPOINTCMDで指定されたもの)が見つからない場合に発生します。よくある原因は以下の通りです。

  • Dockerfile内のCOPYADD命令で、実行ファイルがコンテナ内の正しい場所にコピーされていない。
  • ENTRYPOINTCMDで指定されたパスが間違っている。
  • スクリプトファイルを実行しようとしているが、そのスクリプトの1行目(Shebang: #!/bin/sh など)で指定されたインタプリタ(例: /bin/sh)がコンテナ内に存在しない、またはパスが違う。
  • スクリプトファイルがWindows環境で作成され、改行コードがCRLF (\r\n) になっている。LinuxコンテナはLF (\n) を期待するため、インタプリタが正しく認識できない(例: /bin/sh\r を見つけようとしてしまう)。

💡 対処法

  1. パスの確認: Dockerfile内のCOPY/ADD命令と、ENTRYPOINT/CMDで指定しているパスが正しいか、ファイルが期待される場所に存在するか確認します。

    デバッグのために、一時的にENTRYPOINT/CMDsleep infinityなどに変更してコンテナを起動し、docker exec -it <container_id> bash (または sh) でコンテナ内に入り、lsコマンドなどでファイルパスを確認すると良いでしょう。

    # Dockerfile の例 (デバッグ用)
    FROM ubuntu:latest
    COPY ./my_script.sh /app/my_script.sh
    # CMD ["/app/my_script.sh"] # 元のCMDはコメントアウト
    CMD ["sleep", "infinity"]
    # コンテナ起動後
    docker exec -it <container_id> ls /app
  2. Shebangの確認: スクリプトファイルを実行している場合、1行目のShebang (例: #!/bin/sh, #!/bin/bash, #!/usr/bin/env node など) が正しく、指定されたインタプリタがコンテナ内に存在することを確認します。Alpine Linuxベースのイメージなど、bash がデフォルトで入っていない場合もあるので注意が必要です。
  3. 改行コードの修正: スクリプトファイルがWindowsで作成された場合、改行コードをLFに変換する必要があります。テキストエディタの設定で改行コードをLFに変更して保存するか、dos2unixのようなツールを使用します。
    # Linux/macOS で dos2unix がインストールされている場合
    dos2unix your_script.sh

    Gitを使用している場合、.gitattributesファイルでテキストファイルの改行コードを自動的にLFに変換するように設定することも有効です。

    * text=auto eol=lf
  4. 実行権限の付与: スクリプトファイルに実行権限がない場合もあります。Dockerfile内でRUN chmod +x /path/to/your/script.shのように実行権限を付与します。
    FROM ubuntu:latest
    COPY ./my_script.sh /app/my_script.sh
    RUN chmod +x /app/my_script.sh
    CMD ["/app/my_script.sh"]

エラー6: standard_init_linux.go:xxx: exec user process caused "exec format error"

🤔 原因

このエラーの最も一般的な原因は、**CPUアーキテクチャの不一致**です。

  • 異なるCPUアーキテクチャ向けにビルドされたDockerイメージを実行しようとしている。
    • 例: Apple Silicon (M1/M2/M3, arm64アーキテクチャ) でビルドしたイメージを、Intel/AMD CPU (amd64/x86_64アーキテクチャ) のサーバー(AWS EC2、ECS Fargateなど)で実行しようとした場合。
    • 例: amd64環境でビルドしたイメージを、Raspberry Pi (arm) や AWS Graviton (arm64) で実行しようとした場合。
  • 実行しようとしているファイルが、実際には実行可能ファイルではなく、スクリプトファイルのShebang (#!/bin/sh など) が欠落している、または間違っている。

2023年頃からApple Silicon搭載Macの普及に伴い、ローカル(arm64)でビルドしたイメージをクラウド環境(amd64)にデプロイする際にこのエラーに遭遇するケースが増えています。

💡 対処法

  1. ターゲットアーキテクチャを指定してビルド:

    Dockerイメージをビルドする際に、実行環境のCPUアーキテクチャに合わせて--platformオプションを指定します。これにより、クロスビルドが可能になります。

    例: arm64マシン(M1 Macなど)で、amd64環境向けのイメージをビルドする場合:

    # Docker Buildx (最近のDockerバージョンではデフォルトで利用可能) が必要
    docker buildx build --platform linux/amd64 -t your-image-name:tag . --load

    (--load はビルド結果をローカルのDockerイメージとしてロードする場合に指定します。リモートリポジトリに直接プッシュする場合は --push を使用します。)

    docker-compose.yml を使用している場合は、各サービスのビルド設定に `platform` を指定できます:

    services:
      your_service:
        build:
          context: .
          platform: linux/amd64 # 実行環境に合わせる
  2. 実行環境と同じアーキテクチャでビルド:

    可能であれば、イメージを実行する環境と同じCPUアーキテクチャのマシンやCI/CD環境でDockerイメージをビルドします。

  3. マルチアーキテクチャイメージの利用:

    公式イメージなどでは、複数のアーキテクチャに対応したマニフェストリスト(マルチアーキテクチャイメージ)が提供されていることがあります。この場合、Dockerは実行環境に適したアーキテクチャのイメージレイヤーを自動的に選択してくれます。可能であれば、このような公式イメージをベースにするのが良いでしょう。

  4. スクリプトファイルのShebang確認:

    アーキテクチャが一致しているはずなのにエラーが出る場合は、実行しようとしているファイルがスクリプトで、Shebang (#!/bin/sh など) が欠落または間違っていないか確認します。

エラー8: コンテナがすぐに終了してしまう (Exited (0), Exited (1), Exited (137) など)

🤔 原因

docker rundocker-compose up でコンテナを起動しても、すぐに終了してしまうことがあります。docker ps -a で確認すると、STATUSが Exited (終了コード) と表示されます。終了コードによって原因が異なります。

  • Exited (0):
    • コンテナ内で実行されるべきメインプロセスが正常に完了し、他にフォアグラウンドで実行するプロセスがないため終了した。
    • これは必ずしもエラーではありません。バッチ処理のような一度実行したら終わるタイプのコンテナでは正常な動作です。
    • Webサーバーのように継続的に実行されるべきコンテナがこの状態で終了する場合、設定ミスやプロセスがバックグラウンドで起動してしまっている可能性があります。
  • Exited (1) (または0以外の一般的な終了コード):
    • コンテナ内のメインプロセスがエラーにより異常終了した。
    • 設定ファイルが見つからない、必要な環境変数が設定されていない、アプリケーション内部のエラーなど、様々な原因が考えられます。
  • Exited (137):
    • コンテナが使用できるメモリ量を超過し、ホストOSのOOM Killer (Out Of Memory Killer) によって強制終了させられた。
    • SIGKILLシグナル (9) を受け取って終了した場合、終了コードは 128 + 9 = 137 となります。
  • Exited (139):
    • セグメンテーション違反 (Segmentation Fault) が発生した。
    • プログラムのバグや、不正なメモリアクセスなどが原因です。SIGSEGVシグナル (11) を受け取った場合、終了コードは 128 + 11 = 139 となります。

💡 対処法

  1. コンテナログの確認:

    まず最初に、コンテナのログを確認してエラーメッセージや原因の手がかりを探します。これが最も重要なステップです。

    # コンテナ名またはIDを指定
    docker logs <container_name_or_id>

    ログに詳細なエラーが出力されていることが多いです。

  2. Exited (0) の場合:
    • 意図した動作(バッチ処理など)であれば問題ありません。
    • 継続的に実行したいプロセス(Webサーバーなど)が終了してしまう場合:
      • DockerfileのCMDENTRYPOINTで指定したプロセスがフォアグラウンドで実行され続けるものか確認します。デーモン化するオプション (例: nginx -g 'daemon off;') が必要かもしれません。
      • 起動スクリプトがバックグラウンドでプロセスを実行してすぐに終了していないか確認します。
  3. Exited (1) など異常終了の場合:
    • コンテナログを詳細に確認し、エラーの原因を特定します (設定ミス、ファイル不足、パーミッションエラー、アプリケーション固有のエラーなど)。
    • 一時的にコンテナのCMDENTRYPOINTをインタラクティブシェル (bash, sh) に変更して起動し、コンテナ内部で手動でプロセスを実行してみることで、エラーの原因を切り分けることができます。
    • docker run -it --entrypoint bash イメージ名:タグ
  4. Exited (137) (OOM Killer) の場合:
    • コンテナに割り当てるメモリ上限を増やします。
      • docker run の場合: -m または --memory オプション (例: -m 2g)
      • docker-compose.yml の場合: deploy.resources.limits.memory (例: memory: 2G)
      • Docker Desktop の場合: 設定画面 (Settings > Resources > Advanced) でDocker VM全体のメモリ割り当てを増やす。
    • アプリケーションのメモリ使用量を最適化します。
    • ホストマシンのメモリ自体が不足している場合は、物理メモリを増設するか、よりスペックの高いマシンを使用します。
    • カーネルログ (dmesg など) を確認し、OOM Killerが動作した記録を確認します。
  5. Exited (139) (Segmentation Fault) の場合:
    • コンテナログやアプリケーション固有のログ、コアダンプなどを確認し、どの処理でセグメンテーション違反が発生したか特定します。
    • 使用しているライブラリやプログラムのバージョンにバグがないか確認します。
    • ベースイメージやライブラリのバージョンを変更してみます。

エラー9: ディスク容量不足 (no space left on device)

🤔 原因

Dockerを使用していると、イメージ、コンテナ、ボリューム、ビルドキャッシュなどがディスク容量を圧迫し、このエラーが発生することがあります。特にビルドを頻繁に行ったり、多くのコンテナを停止したまま放置していると発生しやすいです。

Dockerがデータを保存するデフォルトの場所 (Linuxでは通常 /var/lib/docker) があるファイルシステムの空き容量がなくなった、またはDocker Desktopなどの仮想環境で割り当てられたディスクイメージのサイズ上限に達した場合に発生します。

💡 対処法

  1. Dockerのディスク使用状況の確認:

    まず、Dockerがどれくらいのディスク容量を使用しているか確認します。

    docker system df

    これにより、イメージ、コンテナ、ローカルボリューム、ビルドキャッシュがそれぞれどれくらいの容量を使用しているかが表示されます。

  2. 不要なDockerリソースの削除 (Prune):

    Dockerには、使用されていないリソースを一括で削除する便利なコマンドがあります。

    注意: 以下のコマンドは停止中のコンテナ、未使用のネットワーク、danglingイメージ (どのタグからも参照されていない中間イメージ)、ビルドキャッシュを削除します。--volumes を付けると未使用のボリュームも削除されます。削除対象をよく確認してから実行してください。

    # 停止中のコンテナ、未使用のネットワーク、danglingイメージ、ビルドキャッシュを削除
    docker system prune
    
    # 上記に加えて、未使用のボリュームも削除
    docker system prune --volumes
    
    # 上記に加えて、どのコンテナからも使用されていない全てのイメージ (danglingでないものも含む) も削除 (より強力)
    docker system prune -a --volumes

    個別に削除することも可能です:

    # 停止中の全コンテナを削除
    docker container prune
    
    # danglingイメージを削除
    docker image prune
    
    # 未使用の全イメージを削除
    docker image prune -a
    
    # 未使用のボリュームを削除
    docker volume prune
    
    # 未使用のネットワークを削除
    docker network prune
    
    # ビルドキャッシュを削除
    docker builder prune
  3. 特定のコンテナ、イメージ、ボリュームの削除:

    不要であることがわかっている特定の要素を手動で削除します。

    docker rm <container_id_or_name> ... # コンテナ削除
    docker rmi <image_id_or_name> ...    # イメージ削除
    docker volume rm <volume_name> ... # ボリューム削除
  4. Docker Desktopのディスクイメージサイズ変更 (macOS/Windows):

    Docker Desktopを使用している場合、設定画面 (Settings > Resources > Advanced) で Dockerが使用する仮想ディスクイメージの上限サイズ (Virtual disk limit) を増やすことができます。変更後はDocker Desktopの再起動が必要です。

  5. Dockerデータディレクトリの移動 (Linux):

    /var/lib/docker があるパーティションの容量が小さい場合、より容量の大きい別のファイルシステムにDockerのデータディレクトリを移動させることができます。設定ファイル (/etc/docker/daemon.json) で data-root を指定し、Dockerデーモンを再起動します。

    {
      "data-root": "/path/to/new/docker/data"
    }
  6. ビルドキャッシュの管理:

    マルチステージビルドを活用して最終的なイメージサイズを小さくしたり、不要なファイルがイメージに含まれないように.dockerignoreを適切に設定したりすることで、ビルドキャッシュやイメージサイズを抑制できます。

  7. inode不足の確認 (Linux):

    ディスク容量に空きがあるのに no space left on device が出る場合、ディスク容量ではなくinode(ファイルやディレクトリの管理情報)の数が上限に達している可能性があります。特に小さなファイルが大量にある場合に起こりえます。

    df -ih

    IUse% が100%に近い場合はinode不足が原因です。不要なファイルを削除するか、ファイルシステムを再フォーマットする必要があります。

エラー10: ネットワーク関連エラー (コンテナ間通信、外部アクセスなど)

🤔 原因

Dockerコンテナのネットワーク設定は柔軟ですが、それが原因で問題が発生することもあります。

  • コンテナ間通信ができない:
    • コンテナが同じDockerネットワークに接続されていない。
    • コンテナ名での名前解決ができていない (デフォルトのbridgeネットワークでは通常できない)。
    • ファイアウォール設定 (ホストOSまたはコンテナ内) で通信がブロックされている。
  • コンテナから外部ネットワーク (インターネット) にアクセスできない:
    • DockerホストのDNS設定が正しくない、またはコンテナに伝搬されていない。
    • ホストOSのファイアウォールやプロキシ設定で外部へのアクセスが妨げられている。
    • Dockerネットワークの設定 (例: IPマスカレード) に問題がある。
  • 外部からコンテナの公開ポートにアクセスできない:
    • ポートマッピング (-p オプションや ports 設定) が正しく行われていない。
    • ホストOSのファイアウォールで、公開しようとしているホストポートへのアクセスが許可されていない。
    • クラウド環境 (AWS EC2など) の場合、セキュリティグループやネットワークACLでポートが開けられていない。
    • コンテナ内のアプリケーションが、0.0.0.0:: (すべてのインターフェース) ではなく、127.0.0.1 (localhost) のみをリッスンしている。

💡 対処法

  1. コンテナ間通信:
    • 通信したいコンテナ群を、デフォルトのbridgeネットワークではなく、ユーザー定義のブリッジネットワークに接続します。docker network create my-network で作成し、docker run --network my-network ...docker-compose.yml で指定します。ユーザー定義ネットワーク内では、コンテナ名で名前解決が可能です。
    • docker network inspect <network_name> で、コンテナが意図したネットワークに接続されているか確認します。
    • コンテナ内から ping <他のコンテナ名>curl http://<他のコンテナ名>:<ポート> などで接続を試します。
    • ホストOSやコンテナ内のファイアウォール設定を確認します (iptables, ufw など)。
    # docker-compose.yml の例
    version: '3.8'
    services:
      service_a:
        image: image_a
        networks:
          - my-app-net
        # ...
      service_b:
        image: image_b
        networks:
          - my-app-net
        # service_a に http://service_a:port でアクセス可能
        # ...
    networks:
      my-app-net:
        driver: bridge
  2. コンテナから外部へのアクセス:
    • コンテナ内から外部ドメイン (例: google.com) に pingcurl でアクセスできるか試します。
    • コンテナ内のDNS設定を確認します (cat /etc/resolv.conf)。通常はホストの設定を引き継ぐか、Dockerが提供するDNS (127.0.0.11) を使用します。
      docker run --rm busybox nslookup google.com
    • 必要であれば、docker run 時に --dns オプションでDNSサーバーを指定したり、Dockerデーモンの設定 (/etc/docker/daemon.json) でDNSを指定できます。
    • ホストOSのファイアウォールやプロキシ設定を確認します。プロキシ環境下では、コンテナにもプロキシ設定 (環境変数 HTTP_PROXY, HTTPS_PROXY) が必要です。
  3. 外部からコンテナへのアクセス:
    • docker ps でポートマッピング (PORTS 列) が正しく設定されているか確認します (例: 0.0.0.0:8080->80/tcp)。
    • ホストOS上で curl http://localhost:<ホストポート>telnet localhost <ホストポート> で接続できるか試します。
    • ホストOSのファイアウォール設定を確認し、必要なポートを開放します。
    • クラウド環境では、セキュリティグループやネットワークACLの設定を確認します。
    • コンテナ内のアプリケーションが 0.0.0.0 または :: でリッスンしているか確認します。127.0.0.1 でリッスンしている場合、ホストからのポートマッピング経由ではアクセスできません。
  4. Dockerネットワークの再作成:

    原因が特定できないネットワークの問題が発生した場合、関連するコンテナを停止し、docker network rm <network_name> でネットワークを削除してから再作成 (または docker-compose down してから docker-compose up) することで解決することがあります。

エラー調査のヒント 🕵️‍♀️

エラーに遭遇した際、原因を特定するために役立つ基本的なコマンドやアプローチを紹介します。

  • コンテナログの確認 (docker logs):

    最も基本的なトラブルシューティング手法です。コンテナ内で実行されているアプリケーションが出力する標準出力・標準エラー出力を確認できます。

    # 特定のコンテナのログを表示
    docker logs <container_name_or_id>
    
    # ログをリアルタイムで表示 (フォローモード)
    docker logs -f <container_name_or_id>
    
    # 末尾から指定した行数のログを表示
    docker logs --tail 100 <container_name_or_id>
    
    # タイムスタンプ付きで表示
    docker logs -t <container_name_or_id>
  • 実行中のコンテナ内に入る (docker exec):

    起動中のコンテナに入り、内部の状態を確認したり、コマンドを実行したりできます。

    # コンテナ内で bash シェルを起動 (インタラクティブモード + TTY)
    docker exec -it <container_name_or_id> bash
    
    # bash がない場合は sh を試す
    docker exec -it <container_name_or_id> sh
    
    # コンテナ内で特定のコマンドを実行
    docker exec <container_name_or_id> ls -l /app

    コンテナ内に入って、ファイルの存在確認、設定ファイルの確認、ネットワーク疎通確認 (ping, curl) などが行えます。

  • コンテナ/イメージ/システム情報の確認 (docker inspect, docker version, docker info):

    コンテナやイメージ、Dockerシステム全体の詳細な構成情報をJSON形式で確認できます。

    # コンテナの詳細情報を表示 (ネットワーク設定、マウント情報など)
    docker inspect <container_name_or_id>
    
    # イメージの詳細情報を表示 (レイヤー情報、環境変数など)
    docker inspect <image_name_or_id>
    
    # Docker のバージョン情報を表示 (Client/Server)
    docker version
    
    # Docker システム全体の情報を表示 (ストレージドライバ、ログドライバ、リソース状況など)
    docker info
  • リソース使用状況の確認 (docker stats):

    実行中のコンテナが使用しているCPU、メモリ、ネットワークI/O、ディスクI/Oなどのリソース状況をリアルタイムで確認できます。

    # 全ての実行中コンテナのリソース使用状況を表示
    docker stats
    
    # 特定のコンテナのみ表示
    docker stats <container_name_or_id_1> <container_name_or_id_2>
  • Dockerデーモンログの確認:

    コンテナ自体の問題ではなく、Dockerデーモン自体に問題がある場合(起動失敗、接続エラーなど)、デーモンのログを確認することが有効です。

    Linux (systemd):

    sudo journalctl -u docker.service

    Docker Desktop (macOS/Windows): Docker Desktopの Troubleshoot メニューからログを確認したり、診断を実行したりできます。

まとめ ✨

Dockerは強力なツールですが、様々な要因でエラーが発生することがあります。しかし、エラーメッセージを注意深く読み、ログを確認し、基本的なトラブルシューティングコマンドを活用することで、多くの問題は解決可能です。

今回紹介したエラー以外にも、環境固有の問題や、より複雑な問題が発生することもあります。そのような場合は、公式ドキュメントを参照したり、Stack Overflowや各種コミュニティフォーラムで類似の事例を探したり、質問したりすることも有効です。

エラーは学びの機会でもあります 🎓。焦らず、一つ一つ原因を特定し、解決していくことで、Dockerへの理解を深めていきましょう! Happy Dockering! 🐳