docker nginx 容器没有收到来自外部的请求,连接被拒绝

docker nginx container not receiving request from outside, connection refused

我有一个 运行 nginx 容器:# docker run --name mynginx1 -P -d nginx;

并通过 docker ps 获取其端口信息:0.0.0.0:32769->80/tcp, 0.0.0.0:32768->443/tcp

然后我可以从容器中得到响应(id:c30991a04b2f):

然而,当我在容器外制作 curl http://localhost:32769 时,我得到了这个:

curl: (7) failed to connect to localhost port 32769: Connection refused


我 运行 在 mac 上 docker 版本 1.9.0; nginx 最新

有人知道这是什么原因吗?有什么帮助吗?谢谢

如果您使用 OSX,您可能正在为您的 docker 环境使用 VirtualBox VM。

确保您有 forwarded your port 32769 到您的实际主机(mac),以便从本地主机可以看到该端口。
这适用于旧的boot2docker,或新的docker machine.

VBoxManage controlvm "boot2docker-vm" --natpf1 "tcp-port32769  ,tcp,,32769,,32769"
VBoxManage controlvm "boot2docker-vm" --natpf1 "udp-port32769 ,udp,,32769,,769

controlvm如果VM是运行,modifyvm是VM停止了)
(将“boot2docker-vm”替换为您的虚拟机名称:参见 docker-machine ls

我建议不要使用 -P,而是使用静态端口映射 -p xxx:80 -p yyy:443
这样,您就可以使用固定值进行一次端口转发。

当然可以直接通过docker-machine ip vmname

访问VM
curl http://$(docker-machine ip vmname):32769

已解决。我误解了 docker 端口映射的工作原理。 由于我使用的是 mac,nginx 容器的主机是一个虚拟机,0.0.0.0:32769->80/tcp 将容器的端口 80 映射到虚拟机的端口 32769


解决方案:

  1. docker-machine ip vm-name => 192.168.99.xx

  2. curl http://192.168.99.xx:32769

不是您问题的确切答案,但花一些时间尝试在 "why is my docker container not connecting to elastic search localhost:9200" 的上下文中找出类似的东西,这是第一个 S.O。弹出的问题,所以我希望它能帮助其他谷歌搜索的人

如果您link将容器放在一起(例如docker run --rm --name web2 --link db:db training/webapp env

...然后Dockers添加环境变量:

DB_NAME=/web2/db DB_PORT=tcp://172.17.0.5:5432 DB_PORT_5432_TCP=tcp://172.17.0.5:5432 DB_PORT_5432_TCP_PROTO=tcp DB_PORT_5432_TCP_PORT=5432 DB_PORT_5432_TCP_ADDR=172.17.0.5

... 并更新您的 /etc/hosts

# /etc/hosts
#...
172.17.0.9  db

因此您可以在技术上连接到 ping db

https://docs.docker.com/v1.8/userguide/dockerlinks/

所以弹性搜索是

 # /etc/hosts
 # ...
 172.17.0.28    elasticsearch f9db83d0dfb5 ecs-awseb-qa-3Pobblecom-env-f7yq6jhmpm-10-elasticsearch-fcbfe5e2b685d0984a00

所以 wget elasticseach:9200 会起作用