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):
docker exec -i -t c3099 bash
curl http://localhost
=> 其中 return 默认 index.html
页面内容有效
然而,当我在容器外制作 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
。
解决方案:
docker-machine ip vm-name
=> 192.168.99.xx
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
会起作用
我有一个 运行 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):
docker exec -i -t c3099 bash
curl http://localhost
=> 其中 return 默认index.html
页面内容有效
然而,当我在容器外制作 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
curl http://$(docker-machine ip vmname):32769
已解决。我误解了 docker 端口映射的工作原理。
由于我使用的是 mac,nginx 容器的主机是一个虚拟机,0.0.0.0:32769->80/tcp
将容器的端口 80
映射到虚拟机的端口 32769
。
解决方案:
docker-machine ip vm-name
=>192.168.99.xx
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
会起作用