繁体   English   中英

无法从桥接网络上的 Docker 容器内部访问 HTTP

[英]Cannot access HTTP from inside Docker container on bridge network

我的开发环境位于 Vagrant (VirtualBox) Linux 服务器上,该服务器上运行着 MySQL(端口 3306)和 Tomcat(端口 18080)。 这是我运行 Docker 的主机服务器。

我需要在 docker 中运行另一个服务,该服务连接到主机上的 MySQL 和 Tomcat 服务器以及任何外部 Web 服务器。

我发现到主机的 MySQL 连接很好。 但是,与 HTTP(端口 80 或 443)的连接将超时。 如果我在 Mac 上运行相同的 Docker 映像(在 Vagrant 之外),我可以连接到 MySQL 和任何外部 Web 服务器)。

以下是详细信息:

在我的主机上 (Vagrant)

[root@my Downloads]# ip addr show docker0
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:95:b0:5e:47 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.1/24 brd 192.168.100.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:95ff:feb0:5e47/64 scope link 
       valid_lft forever preferred_lft forever
[root@my Downloads]# 

我进入 Docker 并尝试连接到主机的 MySQL。 这工作正常。

[root@my Downloads]# docker exec -it myDocker sh
/opt/myDocker # nc 192.168.100.1 3306
Q
5.7.26-29-logf"}1
                 Q&
                   ??S???&z GTP[a{mysql_native_passwordasdasd
!??#08S01Got packets out of order^Cpunt!

/opt/myDocker # 

但是,如果我尝试连接到 HTTP,则它不起作用。

/opt/myDocker # nc 192.168.100.1 18080
/opt/myDocker # nc www.google.com 80
GET /
/opt/myDocker # GET /
sh: GET: not found
/opt/myDocker # 

在 18080 上连接到我的主机的 Tomcat 将返回到提示。 google.com 上的那个会在那里挂一段时间,然后返回提示。

我在主机(Vagrant VM)上尝试了https://docs.docker.com/network/bridge/ 中提到的以下内容,但没有帮助。

sysctl net.ipv4.conf.all.forwarding=1
iptables -P FORWARD ACCEPT

我没有想法了。 有人可以帮忙吗?

编辑 1:我认为这一定与桥接网络有关。 我在具有主机网络的同一 VM 上尝试了另一个 docker,这很好。

/dokcer2 # nc 192.168.100.1 18080
GET /



<!DOCTYPE html >
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no">
    <meta name="theme-color" content="#000000">
    <link rel="shortcut icon" href="/auth/images/favicon.ico?v=13"/>
    <link rel="stylesheet" type="text/css" href="/auth/static/styles/main.a7589877fc3cc07b7ac7.css"/>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="loginAppRoot"></div>
<script type="text/javascript" src="/auth/static/js/main.f5071db7f71c2283a0f9.js"></script>
</body>
</html>^Cpunt!

/docker2 # nc www.google.com 80
GET /
HTTP/1.0 200 OK
Date: Sun, 15 Nov 2020 05:21:20 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
... yada yada yada redacted ...
  1. 好的,首先我建议更好地了解 docker 网络(和网络)

Docker 网络概览

Docker 桥接网络

绑定容器端口

  1. 在你的情况下:

虚拟机内网为10.0.2.0/24(带桥接接口10.0.2.1)
Docker内网为192.168.100.0/24(带桥接接口192.168.100.1)

当您尝试连接到虚拟机时,您使用的是 10.0.2.11,而不是 10.0.2.1(即桥接接口)
Docker 的网络是一样的。 您无法直接通过 192.168.100.1 访问 192.168.100.11 的容器,因为您无法从 192.168.0.X 访问 10.0.2.1。
您需要将端口从 192.168.100.0/24 绑定(转发)到 10.0.2.0/24 并通过 10.0.2.X 访问您的服务。
如何绑定端口? 请参阅Binding container ports链接
Docker 的内部网络(我图片中的浅蓝色)仅适用于 Docker。

码头工人网络

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM