我有一个正在运行的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最新
有谁知道是什么原因引起的?有帮助吗?谢谢
答案 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
curl http://$(docker-machine ip vmname):32769
答案 1 :(得分:2)
解决了..我误解了docker端口映射是如何工作的。
由于我使用mac,因此nginx容器的主机是VM,0.0.0.0:32769->80/tcp
将容器的端口80
映射到VM的端口32769
。
溶液:
docker-machine ip vm-name
=> 192.168.99.xx
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
将起作用