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端口转发不起作用的主要内容,如果未能解决你的问题,请参考以下文章
firewall-cmd centos 端口转发似乎不起作用?