dockerを使用していて、コンテナを立ち上げたりダウンさせたり 繰り返していると、コンテナ立ち上げ時に以下のようなエラーにたまーーーに遭遇します。
ERROR: for container-name Cannot start service service-name: driver failed programming external connectivity on endpoint container-name (5a7832c7cfcefba8c6b18542b8055ba74c306d115530a8ca65ff278a10be944c): Bind for 0.0.0.0:8081 failed: port is already allocated ERROR: Encountered errors while bringing up the project
特に私の場合は、docker-composeを複数起動させていたので開発中になんか挙動がおかしいときがあります。 その都度containerを削除してもう一回立ち上げても同様のエラー...
仕方なしにdocker自体を終了させて、もう一度起動させても同様のエラー... こんなかんじでした。
エラーの内容としては、「port8081に既に割り当てられているから、このコンテナを起動できないよ」 みたいなかんじ。
「ああ、そうなのか〜」
たまに起こるエラーなので都度ググっていましたが、この際ちゃんと順序をおって 少し無理やりかもしれないけど対応するために、メモがてら解決策を書いていきます。
まず、調べる
エラー内容は大体理解できたので、なんのプロセスが対象のportで使用されているか調べる。
ということで、lsofコマンドを使う。(LiSt Open Files)
使用中のportでなく、「プロセスが使用している(開いている)ファイルを表示させる」 ってのがこのコマンドを使用する際のキーっぽいかんじがする。
ターゲットとなるportにアクセスしているプロセスを特定します。
$ lsof -i:8081 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME vpnkit 24677 user-name 22u IPv4 0x5af6653a778ed6e1 0t0 TCP *:sunproxyadmin (LISTEN) vpnkit 24677 user-name 23u IPv6 0x5af6653a4a0f6841 0t0 TCP localhost:sunproxyadmin (LISTEN)
「お、確かになんか機能している...」
「vpnkit??」
調べてみると、vpnkitとは、 Docker for Mac、Windowsにおけるすべてのコンテナトラフィックに傍受ポイントを提供しているものらしい。 今回だとDocker for Macに該当するか。
dockerが急に終了したことで、portを掴んだままになっていたのかもしれない。 つまり、ゾンビプロセスってやつか!!ww (使ってみたかった用語...)
キルする
$ kill -9 PID
再度、docker-compose up
したら無事立ち上がりました。
以上.