Docker |「Error response from daemon: Ports are not available」というエラーが出た時の対処法

Dockerでコンテナを起動する際、ポートが他のプロセスで使用中であるために、「Error response from daemon: Ports are not available」というエラーが発生することがあります。このエラーに対する対処法を解説します。

出てきたエラー

Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:80 -> 0.0.0.0:0: listen tcp 0.0.0.0:80: bind: address already in use

エラーの原因

「Error response from daemon: Ports are not available」というエラーは、Dockerが指定されたポートを使用することができないために発生します。これは、他のプロセスがすでにそのポートを使用している場合によく発生します。

ポートを確認する

まず最初に、ポートが使用中かどうかを確認する必要があります。これには、次のコマンドを使用します。

sudo lsof -i :<ポート番号>

このコマンドを実行すると、ポート番号を使用しているプロセスのリストが表示されます。ポートを使用しているプロセスを終了することで、ポートを解放することができます。

// ターミナルに入力
sudo lsof -i:80
// 実行結果
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
httpd 12345 daemon 7u IPv6 0x90...(省略)..... 0t0 TCP *:http (LISTEN)
httpd 12346 daemon 7u IPv6 0x90...(省略).....
..(省略)...

ポートを解放する

ポートを使用しているプロセスが特定できたら、終了することができます。これには、次のコマンドを使用します。

sudo kill <PID>

ここで、<PID>はポートを使用しているプロセスのPIDです。

// ターミナルに入力
sudo kill 12345
sudo kill 12346

また、他の方法として、次のコマンドを使用して、ポートを解放することができます。

sudo fuser -k <ポート番号>/tcp

このコマンドを実行すると、ポートを使用しているプロセスが終了し、ポートが解放されます。

別のポートに変更する

もう一つの方法は、別のポートに変更することです。これには、Dockerの起動コマンドに指定されているポート番号を変更する必要があります。たとえば、次のようにします。

docker run -p <ホスト側のポート>:<コンテナ側のポート> <イメージ名>

ここで、<ホスト側のポート>と<コンテナ側のポート>を変更することができます。

Docker Composeを使用している場合

Docker Composeを使用している場合には、次のようにdocker-compose.ymlファイルを編集して、ポート番号を変更することができます。

services: web: ports: - "<ホスト側のポート>:<コンテナ側のポート>"

デバッグ方法

ポートがすでに使用されている場合、別のプロセスが既にそのポートを使用している可能性があります。その場合、次のようにして、ポートを使用しているプロセスを確認できます。

1. ポートを使用しているプロセスを確認する

sudo lsof -i :ポート番号

例えば、ポート番号80のプロセスを調べるには、次のように入力します。

sudo lsof -i :80

このコマンドは、ポート番号80を使用しているプロセスをリストアップします。

2. ポートを解放する

すでに使用されているポートを解放するには、使用しているプロセスを停止する必要があります。使用しているプロセスが不要な場合は、次のようにして停止できます。

sudo systemctl stop サービス名

例えば、Apache HTTPサーバーのプロセスを停止するには、次のように入力します。

sudo systemctl stop apache2

また、特定のポートを使用しているプロセスを強制終了することもできます。次のように入力します。

sudo fuser -k ポート番号/tcp

例えば、ポート番号80のプロセスを強制終了するには、次のように入力します。

sudo fuser -k 80/tcp

これにより、ポート80を使用しているプロセスが強制終了されます。

3. Dockerコンテナを再起動する

ポートが解放されたら、Dockerコンテナを再起動してポートを再利用できます。次のようにして、Dockerコンテナを再起動できます。

docker restart コンテナ名

例えば、コンテナ名がmyappの場合、次のように入力します。

docker restart myapp

以上の手順で、ポートがすでに使用されているというエラーを解決できるはずです。