Docker コンテナにマップされたポートを参照しようとすると、「ERR_CONNECTION_REFUSED」が表示される

Docker コンテナにマップされたポートを参照しようとすると、「ERR_CONNECTION_REFUSED」が表示される

Docker イメージを取得しました:

$ docker pull ghost

イメージからコンテナを実行します。

$ docker run --name test-ghost -p 8080:2368 -d ghost
7d984e974f6a75fe18b3d397b5c8f0a428928a2be9df83f0d61a679aa5f537fc

私の理解では、-pスイッチはホスト上のポート (8080) を Docker 内のポート (2368) にマッピングし、Docker の外部、つまりホストから Docker 内で実行されている Web サーバーにアクセスできるようにします。

ただし、ホストから Chrome で次のいずれかのアドレスを参照しようとすると、次のようになります。

http://localhost:8080/
http://0.0.0.0:8080/
http://127.0.0.1:8080/

次のエラーが発生します:

This webpage is not available

ERR_CONNECTION_REFUSED

これは、コンテナ内の問題ではなく、接続の問題であると思われます。コンテナ内で実行中のプロセスを調べると、NodeJS が実行されているようです。

$ docker top test-ghost
UID          PID           PPID      ...  CMD
docker       4290          1028      ...  npm
docker       4324          4290      ...  sh -c node index
docker       4325          4324      ...  node index

しかし、ポート 8080 では何もリッスンしていないようです。

$ sudo lsof -n -i4TCP:8080 | grep LISTEN
$

確認したところ、MacOS のファイアウォールはオフになっています。


私が提供した情報は最小限であることは承知しているので、ここで完全な解決策が得られるとは期待していません。

私が疑問に思っているのは、このような問題をどうやって解決するかということです。

Docker ポートにアクセスできないようです。

ポートマッピングが機能しなかった理由を調べる方法はありますか?または、どのポートがDocker によって公開されていますか? おそらく間違った内部ポートをマッピングしているのでしょうか?

あるいは、私がここで間違っている可能性のあることに関して、他の一般的な提案はありますか?

答え1

ついにこれを機能させる方法が分かりました!

私はMacOS上でDockerを実行しており、「Docker QuickStart Terminal」を使用しています。

結局のところ、「localhost」、「127.0.0.1」などに移動するのは間違っていました。Docker が独自のホストを設定しているように見えるためです。

                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/


docker is configured to use the default machine with IP 192.168.99.100
For help getting started, check out the docs at https://docs.docker.com

上記の を使用すると192.168.99.100、すべて正常に動作します。

答え2

実行中のコンテナの IP アドレスを確認するには、次のコマンドを使用します。

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' myContainerID

答え3

docker を実行する場合は、docker-machine次のコマンドを使用して IP アドレスを取得します (default自分の名前であると想定します)。

docker-machine ip default

見る:参考:

答え4

docker を使い始めましたが、これが最初に遭遇した問題です。

docker では、ホスト、ブリッジ (デフォルト) などのさまざまなモードでポートを使用するかどうかを指定できるようです。

ブリッジモードでは、ゴーストをデプロイするとDockerにメッセージが表示されます - ブログが利用可能になりましたhttp://localhost:2368/しかし、この URL にアクセスすると接続が拒否されたことが示されます。

これを修正するには、kitematic のインスタンス設定にアクセスする必要があります (コンソールを使用するよりも簡単です)。ホスト名 / ポート タブに移動します。画像に示すように、docker ポートからホスト ポートへのマッピングを作成すれば完了です。URL に再度アクセスすると、すべてが期待どおりに動作します。

Kitematicインスタンス設定ポート

関連情報