访问Windows主机上的docker容器URL

时间:2015-10-06 17:02:07

标签: windows docker

警告#1 :我已经阅读了this answerthis answer,还有一个miriad其他答案/帖子,我仍然无法得到它工作

警告#2 :我是码头工的新手,所以我可能会遗漏一些非常简单的东西。

我在Windows上运行Docker,运行this ELK image我使用此命令启动:

sudo docker run -p 5601:5601 -p 9200:9200 -p 5000:5000 -it --name elk sebp/elk

我试图从运行在Windows上的浏览器访问端口56019200,并且我一直在获得连接超时。这就是我所做的:

  • 我相信docker run命令(上面)已经将端口5601和9200从容器转发到docker主机(boot2docker VM),所以应该没问题。
  • 我通过在docker CLI上运行docker inspect $(docker ps -q) | grep IPA获得了elk docker容器IP。结果是172.17.0.9。然后我运行了curl 172.17.0.9:5601curl 172.17.0.9:9200。我能够从这些URL获得正确的HTML响应。这使我能够验证docker容器/主机中的内容是否正常运行。
  • 然后我通过运行docker-machine ip default获得了docker主机的IP。结果是192.168.99.100。我相信这就是我需要从docker主机访问elk容器(本例中为Windows),因为已经设置了容器的端口转发。有了这个IP,我尝试了http://192.168.99.100:5601http://192.168.99.100:9200,我得到了ERR_CONNECTION_TIMED_OUT。我也试过使用IE,甚至https来踢,但仍然没有运气。
  • 我也试过从DOS ping 192.168.99.100,但无法得到回复。我尝试在Windows中放宽防火墙规则(只是为了再次踢),我一无所获。

我错过了什么?

3 个答案:

答案 0 :(得分:4)

实际上在Windows中将会运行一个Ubuntu VM,最重要的是只有你的容器被托管,所以只有你不能直接访问它

即使我遇到同样的问题,我也按照以下步骤解决了我的问题

1. Enabled routing as told in the above post 
2. Added a port forwarding from windows host to Ubuntu host where the containers are hosted by using below command 

     netsh interface portproxy add v4tov4 listenport=4422 listenaddress=192.168.1.111 connectport=3128 connectaddress=192.168.0.33

    a. Here 192.168.1.111 is my windows host ip address and 4422 is the port to where other machines in same network will call 
    b. Here 192.168.0.33 is the ubuntu host where containers are hosted and 3128 is the ubuntu host port which is mapped to the container 
        $ docker ps -a
        CONTAINER ID        IMAGE                     COMMAND                 CREATED
                  STATUS              PORTS                    NAMES
        090af3e0c7a4        sameersbn/squid:3.3.8-5   "/sbin/entrypoint.sh"   6 hours ag
        o         Up 5 hours          0.0.0.0:3128->3239/tcp   squid

3. Then I added firewall to unblock inbound and outbound traffic for 4422 port in my windows host  

现在我可以从网络中的任何系统访问容器了:)

答案 1 :(得分:1)

如果您在同一台泊机器上使用浏览器,则应该能够访问127.0.0.1: http://127.0.0.1:5601 http://127.0.0.1:9200

如果您使用其他计算机上的浏览器并尝试访问http://192.168.99.100:5601http://192.168.99.100:9200,则应在运行docker的Windows计算机上启用路由。

转到“开始”并搜索cmd或命令。右键单击cmd或命令,然后选择以管理员身份运行。在命令提示符下键入regedit。导航到HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ IPEnableRouter设置,右键单击并选择“修改”。将0更改为1并退出编辑器。

在命令提示符处返回时,键入services.msc并导航到“路由和远程访问”服务。右键单击并选择“属性”。更改为自动并单击开始以启动该服务。查看http://answers.microsoft.com/en-us/windows/forum/windows_7-networking/how-to-enable-ip-routing-in-windows-7/8970e722-e947-460d-80d5-fd6ffc850f3f?auth=1

答案 2 :(得分:0)

我使用GUI而不是CLI,在运行映像之前,我单击可选设置,然后将映射端口添加到容器端口,以便能够以localhost身份访问URL。不确定如何在命令中执行此操作,该方法通常受到限制,但可以让您尝试使用容器

add the ports in your local host to be mapped