我拉了一个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防火墙closures。
我不期望在这里提供完整的解决scheme,因为我知道我提供的信息是最小的。
我想知道的是,如何解决这个问题呢?
看来,Docker端口是无法访问的。
有什么方法可以找出为什么端口映射不起作用? 或者Docker公开了哪些端口? 也许我正在映射错误的内部端口?
或者还有什么其他的一般build议,我可能在这里做错了吗?
终于想出了如何使这项工作!
我在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 ,一切正常。
要找出正在运行的容器的IP地址,可以使用:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' myContainerID
如果使用docker-machine运行docker,请使用以下命令获取IP地址(假设default是您的名字):
docker-machine ip default
请参阅: https : //docs.docker.com/machine/reference/ip/