Docker端口转发不起作用

Posted

技术标签:

【中文标题】Docker端口转发不起作用【英文标题】:Docker port forwarding not working 【发布时间】:2017-01-24 08:21:30 【问题描述】:

我已经设置了 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

创建容器后详情:

        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

网络详情:

     "NetworkSettings": 
        "Bridge": "",
        "SandboxID": "fe357c54c816fff0f9d642037dc9a173be7f7e42a80776d006572f6a1395969e",
        "HairpinMode": false,
        "LinkLocalIPv6Address": "",
        "LinkLocalIPv6PrefixLen": 0,
        "Ports": 
            "8000/tcp": [
                
                    "HostIp": "0.0.0.0",
                    "HostPort": "7000"
                
            ]
        

如果我在 mymachine(hostmachine) 中访问 docker ipaddr(172.11.0.10) 或主机名(www.myhost.net),它就可以工作

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

  go to the browser  192.168.1.1:7000  hostmachine and locally connected anoter machine also.

但我的 7000 端口在主机中监听:

        # 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

更新 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

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

【问题讨论】:

你使用的是docker工具箱还是原生docker? @Shiraaz.M 我使用的是本机 docker,我使用命令行安装(fed23)dnf install docker 【参考方案1】:

一个很常见的问题可能是这样的:

将 Docker 中的 app 绑定到 0.0.0.0,而不是 127.0.0.1 地址,让 Docker 访问容器内的应用。

【讨论】:

谢谢! 0.0.0.0 它是关键。我的示例是简单的 php 独立服务器:d run --rm -p 8091:8091 -v (pwd):(pwd) -w (pwd) --name php php:7.3 php -S 0.0.0.0:8091 这是什么意思?不要只使用英语。发布完整的 docker 命令。 哦,我明白了,这是“告诉应用程序绑定”而不是“告诉 docker 绑定应用程序”。 这是什么意思? 稍微简化的解释:您的网络应用程序必须附加到 IP 地址,以便其他应用程序/浏览器/服务器/用户可以发现它进行连接。 0.0.0.0 IP 地址意味着您的应用程序将附加到您拥有的所有 IP 地址。 127.0.0.1 IP 地址是私有的,在外面不可用。由于您的应用程序在容器中运行,因此您的主机是它的外部世界,您必须将套接字附加到容器的 external 地址0.0.0.0 以让您的主机连接到它。跨度> 【参考方案2】:

主机上的端口7000 正在重定向到容器中的端口8000,但是容器中的该端口上是否有任何监听?

您的docker run 命令有点奇怪:-it 用于在附加终端的情况下以交互方式运行容器; -d 用于在后台分离运行;最后的bash 覆盖了图像配置为启动命令的任何内容,这就是为什么我认为端口8000 上没有任何监听。

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

docker run -d -p 8081:80 nginx:alpine

然后验证是否可以进入首页:

curl http://localhost:8081

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

【讨论】:

