Docker端口转发无法正常工作

时间:2016-09-16 07:19:38

标签: docker portforwarding 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

创建容器详细信息后:

        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)或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.

但我的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

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

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

6 个答案:

答案 0 :(得分:14)

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

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

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

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

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

curl http://localhost:8081

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

答案 1 :(得分:12)

我找到了这篇文章,但是又遇到了另一个问题,我相信以下建议可以帮助某人:

将您的应用绑定到Docker中的 0.0.0.0 ,而不是 127.0.0.1 地址,以使Docker到达容器内的应用。 / p>

答案 2 :(得分:2)

部分答案:

现在我部分地解决了这个问题,虽然我在没有 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.

答案 3 :(得分:0)

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

答案 4 :(得分:0)

这对我来说是w / Docker for Mac。单击Docker图标,然后完成Restart的操作。

答案 5 :(得分:0)

嗨,我在使用 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 地址,处理方式的正确方法是发送所有 0:0:0:0 的 IP 地址或简称为仅端口。

>