我在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中看到“连接......”,无处可去。
我做错了什么?
答案 0 :(得分:91)
扩展Anentropic's answer:boot2docker
是适用于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 访问你的休息服务