如何从主机访问Docker容器的Web服务器

我在boot2docker 1.3.1下运行。

我有一个Docker容器,通过uwsgi --http :8080运行一个web服务器。

如果我附加到容器,我可以浏览使用lynx http://127.0.0.1:8080网站,所以我知道服务器正在工作。

我跑了我的容器:

 $ docker run -itP --expose 8080 uwsgi_app:0.2 

它具有以下细节:

 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5248ad86596d uwsgi_app:0.2 "bash" 11 minutes ago Up 11 minutes 0.0.0.0:49159->8080/tcp cocky_hypatia $ docker inspect --format '{{ .NetworkSettings.IPAddress }}' 5248ad86596d 172.17.0.107 

我想我可以通过访问http://172.17.0.107:49159从我的主机访问该网站。

这不起作用。 我只是看到“连接…”在Chrome中,无处可去。

我究竟做错了什么?

扩展Anentropic的 答案 : boot2docker是Mac和Windows的老应用程序, docker-machine是新的。

首先,列出你的机器:

 $ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM default * virtualbox Running tcp://192.168.99.100:2376 

然后select其中一台机器(默认的是default ),并且:

 $ docker-machine ip default 192.168.99.100 

好的,愚蠢的我,我find了boot2docker的文档中的答案https://docs.docker.com/installation/mac/#container-port-redirection

我需要使用boot2docker虚拟机的IP地址,而不是容器的IP地址

 $ boot2docker ip 192.168.59.103 

我可以从http://192.168.59.103:49159/的主机浏览我的网站

我不需要在主机上添加任何route

要find您的容器的IP地址,您应该不需要额外的安装

 docker inspect <container> 

这提供了丰富的信息。 grep它的IP地址。

您可以使用boot2docker端口映射选项-L,如此处所述。

所以,就你的情况而言

 boot2docker ssh -L 0.0.0.0:8080:localhost:8080 

接着

 docker run -it -p 8080:8080 uwsgi_app:0.2 

这样,您不必使用boot2docker的IP地址:您可以使用本地主机或您自己的IP地址(并且可以从外部访问您的Docker容器)。

有同样的问题,在我的情况下,我使用AWS EC2实例。 我试图与无法使用的容器IP。 然后我使用AWS主机的实际公共IP作为工作的IP。

[编辑:原来的版本是忽略-P有问题]

如果你想到达容器,而不必“发布”端口(这会改变它的数量),这里有一个很好的贯穿。

关键是这一行:

 sudo route -n add 172.17.0.0/16 172.16.0.11 

它告诉Mac如何路由到Docker容器所在的VirtualBox VM内的专用networking。

Boot2docker已经过时了,但是在Docker for Windows或者Mac上,即使同一个容器在Linux上运行,你仍然可能会遇到这个问题。 一个症状是,试图访问容器内的服务器上的页面会给出错误“没有发送任何数据”,而不是“无法连接”。

如果是这样的话,可能是因为在Win / Mac上, 容器主机有自己的IP ,它不是Linux上的本地主机。 尝试在IP 0.0.0.0上运行Django,即接受来自所有IP的连接,如下所示:

 python manage.py runserver 0.0.0.0:8000 

或者,如果您需要确保服务器仅响应本地请求(例如从本地代理(如nginx,apache或gunicorn)),则可以使用由hostname -i返回的主机IP。

并确保在docker run命令中正确使用了-p 端口转发选项 。

假设一切正常,您应该能够在主机上运行的浏览器中的http:// localhost上访问您的服务器。