如何从主机访问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上访问您的服务器。