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

时间:2014-11-28 15:31:03

标签: docker boot2docker

我在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中看到“连接......”,无处可去。

我做错了什么?

9 个答案:

答案 0 :(得分:91)

扩展Anentropic's answerboot2docker是适用于Mac和Windows的旧应用,docker-machine是新应用。

首先,列出你的机器:

$ docker-machine ls

NAME      ACTIVE   DRIVER       STATE     URL                         SWARM
default   *        virtualbox   Running   tcp://192.168.99.100:2376

然后选择其中一台机器(默认的一台称为default)和:

$ docker-machine ip default

192.168.99.100

答案 1 :(得分:35)

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

我需要使用boot2docker vm的ip地址,而不是容器的ip,即

$ boot2docker ip
192.168.59.103

我可以在主持人http://192.168.59.103:49159/

浏览我的网站

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

答案 2 :(得分:9)

要查找容器的IP地址,您需要无其他安装

docker inspect <container>

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

答案 3 :(得分:4)

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

所以,在你的情况下,它将是

boot2docker ssh -L 0.0.0.0:8080:localhost:8080

然后

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

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

答案 4 :(得分:1)

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

如果您想要到达容器而无需发布&#39;端口(改变其数量) 有一个很好的贯穿here

关键是这一行:

sudo route -n add 172.17.0.0/16 172.16.0.11

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

答案 5 :(得分:1)

有同样的问题,在我的情况下我使用的是AWS EC2实例。我正在尝试使用无效的容器IP。然后我使用AWS主机的实际公共IP作为IP,它起作用。

答案 6 :(得分:1)

Boot2docker已过时,但在Docker for Windows或Mac上仍可能出现此问题,即使同一容器在Linux上运行也是如此。一个症状是尝试访问容器内服务器上的页面会出现错误,并且没有发送任何数据&#34;相对于&#34;无法连接。&#34;

如果是这样,可能是因为在Win / Mac上container host has its own IP,它不是本地主机,因为它在Linux上。尝试在IP 0.0.0.0上运行Django,这意味着接受来自所有IP的连接,如下所示:

python manage.py runserver 0.0.0.0:8000

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

确保您在-p命令中正确使用docker run port forwarding option

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

答案 7 :(得分:0)

如何解决在本地主机浏览器上托管应用程序的问题

对于此次启动,使用以下命令的容器,在我的情况下是:

50 70 60 60
40 30 80 50
30 80 40 50

在httpd配置中:

[root@centoslab3 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
1b81d8a0e3e1        centos:baseweb      "/bin/bash"         8 minutes ago       Exited (0) 24 seconds ago                       webtest
[root@centoslab3 ~]# docker run --name=atul -v /root/dockertest:/var/www/html -i -t -p 5000:8000 centos:baseweb /bin/bash

使用listner中的端口8000编辑文件,并更新Servername下的容器ip和端口。

重启httpd服务,你就完成了。

希望这有帮助

答案 8 :(得分:0)

<块引用>

docker build -t {imagename} .

docker build -t api-rest-test .
<块引用>

docker run -dp {localport}:{exposeport} image:name

 docker run -dp 8080:8080 api-rest-test:latest

确保您对 yourlocalport and exposeport 使用相同的端口

然后你就可以在你的本地机器 http://localhost:8080 访问你的休息服务