我已經拉取了一個 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-machine
使用以下命令執行 docker 來取得 IP 位址(假設default
是您的名字):
docker-machine ip default
答案4
開始使用 docker,這是我遇到的第一個問題/問題。
似乎 docker 可以讓您指定是否以不同模式使用端口,例如 - 主機、橋接(預設)
在橋接模式下,一旦部署 Ghost,docker 就會向您顯示一則訊息 - 您的部落格現在可以在http://本地主機:2368/但存取此網址顯示連線被拒絕。
要解決此問題,您需要存取 kitematic 中的實例設定(比使用控制台更容易)。轉到主機名稱/連接埠選項卡。如圖所示,建立從 docker 連接埠到主機連接埠和 bingo 的對應。現在再次造訪該網址,一切都按預期進行。