Docker端口转发无法正常工作

Raj*_* .E 7 portforwarding docker docker-container

我已经设置了Docker容器来访问我的机器docker容器到本地的另一台机器.

在命令下创建一个容器:

    docker run -it -d --name containerName -h www.myhost.net -v /var/www/html -p 7000:8000 --net mynetwork --ip 172.11.0.10 --privileged myimagename bash
Run Code Online (Sandbox Code Playgroud)

创建容器详细信息后:

        CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES

        1e1e5e9b74b4        myimgaename         "bash"              21 minutes ago      Up 6 minutes        0.0.0.0:7000->8000/tcp   containername
Run Code Online (Sandbox Code Playgroud)

网络细节:

     "NetworkSettings": {
        "Bridge": "",
        "SandboxID": "fe357c54c816fff0f9d642037dc9a173be7f7e42a80776d006572f6a1395969e",
        "HairpinMode": false,
        "LinkLocalIPv6Address": "",
        "LinkLocalIPv6PrefixLen": 0,
        "Ports": {
            "8000/tcp": [
                {
                    "HostIp": "0.0.0.0",
                    "HostPort": "7000"
                }
            ]
        }
Run Code Online (Sandbox Code Playgroud)

如果我在mymachine(hostmachine)访问docker ipaddr(172.11.0.10)或hostname(www.myhost.net)它工作

但是,如果我使用端口访问不起作用:hostmachine ip:192.168.1.1

  go to the browser  192.168.1.1:7000  hostmachine and locally connected anoter machine also.
Run Code Online (Sandbox Code Playgroud)

但我的7000端口是在hostmachine听:

        # ps aux | grep 7000
        root     10437  0.0  0.2 194792 24572 pts/0    Sl+  12:33   0:00 docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 7000 -container-ip 172.11.0.10 -container-port 8000
        root     10941  0.0  0.0 118492  2324 pts/3    R+   12:44   0:00 grep --color=auto 7000
Run Code Online (Sandbox Code Playgroud)

更新1:

      $ docker version
        Client:
         Version:      1.11.2
         API version:  1.23
         Go version:   go1.5.4
         Git commit:   b9f10c9
         Built:        Wed Jun  1 21:39:21 2016
         OS/Arch:      linux/amd64

        Server:
         Version:      1.11.2
         API version:  1.23
         Go version:   go1.5.4
         Git commit:   b9f10c9
         Built:        Wed Jun  1 21:39:21 2016
         OS/Arch:      linux/amd64
Run Code Online (Sandbox Code Playgroud)

建议我为什么无法访问我的Container到另一台机器.如何解决这个问题

Elt*_*man 15

端口7000的主机上是重定向到端口8000的容器,但任何事情听在容器中的端口?

您的docker run命令有点奇怪:-it用于以连接的终端交互运行容器; -d是为了在后台运行超脱; bash最后会覆盖图像配置为启动命令的任何内容,这就是为什么我认为没有什么可以监听端口8000.

尝试运行最简单的NGINX容器:

docker run -d -p 8081:80 nginx:alpine
Run Code Online (Sandbox Code Playgroud)

然后验证您是否可以访问主页:

curl http://localhost:8081
Run Code Online (Sandbox Code Playgroud)

如果这有效,那么我会看看你是如何运行图像的.

  • 在我的情况下localhost:8081不起作用.我必须使用docker-machine ip default(192.168.99.100).知道为什么localhost没有工作? (2认同)
  • 当您“本地”使用 Docker 时,容器“绑定”到主机,因此您使用“localhost”。当您使用 Docker Toolbox 之类的替代方案时,Docker 在虚拟机内运行,因此容器“绑定”到虚拟机的“localhost”,并且您需要使用其 IP 地址(通常为“192.168.99.100”) (2认同)

Den*_*din 10

我找到了这篇文章,但遇到了另一个问题,并且我确定以下建议可以帮助某人:

将您的应用程序绑定到Docker内部的0.0.0.0而不是127.0.0.1地址,以使Docker到达容器内的应用程序。

  • 这是什么意思?不要只使用英语。发布完整的 docker 命令。 (9认同)
  • 稍微简化的解释:您的网络应用程序必须附加到 IP 地址,以便其他应用程序/浏览器/服务器/用户可以发现它进行连接。“0.0.0.0” IP 地址意味着您的应用程序将附加到您拥有的所有 IP 地址。`127.0.0.1` IP 地址是私有的,外部无法使用。由于您的应用程序在容器中运行,因此您的主机是它的外部世界,您必须将套接字附加到容器的*外部*地址“0.0.0.0”,以让您的主机连接到它。 (7认同)
  • 哦,我明白了,它是“告诉应用程序绑定”而不是“告诉 docker 绑定应用程序”明白了。 (3认同)
  • 这意味着什么? (2认同)
  • 我正在使用 Rails,并且需要使用 `bin/rails server --binding 0.0.0.0` 而不是 `bin/rails server` (2认同)