こんばんは、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のコンテナが起動するかと思います。
それでは良い開発ライフを〜