あれ?ポートのエラーが出て自分だけDockerが起動できない…
自分だけ開発出遅れてる…(焦
今回の記事は上記のような方におすすめ。
今回の記事では、ポート周りのエラーの原因と、解消方法について…Docker初心者でもわかるよう、わかりやすく解説いたします!
最近ではDockerを使って開発環境の準備を行う企業も多いかもしれません。一方で、時間短縮のためのDockerでエラー解消方法がわからず、丸1日ぶっつぶれ…なんて事態も最初は起きがちですよね。
「なんで時短のためのDockerでこんな時間取られなきゃならないんだよ!!」なんて怒りも湧いてくるかもしれませんが、ポートエラーの解消はめちゃくちゃカンタンでした!
間違っている箇所あったらコメントで教えてね。
本記事の内容
なおこの記事は3分で読める内容です。
【Docker】ポートエラーの原因
$ docker-compose up -d
Creating network "sample_default" with the default driver
Creating sample-db ... done
Creating sample-web ... error
ERROR: for sample-web Cannot start service sample-web: Ports are not available: listen tcp 0.0.0.0:88: bind: address already in use
ポート「88」が使用できません。すでに使用されています、とのエラー内容が。
次に、ポート88を利用しているプロセスを確認してみます。
$ sudo lsof -i -P | grep "LISTEN"
kdc 151 root 5u IPv6 0xxxxxxxxxxxxxxxxx 0t0 TCP *:88 (LISTEN)
kdc 151 root 7u IPv4 0xxxxxxxxxxxxxxxxx 0t0 TCP *:88 (LISTEN)
どうやら、「kdc」というプロセスが88番ポートを既に使っちゃってるようですね。つまりは、別のプロセスで使用されているため、起動がうまくいかないようです。
プロセスをkillしても大丈夫…?
他の記事でプロセスをkillすれば良い、的なのもあったのですが、そもそも「kdc」が何かわからない以上は「kill」するのもどうかと思ったので、「kdc」について調べてみました。Mac公式の記事によると、kdcは「ケルベロス」という認証周りのプロセスのようです。
ポート | サービス名 | ポートを使う製品/サービス |
---|---|---|
88 | kerberos | Kerberos (画面共有の認証など) |
このプロセスをkillすることで、一旦はDockerの問題は解消されるかもしれませんが、今度Mac本体の認証に影響があっては怖いので、killする方法は断念しました。
ただし…killでどうなるかはめちゃくちゃ気になる…!!!(フラグ)
(えい!!!!!!!)
$ sudo kill -9 151
$ sudo lsof -i -P | grep "LISTEN"
postgres 122 postgres 7u IPv6 0xxxxxxxxxxxxxxxxx 0t0 TCP *:5433 (LISTEN)
postgres 122 postgres 8u IPv4 0xxxxxxxxxxxxxxxxx 0t0 TCP *:5433 (LISTEN)
Google 787 user 132u IPv4 0xxxxxxxxxxxxxxxxx 0t0 TCP localhost:49567 (LISTEN)
Adobe\x20 846 user 16u IPv4 0xxxxxxxxxxxxxxxxx 0t0 TCP localhost:15292 (LISTEN)
Adobe\x20 846 user 26u IPv4 0xxxxxxxxxxxxxxxxx 0t0 TCP localhost:15393 (LISTEN)
Adobe\x20 846 user 28u IPv4 0xxxxxxxxxxxxxxxxx 0t0 TCP localhost:16494 (LISTEN)
ん…消え…た…?
画面の下の方に行くと…
postgres 122 postgres 7u IPv6 0xxxxxxxxxxxxxxxxx 0t0 TCP *:5433 (LISTEN)
postgres 122 postgres 8u IPv4 0xxxxxxxxxxxxxxxxx 0t0 TCP *:5433 (LISTEN)
Google 787 user 132u IPv4 0xxxxxxxxxxxxxxxxx 0t0 TCP localhost:49567 (LISTEN)
Adobe\x20 846 user 16u IPv4 0xxxxxxxxxxxxxxxxx 0t0 TCP localhost:15292 (LISTEN)
Adobe\x20 846 user 26u IPv4 0xxxxxxxxxxxxxxxxx 0t0 TCP localhost:15393 (LISTEN)
Adobe\x20 846 user 28u IPv4 0xxxxxxxxxxxxxxxxx 0t0 TCP localhost:16494 (LISTEN)
・
・
・
kdc 3218 root 5u IPv6 0xxxxxxxxxxxxxxxxx 0t0 TCP *:88 (LISTEN)
kdc 3218 root 7u IPv4 0xxxxxxxxxxxxxxxxx 0t0 TCP *:88 (LISTEN)
あれ?kdc生きてる…
killする番号間違えたかな…?
(再度!!!!)
$ sudo kill -9 3218
$ sudo lsof -i -P | grep "LISTEN"
postgres 122 postgres 7u IPv6 0xxxxxxxxxxxxxxxxx 0t0 TCP *:5433 (LISTEN)
postgres 122 postgres 8u IPv4 0xxxxxxxxxxxxxxxxx 0t0 TCP *:5433 (LISTEN)
Google 787 user 132u IPv4 0xxxxxxxxxxxxxxxxx 0t0 TCP localhost:49567 (LISTEN)
Adobe\x20 846 user 16u IPv4 0xxxxxxxxxxxxxxxxx 0t0 TCP localhost:15292 (LISTEN)
Adobe\x20 846 user 26u IPv4 0xxxxxxxxxxxxxxxxx 0t0 TCP localhost:15393 (LISTEN)
Adobe\x20 846 user 28u IPv4 0xxxxxxxxxxxxxxxxx 0t0 TCP localhost:16494 (LISTEN)
消えたかな…?
画面の下の方に行くと…
postgres 122 postgres 7u IPv6 0xxxxxxxxxxxxxxxxx 0t0 TCP *:5433 (LISTEN)
postgres 122 postgres 8u IPv4 0xxxxxxxxxxxxxxxxx 0t0 TCP *:5433 (LISTEN)
Google 787 user 132u IPv4 0xxxxxxxxxxxxxxxxx 0t0 TCP localhost:49567 (LISTEN)
Adobe\x20 846 user 16u IPv4 0xxxxxxxxxxxxxxxxx 0t0 TCP localhost:15292 (LISTEN)
Adobe\x20 846 user 26u IPv4 0xxxxxxxxxxxxxxxxx 0t0 TCP localhost:15393 (LISTEN)
Adobe\x20 846 user 28u IPv4 0xxxxxxxxxxxxxxxxx 0t0 TCP localhost:16494 (LISTEN)
・
・
・
kdc 3346 root 5u IPv6 0xxxxxxxxxxxxxxxxx 0t0 TCP *:88 (LISTEN)
kdc 3346 root 7u IPv4 0xxxxxxxxxxxxxxxxx 0t0 TCP *:88 (LISTEN)
ん????まだ、生きてる?
(再度!!!!)
$ sudo kill -9 3346
$ sudo lsof -i -P | grep "LISTEN"
postgres 122 postgres 7u IPv6 0xxxxxxxxxxxxxxxxx 0t0 TCP *:5433 (LISTEN)
postgres 122 postgres 8u IPv4 0xxxxxxxxxxxxxxxxx 0t0 TCP *:5433 (LISTEN)
Google 787 user 132u IPv4 0xxxxxxxxxxxxxxxxx 0t0 TCP localhost:49567 (LISTEN)
Adobe\x20 846 user 16u IPv4 0xxxxxxxxxxxxxxxxx 0t0 TCP localhost:15292 (LISTEN)
Adobe\x20 846 user 26u IPv4 0xxxxxxxxxxxxxxxxx 0t0 TCP localhost:15393 (LISTEN)
Adobe\x20 846 user 28u IPv4 0xxxxxxxxxxxxxxxxx 0t0 TCP localhost:16494 (LISTEN)
これで消えたよね
画面の下の方に行くと…
postgres 122 postgres 7u IPv6 0xxxxxxxxxxxxxxxxx 0t0 TCP *:5433 (LISTEN)
postgres 122 postgres 8u IPv4 0xxxxxxxxxxxxxxxxx 0t0 TCP *:5433 (LISTEN)
Google 787 user 132u IPv4 0xxxxxxxxxxxxxxxxx 0t0 TCP localhost:49567 (LISTEN)
Adobe\x20 846 user 16u IPv4 0xxxxxxxxxxxxxxxxx 0t0 TCP localhost:15292 (LISTEN)
Adobe\x20 846 user 26u IPv4 0xxxxxxxxxxxxxxxxx 0t0 TCP localhost:15393 (LISTEN)
Adobe\x20 846 user 28u IPv4 0xxxxxxxxxxxxxxxxx 0t0 TCP localhost:16494 (LISTEN)
・
・
・
kdc 3467 root 5u IPv6 0xxxxxxxxxxxxxxxxx 0t0 TCP *:88 (LISTEN)
kdc 3467 root 7u IPv4 0xxxxxxxxxxxxxxxxx 0t0 TCP *:88 (LISTEN)
(おい!!!生きてんじゃねぇかよ!!)
何に使われているかわからない以上、
やたらに killするのはやめましょう。
結論)ケルベロスは死なない
ケルベロスを何度もkillしてみました。
確実にkillをしたのですが、また別プロセスとして復活してしまいました。
「88」番ポートを使用しているケルベロスをkillしてもkillしても立ち上がってしまう…。なんだこいつ強すぎだろ。これでは、ケルベロスとのイタチごっこになってしまう。
こんな不毛な戦いは、いつ終わるかわからないので、結論として私は自分のローカル環境だけDockerのポート番号を別のものにして起動することにしました。
ポート番号を変更で解決!
以下の箇所「88」を「8888」にして再度「docker-compose up -d」すると…
ports:
- "88:3000"
# こう↓
ports:
- "8888:3000"
立ち上げられました。
$ docker-compose up -d
sample-db is up-to-date
Recreating sample-web ... done
まとめ
ポート番号を変えて起動する…なんとも初歩的な解決策のようだが、私にとってはこれがベストであった。Dockerは難しいなぁ。
M1 mac かWindowsかなど、人によって環境が違う以上は、Dockerにおいては、全員がうまくいくコードを書くのは難しいのかもしれない。端末ごとのエラーを蓄積して次、同じエラーが出た際はより時短できると良いなとは思う。
まあ、Dockerは、先輩と環境が違うとエラーの内容も違ったりして、質問するものされるのも大変だ。もっと端末ごとのネットの記事が増えてくれたらなぁと思う。
ほんと、不毛な戦いだったよね