環境
- Docker version 24.0.6
- Docker Compose version v2.4.1
はじめに
docker compose up -d
コマンドでコンテナを一括起動しようとした際に、上記のエラーError response from daemon: driver failed programming external connectivity on endpoint (コンテナ名) (コンテナID): Bind for 0.0.0.0:3306 failed: port is already allocated
と出てしまいました。
原因
Docker Composeでdriver failed programming external connectivity on endpointとなった時の対応方法
こちらの記事によると、原因としては主に
- 他のコンテナとポート番号が被っている
- 作成に失敗したコンテナが残っておりそのコンテナで作り直されてしまっている
以上の2点が考えられるそうです。(自分の場合は1でした)
対処(上記記事参照)
1. docker-compose.ymlで対象コンテナのポート番号を変更
元々使用していたポート番号が既に使われていたので、ymlファイルに記載されているポート番号を変更します。
※(ホストのポート番号):(コンテナのポート番号)
になるので、今回はホストのポート番号を変更しました。
変更前
ports:
- 3306:3306
変更後
ports:
- 3307:3306 # ホストのポート番号を変更
2. 作成に失敗したコンテナを削除する
ここで削除せずに起動すると、原因2の「作成に失敗したコンテナが残っておりそのコンテナで作り直されてしまっている」状態になるため、先に失敗したコンテナを削除します。
まず、docker ps -a
コマンドで停止しているコンテナを含めた全てのコンテナのIDから、
作成に失敗したコンテナIDを確認します。
$ docker ps -a
> CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
2a638415a56e mysql:5.7 "docker-entrypoint.s…" 2 minutes ago Created 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp
次に、見つけたコンテナIDを指定してdocker rm
コマンドで削除します
成功すれば、以下のようになります。
$ docker rm (対象コンテナID)
> (対象コンテナID)
ただ、コンテナを停止していない場合にError response from daemon: You cannot remove a running container (対象コンテナID). Stop the container before attempting removal or force remove
というエラーが発生する場合があります。
その場合は、--force
オプションをつけることで強制的にコンテナを削除します。
成功すれば、以下のようになります。
$ docker rm --force (対象コンテナID)
> (対象コンテナID)
3. コンテナを作り直す
最後に、対象のコンテナ名を指定してイメージ構築とコンテナの起動を行います。
$ docker-compose up -d --no-recreate --build (コンテナ名)
おわりに
ここまでご覧いただきありがとうございます!
しかし、まだdocker素人ということもあり間違った情報を載せてしまっている場合があります。
なので、間違ってる情報があればご指摘していただきたいです。