helloworlds

色々試してみたくなっちゃうエンジニア 基礎をコツコツ...

【docker】ailed: port is already allocated のエラー解決

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 MacWindowsにおけるすべてのコンテナトラフィックに傍受ポイントを提供しているものらしい。 今回だとDocker for Macに該当するか。

dockerが急に終了したことで、portを掴んだままになっていたのかもしれない。 つまり、ゾンビプロセスってやつか!!ww (使ってみたかった用語...)

キルする

$ kill -9 PID

再度、docker-compose up したら無事立ち上がりました。

以上.