Docker端口转发不起作用。

61

我已经设置了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"
                }
            ]
        }
如果我在我的主机(hostmachine)上使用Docker的IP地址(172.11.0.10)或主机名(www.myhost.net)进行访问,则可以正常工作。但是,如果我使用端口进行访问,则无法正常工作:主机机器的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

请告诉我为什么无法从另一台机器访问我的容器,该如何解决这个问题。


1
你是使用Docker Toolbox还是本地Docker? - Shiraaz.M
@Shiraaz.M 我正在使用本地的 Docker,我使用命令行(fed23)安装它 dnf install docker。 - Rajkumar .E
13个回答

0
在我的情况下,我登录了Docker容器(postgresql),并看到它的IP地址是172.18.0.13(通过运行ifconfig或ip a,如果您正在运行基于Debian的容器,则可以通过apt-get install net-tools进行安装)。
我能够从主机机器上很好地连接到容器(使用netcat,通过运行apt-get install netcat-traditional进行安装):
nc -vz 172.18.0.13 5432

但是尝试从外部连接到暴露的端口5433并没有成功。

接下来我检查了iptables设置:

iptables -nL -t nat --line-numbers |grep 5433

并查看输出

7   DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:5433 to:172.18.0.2:5433

所以端口转发的IP地址指向docker_gwbridge(或错误的IP)。我想可能是某些旧容器还在,或者是其端口转发设置,或者是docker gwbridge中的一些故障。重新启动docker可能有所帮助,和/或在启动docker之前清除/刷新所有iptables设置。但是,我有一些正在运行的生产容器,我试图避免服务中断,因此我手动删除了冒犯性规则(第7行)。

iptables -t nat -D DOCKER-INGRESS 7

然后我手动将转发添加到正确的容器中(注意!请将接口-i更改为您的出口接口):

iptables -t nat -I DOCKER-INGRESS -p tcp -i eth0 --dport 5433 -j DNAT --to-destination 172.18.0.13:5432

请注意,这是一个临时性的解决方案,因为 Docker 不断将规则改回不工作的版本,所以迟早需要重新启动。

-1
当我遇到这个问题(使用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

2
docker-compose down 做了所有的事情。 - rustyx
通过上述操作,我不会失去任何卷、容器或镜像(只有网络),这是真的吗? - dsummersl

-1

部分答案:

现在我部分地解决了这个问题,当我尝试在创建容器时不使用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.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接