経緯
さっきまで上がってたdocker-composeが急に上がらなくなった。
どうやらDBがネックになってるらしいぞ
↓
あれ!?ポートが指定できない!?アイエーナンデー!!
症状
docker-compose up
するとBind: address already in use
と言うエラーが出る
結論
ローカルでMySQLが上がっており、ホスト側のポートで衝突が起きていました。
解決の流れ
原因分析
Bind: address already in use
と言うエラーが出るということでポートの衝突が原因ということは明らか。
つまり考えるべきはホスト側かDocker側のどちらかである。
私はDocker側の問題だと思って調査を始めた
Docker側にあり得る原因の対処
他のコンテナが生きておりポートが衝突してしまっていることを疑い、調べてみた。
というわけで、現在生きているコンテナ全停止docker-compose down
またはdocker stop ${docker ps -q}
、DBコンテナのみの実行Docker run mysql:5.7 --name mysql -p 3306:3306
を試してみた。
【結果】
同じエラーを吐くのでこちらではないことがわかった。
(実際はビルドが問題ではとか思い、イメージの全削除とか言うことをしていたが完全に徒労だった。。。)
ホスト側にあり得る原因の対処
ホスト側に原因があるとすれば別プロセスが使用してしまっていることを予想した。
まずソケットを表示するコマンドを叩いて状況確認
$ ss -atn
State Recv-Q Send-Q Local Address:Port Peer Address:Port
# 実際にはこの一番上にport 3306のソケットが表示されていた
LISTEN 0 128 127.0.0.53%lo:53 0.0.0.0:*
LISTEN 0 5 127.0.0.1:631 0.0.0.0:*
LISTEN 0 224 127.0.0.1:5432 0.0.0.0:*
ESTAB 0 0 172.20.10.9:46516 104.244.42.3:443
ESTAB 0 0 172.20.10.9:43066 151.101.109.44:443
プロセスがあることがわかったので、どのプロセスなのかを突き止める
sudo
で実行しないと正しく見えな)い場合があるので注意(1敗)
$ sudo lsof -i:3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 2055 mysql ?u IPv4 ???? XXX TCP *:mysql (LISTEN)
mysqlの停止
起動コマンドはsystemctl
とservice
が存在する。
どちらでも上がるが、止めるのは上げたコマンドを使用しないと止まりません(1敗)
sudo systemctl stop mysqld
もしくはservice mysqld stop
を実行
【結果】
解決!