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.ymlファイルを編集して、ポート番号を変更することができます。
services: web: ports: - "<ホスト側のポート>:<コンテナ側のポート>"
ポートがすでに使用されている場合、別のプロセスが既にそのポートを使用している可能性があります。その場合、次のようにして、ポートを使用しているプロセスを確認できます。
sudo lsof -i :ポート番号
例えば、ポート番号80のプロセスを調べるには、次のように入力します。
sudo lsof -i :80
このコマンドは、ポート番号80を使用しているプロセスをリストアップします。
すでに使用されているポートを解放するには、使用しているプロセスを停止する必要があります。使用しているプロセスが不要な場合は、次のようにして停止できます。
sudo systemctl stop サービス名
例えば、Apache HTTPサーバーのプロセスを停止するには、次のように入力します。
sudo systemctl stop apache2
また、特定のポートを使用しているプロセスを強制終了することもできます。次のように入力します。
sudo fuser -k ポート番号/tcp
例えば、ポート番号80のプロセスを強制終了するには、次のように入力します。
sudo fuser -k 80/tcp
これにより、ポート80を使用しているプロセスが強制終了されます。
ポートが解放されたら、Dockerコンテナを再起動してポートを再利用できます。次のようにして、Dockerコンテナを再起動できます。
docker restart コンテナ名
例えば、コンテナ名がmyappの場合、次のように入力します。
docker restart myapp
以上の手順で、ポートがすでに使用されているというエラーを解決できるはずです。