docker: Error response from daemon: driver failed programming external connectivity on endpoint xxx (xxx):x Error starting userland proxy: Bind for 0.0.0.0:80: unexpected error (Failure EADDRINUSE). が出たら...

f:id:daihase:20190809101937p:plain

こんばんは、daihaseです。

はい、異様に長いタイトルですね。Dockerのエラーなんですが、最初にMacでコンテナを走らせようとすると1度くらいは遭遇するコレ。その解決方法をメモ。

※例えばnginxのイメージからport 80でコンテナ起動した際などよく起きますね。

docker container run --name httpServer -d -p 80:80 nginx ←こういうのとか。

 

まぁエラーの内容そのままなんですが、あるコンテナを走らせようとした際に(Port80で)、すでに別のサービスで同じポートを掴んじゃってるため、このようなエラーが出ています。

Macの場合、デフォルトでApacheが入っていてそれがPort80で立ち上がってるため(ブラウザでlocalhost:80と叩いて It works と出たら動いちゃってます)、それを止めれば解決ですね。

一応以下のコマンドで確認。

$ sudo lsof -i -P | grep "LISTEN"

 

環境にもよりますが、自分の場合は以下のように出ました。

Password:
httpd        95           root    4u  IPv6 0x300ff72d6553f801      0t0    TCP *:80 (LISTEN)
xartstora   232           root    3u  IPv4 0x300ff72d63a4abe9      0t0    TCP *:61500 (LISTEN)
xartstora   232           root    4u  IPv6 0x300ff72d65540941      0t0    TCP *:61500 (LISTEN)
httpd       315           _www    4u  IPv6 0x300ff72d6553f801      0t0    TCP *:80 (LISTEN)
EEventMan   382    LibraStudio    5u  IPv4 0x300ff72d63a49929      0t0    TCP *:2968 (LISTEN)
postgres    384    LibraStudio    5u  IPv6 0x300ff72d66df5381      0t0    TCP localhost:5432 (LISTEN)
postgres    384    LibraStudio    6u  IPv6 0x300ff72d66df3101      0t0    TCP localhost:5432 (LISTEN)
postgres    384    LibraStudio    7u  IPv4 0x300ff72d63a4bea9      0t0    TCP localhost:5432 (LISTEN)
Dropbox     418    LibraStudio  119u  IPv6 0x300ff72d6553db41      0t0    TCP *:17500 (LISTEN)
Dropbox     418    LibraStudio  120u  IPv4 0x300ff72d70127be9      0t0    TCP *:17500 (LISTEN)
Dropbox     418    LibraStudio  156u  IPv4 0x300ff72d700fdbe9      0t0    TCP localhost:17600 (LISTEN)
Dropbox     418    LibraStudio  160u  IPv4 0x300ff72d70103be9      0t0    TCP localhost:17603 (LISTEN)
rapportd    419    LibraStudio    3u  IPv4 0x300ff72d63a4b549      0t0    TCP *:49158 (LISTEN)
rapportd    419    LibraStudio    4u  IPv6 0x300ff72d66df4dc1      0t0    TCP *:49158 (LISTEN)
cupsd     36042           root    5u  IPv6 0x300ff72d66df36c1      0t0    TCP localhost:631 (LISTEN)
cupsd     36042           root    6u  IPv4 0x300ff72d717e7be9      0t0    TCP localhost:631 (LISTEN)
LINE      36081    LibraStudio   10u  IPv4 0x300ff72d71966289      0t0    TCP localhost:10400 (LISTEN)

 

ちょうど上から2個目、httpd(これはapacheのプロセスの名称ですね)が80を掴んじゃってるのがわかります。

Macで起動してるapacheを止めちゃいましょう。

$ sudo apachectl stop

 

その後、再度同じ「docker container run --name httpServer -d -p 80:80 nginx」とコマンドを実行して以下のようなエラーが出る時があります。

docker: Error response from daemon: Conflict. The container name "/httpServer" is already in use by container "xxxx". You have to remove (or rename) that container to be able to reuse that name.

 

これも上で一度コンテナを走らせるコマンドを実行したため、既に同じ名前のコンテナが存在しちゃってるので消してしまえばOKです。

$ docker rm "コンテナID"

 

これでコンテナが削除されるので、次はちゃんとnginxのコンテナが起動するかと思います。

それでは良い開発ライフを〜