Dockerは現代のソフトウェア開発とデプロイメントに不可欠なツールとなりました。コンテナ化技術により、アプリケーションの実行環境を簡単に構築、共有、実行できます。しかし、その便利さの一方で、利用中に様々なエラーに遭遇することも少なくありません。😭
この記事では、Docker初心者が陥りやすい一般的なエラーから、少し複雑な問題まで、具体的なエラーメッセージとその原因、そして効果的な解決策を詳しく解説します。エラーに直面しても慌てず、このガイドを参考に冷静に対処していきましょう!💪
よくあるエラーと対処法
具体的なエラーメッセージとその解決策を見ていきましょう。
エラー1: docker: command not found
🤔 原因
このエラーは、Dockerがシステムにインストールされていないか、インストールされていてもPATH環境変数が正しく設定されていない場合に発生します。
💡 対処法
- Dockerのインストール確認: まず、Dockerが正しくインストールされているか確認します。インストールされていない場合は、Docker公式サイトの手順に従ってインストールしてください。
-
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に追加します。 - シェルの再起動または再ログイン: PATH設定を変更した後は、ターミナル(シェル)を再起動するか、システムに再ログインして変更を反映させてください。
エラー2: Cannot connect to the Docker daemon
/ permission denied while trying to connect to the Docker daemon socket
🤔 原因
このエラーは、主に以下の理由で発生します。
- Dockerデーモン(Docker Engineのバックグラウンドサービス)が起動していない。
- 現在のユーザーがDockerデーモンと通信するための権限を持っていない(特にLinux環境)。
💡 対処法
-
Dockerデーモンの状態確認と起動:
Linux (systemdを使用するシステム):
sudo systemctl status docker # 起動していない場合 sudo systemctl start docker # システム起動時に自動起動させる場合 sudo systemctl enable docker
macOS / Windows (Docker Desktop):
Docker Desktopアプリケーションが起動しているか確認し、起動していなければ起動します。タスクトレイやメニューバーのアイコンの状態も確認しましょう。
-
ユーザー権限の確認 (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
-
Dockerサービスの再起動:
上記を試しても解決しない場合、DockerサービスやDocker Desktopの再起動を試みてください。
# Linux sudo systemctl restart docker # Windows (PowerShell - 管理者権限) Stop-Service docker Start-Service docker # macOS / Windows (Docker Desktop) Docker Desktopのメニューから Restart を選択するか、アプリを完全に終了して再起動します。
エラー3: Error response from daemon: driver failed programming external connectivity on endpoint ... Bind for 0.0.0.0:XXXX failed: port is already allocated
🤔 原因
このエラーは、コンテナを起動しようとした際に指定したホスト側のポート(XXXX
の部分)が、すでに他のプロセスやコンテナによって使用されている場合に発生します。
💡 対処法
-
ポートを使用しているプロセスの特定:
どのプロセスがそのポートを使用しているかを確認します。
Linux / macOS:
# XXXX を実際のポート番号に置き換える sudo lsof -i :XXXX # または sudo netstat -tulnp | grep XXXX
Windows (コマンドプロンプト or PowerShell):
# XXXX を実際のポート番号に置き換える netstat -ano | findstr "XXXX"
これにより、ポートを使用しているプロセスのPID(プロセスID)がわかります。
-
競合するプロセスの停止:
特定したプロセスが不要であれば、停止します。
Linux / macOS:
# PID を実際のプロセスIDに置き換える sudo kill PID
Windows (コマンドプロンプト or PowerShell – 管理者権限):
# PID を実際のプロセスIDに置き換える taskkill /PID PID /F
もし競合しているのが別のDockerコンテナであれば、そのコンテナを停止または削除します。
# コンテナ名またはIDを指定 docker stop <container_name_or_id> docker rm <container_name_or_id>
-
コンテナで使用するホストポートの変更:
競合するプロセスを停止できない場合は、Dockerコンテナで使用するホスト側のポート番号を変更します。
docker run
コマンドの場合:# ホスト側のポートを YYYY に変更 docker run -p YYYY:コンテナポート ... イメージ名
docker-compose.yml
の場合:services: your_service: ports: - "YYYY:コンテナポート" # ホスト側のポートを YYYY に変更
エラー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アーキテクチャ)向けのイメージが存在しない。
💡 対処法
-
イメージ名とタグの確認:
コマンドやDockerfileで指定しているイメージ名とタグが正しいか、タイポがないか再確認します。
ローカルに存在するイメージを確認:
docker images
-
Docker Hub等でのイメージ存在確認:
Docker Hub や使用している他のコンテナリポジトリで、指定したイメージ名とタグが存在するか検索して確認します。
-
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
-
ネットワーク接続の確認:
一時的なネットワークの問題でリポジトリに接続できない可能性もあります。ネットワーク接続を確認してください。
-
タグの指定:
タグを指定せずにイメージ名を指定した場合、デフォルトで
latest
タグが使用されます。latest
タグが存在しないイメージもあるため、明示的に存在するタグを指定する必要がある場合があります。Docker Hub等で利用可能なタグを確認してください。docker pull イメージ名:特定のタグ
-
プラットフォームの確認 (
manifest not found
):異なるCPUアーキテクチャ(例: M1 Mac (arm64) で amd64 イメージをプルしようとする)の場合、目的のプラットフォーム用のイメージが存在しないことがあります。
docker build
時に--platform
オプションを指定するか、利用可能なプラットフォームのイメージタグを探します。 -
イメージの再ビルド:
ローカルでビルドしたイメージが見つからない場合、ビルドプロセス自体が失敗している可能性があります。ビルドログを確認し、再度ビルドしてみてください。
docker build -t イメージ名:タグ .
エラー5: standard_init_linux.go:xxx: exec user process caused "no such file or directory"
🤔 原因
このエラーは、コンテナが起動しようとしている実行ファイル(DockerfileのENTRYPOINT
やCMD
で指定されたもの)が見つからない場合に発生します。よくある原因は以下の通りです。
- Dockerfile内の
COPY
やADD
命令で、実行ファイルがコンテナ内の正しい場所にコピーされていない。 ENTRYPOINT
やCMD
で指定されたパスが間違っている。- スクリプトファイルを実行しようとしているが、そのスクリプトの1行目(Shebang:
#!/bin/sh
など)で指定されたインタプリタ(例:/bin/sh
)がコンテナ内に存在しない、またはパスが違う。 - スクリプトファイルがWindows環境で作成され、改行コードがCRLF (
\r\n
) になっている。LinuxコンテナはLF (\n
) を期待するため、インタプリタが正しく認識できない(例:/bin/sh\r
を見つけようとしてしまう)。
💡 対処法
-
パスの確認: Dockerfile内の
COPY
/ADD
命令と、ENTRYPOINT
/CMD
で指定しているパスが正しいか、ファイルが期待される場所に存在するか確認します。デバッグのために、一時的に
ENTRYPOINT
/CMD
をsleep 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
-
Shebangの確認: スクリプトファイルを実行している場合、1行目のShebang (例:
#!/bin/sh
,#!/bin/bash
,#!/usr/bin/env node
など) が正しく、指定されたインタプリタがコンテナ内に存在することを確認します。Alpine Linuxベースのイメージなど、bash
がデフォルトで入っていない場合もあるので注意が必要です。 -
改行コードの修正: スクリプトファイルがWindowsで作成された場合、改行コードをLFに変換する必要があります。テキストエディタの設定で改行コードをLFに変更して保存するか、
dos2unix
のようなツールを使用します。# Linux/macOS で dos2unix がインストールされている場合 dos2unix your_script.sh
Gitを使用している場合、
.gitattributes
ファイルでテキストファイルの改行コードを自動的にLFに変換するように設定することも有効です。* text=auto eol=lf
-
実行権限の付与: スクリプトファイルに実行権限がない場合もあります。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)にデプロイする際にこのエラーに遭遇するケースが増えています。
💡 対処法
-
ターゲットアーキテクチャを指定してビルド:
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 # 実行環境に合わせる
-
実行環境と同じアーキテクチャでビルド:
可能であれば、イメージを実行する環境と同じCPUアーキテクチャのマシンやCI/CD環境でDockerイメージをビルドします。
-
マルチアーキテクチャイメージの利用:
公式イメージなどでは、複数のアーキテクチャに対応したマニフェストリスト(マルチアーキテクチャイメージ)が提供されていることがあります。この場合、Dockerは実行環境に適したアーキテクチャのイメージレイヤーを自動的に選択してくれます。可能であれば、このような公式イメージをベースにするのが良いでしょう。
-
スクリプトファイルのShebang確認:
アーキテクチャが一致しているはずなのにエラーが出る場合は、実行しようとしているファイルがスクリプトで、Shebang (
#!/bin/sh
など) が欠落または間違っていないか確認します。
エラー7: Dockerビルド時のエラー (COPY failed: no source files were specified
, apt-get update
失敗など)
🤔 原因
Dockerfile を使って docker build
を実行する際には、様々なエラーが発生する可能性があります。
COPY failed: no source files were specified
またはCOPY failed: stat /path/to/source: no such file or directory
:COPY
命令で指定したコピー元のファイルやディレクトリが、ビルドコンテキスト内に存在しない。- パスの指定が間違っている(ビルドコンテキストのルートからの相対パスで指定する必要がある)。
.dockerignore
ファイルによって、コピー対象のファイルが除外されている。
- パッケージ管理ツール (
apt-get
,apk
,yum
など) のエラー:apt-get update
(または同等のコマンド) を実行する前にパッケージをインストールしようとしている。- ネットワークの問題でリポジトリに接続できない。
- 存在しないパッケージ名を指定している。
- リポジトリの公開鍵が切れている、または信頼されていない。
- その他のビルド時エラー:
- Dockerfileの構文エラー。
RUN
命令で実行したコマンドが失敗した (終了コードが0以外)。
💡 対処法
-
COPY failed
エラー:- ビルドコマンド (
docker build [オプション] PATH
) で指定したPATH
(ビルドコンテキスト) の中に、COPY
命令のコピー元ファイルが存在するか確認します。 - コピー元のパス指定が正しいか確認します。パスはビルドコンテキストのルートからの相対パスです。
.dockerignore
ファイルを確認し、必要なファイルが除外されていないか確認します。- ファイル名やディレクトリ名の大文字・小文字が正しいか確認します (特にLinux環境では区別されます)。
- ビルドコマンド (
-
パッケージ管理ツールのエラー:
apt-get install
などのパッケージインストールコマンドの前に、必ずapt-get update
(またはapk update
,yum update
など) を実行してパッケージリストを更新します。キャッシュを考慮し、RUN apt-get update && apt-get install -y --no-install-recommends パッケージ名
のように1つのRUN
命令にまとめるのが一般的です。- ネットワーク接続を確認します。プロキシ環境下の場合は、Dockerfile内でプロキシ設定を行う必要があります。
- パッケージ名が正しいか、タイポがないか確認します。
- リポジトリの鍵に関するエラーが出た場合は、鍵の更新や追加が必要な場合があります。エラーメッセージに従って対処します (例:
apt-key
コマンドなど)。 - ビルドキャッシュが原因で問題が発生している場合、
docker build --no-cache ...
オプションを付けてビルドを試します。
# Debian/Ubuntu ベースの例 FROM ubuntu:latest RUN apt-get update && \ apt-get install -y --no-install-recommends curl ca-certificates && \ rm -rf /var/lib/apt/lists/* # Alpine ベースの例 FROM alpine:latest RUN apk update && \ apk add --no-cache curl
-
その他のビルド時エラー:
- Dockerfileの各行を注意深く見直し、構文エラーがないか確認します。
RUN
命令でエラーが出ている場合、そのコマンドをローカル環境や一時的なコンテナ内で実行してみて、原因を特定します。- ビルドログの詳細を確認し、どのステップで何が原因で失敗したのかを正確に把握します。
エラー8: コンテナがすぐに終了してしまう (Exited (0)
, Exited (1)
, Exited (137)
など)
🤔 原因
docker run
や docker-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
となります。
💡 対処法
-
コンテナログの確認:
まず最初に、コンテナのログを確認してエラーメッセージや原因の手がかりを探します。これが最も重要なステップです。
# コンテナ名またはIDを指定 docker logs <container_name_or_id>
ログに詳細なエラーが出力されていることが多いです。
-
Exited (0)
の場合:- 意図した動作(バッチ処理など)であれば問題ありません。
- 継続的に実行したいプロセス(Webサーバーなど)が終了してしまう場合:
- Dockerfileの
CMD
やENTRYPOINT
で指定したプロセスがフォアグラウンドで実行され続けるものか確認します。デーモン化するオプション (例:nginx -g 'daemon off;'
) が必要かもしれません。 - 起動スクリプトがバックグラウンドでプロセスを実行してすぐに終了していないか確認します。
- Dockerfileの
-
Exited (1)
など異常終了の場合:- コンテナログを詳細に確認し、エラーの原因を特定します (設定ミス、ファイル不足、パーミッションエラー、アプリケーション固有のエラーなど)。
- 一時的にコンテナの
CMD
やENTRYPOINT
をインタラクティブシェル (bash
,sh
) に変更して起動し、コンテナ内部で手動でプロセスを実行してみることで、エラーの原因を切り分けることができます。
docker run -it --entrypoint bash イメージ名:タグ
-
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が動作した記録を確認します。
- コンテナに割り当てるメモリ上限を増やします。
-
Exited (139)
(Segmentation Fault) の場合:- コンテナログやアプリケーション固有のログ、コアダンプなどを確認し、どの処理でセグメンテーション違反が発生したか特定します。
- 使用しているライブラリやプログラムのバージョンにバグがないか確認します。
- ベースイメージやライブラリのバージョンを変更してみます。
エラー9: ディスク容量不足 (no space left on device
)
🤔 原因
Dockerを使用していると、イメージ、コンテナ、ボリューム、ビルドキャッシュなどがディスク容量を圧迫し、このエラーが発生することがあります。特にビルドを頻繁に行ったり、多くのコンテナを停止したまま放置していると発生しやすいです。
Dockerがデータを保存するデフォルトの場所 (Linuxでは通常 /var/lib/docker
) があるファイルシステムの空き容量がなくなった、またはDocker Desktopなどの仮想環境で割り当てられたディスクイメージのサイズ上限に達した場合に発生します。
💡 対処法
-
Dockerのディスク使用状況の確認:
まず、Dockerがどれくらいのディスク容量を使用しているか確認します。
docker system df
これにより、イメージ、コンテナ、ローカルボリューム、ビルドキャッシュがそれぞれどれくらいの容量を使用しているかが表示されます。
-
不要な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
-
特定のコンテナ、イメージ、ボリュームの削除:
不要であることがわかっている特定の要素を手動で削除します。
docker rm <container_id_or_name> ... # コンテナ削除 docker rmi <image_id_or_name> ... # イメージ削除 docker volume rm <volume_name> ... # ボリューム削除
-
Docker Desktopのディスクイメージサイズ変更 (macOS/Windows):
Docker Desktopを使用している場合、設定画面 (Settings > Resources > Advanced) で Dockerが使用する仮想ディスクイメージの上限サイズ (Virtual disk limit) を増やすことができます。変更後はDocker Desktopの再起動が必要です。
-
Dockerデータディレクトリの移動 (Linux):
/var/lib/docker
があるパーティションの容量が小さい場合、より容量の大きい別のファイルシステムにDockerのデータディレクトリを移動させることができます。設定ファイル (/etc/docker/daemon.json
) でdata-root
を指定し、Dockerデーモンを再起動します。{ "data-root": "/path/to/new/docker/data" }
-
ビルドキャッシュの管理:
マルチステージビルドを活用して最終的なイメージサイズを小さくしたり、不要なファイルがイメージに含まれないように
.dockerignore
を適切に設定したりすることで、ビルドキャッシュやイメージサイズを抑制できます。 -
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) のみをリッスンしている。
- ポートマッピング (
💡 対処法
-
コンテナ間通信:
- 通信したいコンテナ群を、デフォルトの
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
- 通信したいコンテナ群を、デフォルトの
-
コンテナから外部へのアクセス:
- コンテナ内から外部ドメイン (例:
google.com
) にping
やcurl
でアクセスできるか試します。 - コンテナ内の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
) が必要です。
- コンテナ内から外部ドメイン (例:
-
外部からコンテナへのアクセス:
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
でリッスンしている場合、ホストからのポートマッピング経由ではアクセスできません。
-
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! 🐳