在我的情况下 localhost:8081 不起作用。我必须改用 docker-machine ip default (192.168.99.100)。知道为什么 localhost 不起作用吗? 当你“本地”使用 Docker 时,容器被“绑定”到主机,所以你使用localhost。当您使用 Docker Toolbox 之类的替代方案时,Docker 在 VM 内运行,因此容器“绑定”到 VM 的 localhost,您需要使用其 IP 地址(通常为 192.168.99.100【参考方案3】:

这发生在我使用 Docker for Mac 的情况下。点击 Docker 图标,然后Restart 就成功了。

【讨论】:

【参考方案4】:

您好,我在使用 Dockerfile 构建映像时遇到了这个问题。我意识到更改后我无法将地址设置为特定的 IP 地址含义

    srv := &http.Server
    Handler: s,
    Addr:    "127.0.0.1:5000",

    srv := &http.Server
    Handler: s,
    Addr:    ":5000",

命令docker run -dp 5000:5000 --name myapiserver api_server:v1 工作正常。 我可以毫无问题地访问容器端口 5000。所以要在容器中得出结论,您只能设置服务器的端口?

更新

127.0.0.1 是您的主机不会发送到外部的 IP 地址,处理方式的正确方法是通过所有 IP 地址发送,即 0:0:0:0 或仅端口。

【讨论】:

【参考方案5】:

对于在 docker 容器内运行 serverless-offline 的任何人:

我试图将我的 mac 上的 localhost:3000 映射到默认的 serverless-offline 应用程序端口 3000(在 docker 中运行),达到了预期的结果,如下所示:

(1) 将--host:0.0.0.0 添加到通常的无服务器离线命令中,如下所示:

serverless offline --host 0.0.0.0

(2) 然后用通常的端口映射运行 docker 容器:

docker run -p 3000:3000 <your-image-name>

注意:需要重建我的映像(在运行之前)以使一切正常运行。

【讨论】:

【参考方案6】:

我使用 Docker Wordpress 容器遇到了这个问题。

疑难解答:

在 Docker 主机本身上执行的curl -Is http://192.168.X.X 会按预期返回结果,但在我位于不同子网的笔记本电脑上执行的相同命令只会挂起。

telnet 192.168.X.X 80 相同:这将在 Docker 主机本身的端口 80 上按预期连接,但不在 Docker 主机之外;它也会挂起。

docker logs containerName 没有提供有用的线索。

在路由器的防火墙上,我允许 Docker 主机和我的笔记本电脑之间的一切,以确保路由器的防火墙不会中断端口 80 上的连接。

解决方案:

为了清除错误,我决定从docker run 命令中删除我的自定义网络以降低复杂性。

与 OP 一样,我在 docker run 命令中指定了我自己的自定义网络和 IP 地址。但是当我从docker run 命令中删除--net--ip 时,容器会使用默认网桥和Docker DHCP 分配的地址上升。

测试解决方案:

我使用以下方法找到了我的 Wordpress 容器的 IP:

docker inspect -f 'range.NetworkSettings.Networks.IPAddressend' wordpressContainerName

并尝试在我笔记本电脑的浏览器中加载 Wordpress。现在可以在不同子网上的 Docker 主机外部的转发端口 80 上联系容器。

结论:

docker run 命令中删除--net--ip 解决了我的问题;当然是 YMMV。

【讨论】:

【参考方案7】:

你可以使用docker run -d -p 127.0.0.1:9000:4000 --name some-container some-image-name或者你可以使用-it标志

【讨论】:

【参考方案8】:

经过千小时挖掘这个问题,我终于用这种愚蠢的方式解决了它:

    已卸载 docker:

sudo yum 删除 docker 码头工人客户端 码头工人客户端最新 码头工人普通 码头工人最新的 码头工人-最新的-logrotate 码头工人-logrotate 码头引擎 docker-ce

    更新我的centos系统:

    yum -y 更新

    重启

    重新安装docker

    重新安装容器/镜像

现在它就像一个魅力。

【讨论】:

【参考方案9】:

部分答案:

现在我部分解决了这个问题,虽然我尝试不使用 bash 创建容器并将我的 端口更改为 3000(-p 3000:80) 它对我有用.

命令前:

     docker run -it -d --name containerName -h www.myhost.net -v /var/www/html -p 3000:80 --net mynetwork --ip 172.11.0.10 --privileged myimagename  bash

命令后:

    docker run -it -d --name containerName -h www.myhost.net -v /var/www/html -p 3000:80 --net mynetwork --ip 172.11.0.10 --privileged myimagename

那么,

使用 bin/bash

执行容器
  docker exec -it containerName bin/bash

现在,在本地工作 连接另一台机器。

 hostmachineip:3000 


I don't know docker have any port restrictions.But This solution works for me.

【讨论】:

【参考方案10】:

当我遇到这个问题时(使用 docker-compose 管理的一组 docker 实例),我发现删除 docker-compose 解决了问题的网络:

docker-compose stop
# find the network related to my docker-compose setup
docker network ls
docker network rm NETWORKNAME
# let docker-compose recreate the network:
docker-compose up -d

【讨论】:

docker-compose down 做所有这些 确实如此,还有更多?通过执行上述操作(仅网络),我不会丢失卷、容器或图像?

以上是关于Docker端口转发不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Docker构成端口范围向前

Vagrant上的Rails 4.2服务器端口转发不起作用

无法访问 Prometheus 仪表板/端口转发不起作用

firewall-cmd centos 端口转发似乎不起作用?

通过堡垒主机到 VPC 中的 Elasticsearch 集群的 ssh 端口转发不起作用

SSH -L 连接成功,但 localhost 端口转发不起作用“通道 3:打开失败:连接失败:连接被拒绝”