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

时间:2015-11-14 10:48:11

标签: nginx docker request port

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

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

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

  • docker exec -i -t c3099 bash

  • curl http://localhost =>返回默认的index.html页面内容,它可以正常工作

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

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

我正在使用docker版本1.9.0的mac上运行; nginx最新

有谁知道是什么原因引起的?有帮助吗?谢谢

3 个答案:

答案 0 :(得分:5)

如果您是On OSX,则可能正在为Docker环境使用VirtualBox VM。

确保您拥有forwarded your port 32769到您的实际主机(Mac),以便从localhost可以看到该端口。
这适用于旧的boot2docker或新的docker机器。

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

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

答案 1 :(得分:2)

解决了..我误解了docker端口映射是如何工作的。 由于我使用mac,因此nginx容器的主机是VM,0.0.0.0:32769->80/tcp将容器的端口80映射到VM的端口32769

溶液:

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

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

答案 2 :(得分:2)

不完全是你的问题的答案,但花了一些时间试图在“为什么我的码头工人容器没有连接到弹性搜索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将起作用