当前位置: 首页 > 面试题库 >

Docker Macvlan网络,无法访问互联网

乐正瑞
2023-03-14
问题内容

我有一个具有多个IP地址的专用服务器,某些IP关联了mac地址,而其他IP(在子网中)则没有mac地址。我已经使用以下方法创建了docker
macvlan网络:

docker network create -d macvlan -o macvlan_mode=bridge --subnet=188.40.76.0/26 --gateway=188.40.76.1 -o parent=eth0 macvlan_bridge

我的IP:88.99.102.115,Mac:00:50:56:00:60:42。使用以下方法创建了一个容器:

docker run --name cont1 --net=macvlan_bridge --ip=88.99.102.115 --mac-address 00:50:56:00:60:42 -itd nginx

这有效,我可以从外部访问该IP地址托管的Nginx。

IP没有MAC地址且网关不在子网中的情况。

子网:88.99.114.16/28,网关:88.99.102.103

无法使用以下方式创建网络:

docker network create -d macvlan -o macvlan_mode=bridge --subnet=88.99.114.16/28 --gateway=88.99.102.103 -o parent=eth0 mynetwork

引发错误:

no matching subnet for gateway 88.99.102.103

尝试增加子网范围以包含网关:

docker network create -d macvlan -o macvlan_mode=bridge --subnet=88.99.0.0/16 --gateway=88.99.102.103 -o parent=eth0 mynetwork

创建了网络,然后使用“
mynetwork”启动了nginx容器,我没有用于88.99.114.18的mac地址,因此使用了一些随机的mac地址40:1c:0f:bd:a1:d2。

docker run --name cont1 --net=mynetwork --ip=88.99.114.18 --mac-address 40:1c:0f:bd:a1:d2 -itd nginx

无法达到nginx(88.99.102.115)。

  1. 如果网关不在子网中,如何创建macvlan docker网络?
  2. 当我只有IP地址但没有mac地址时,如何使用macvlan网络运行容器?

我对网络知识不多,如果您进行详细解释,这将非常有帮助。

我的/ etc / network / interfaces文件:

### Hetzner Online GmbH - installimage
# Loopback device:
auto lo
iface lo inet loopback
iface lo inet6 loopback
# device: eth0
auto  eth0
iface eth0 inet static
  address   88.99.102.103
  netmask   255.255.255.192
  gateway   88.99.102.65
  # default route to access subnet
  up route add -net 88.99.102.64 netmask 255.255.255.192 gw 88.99.102.65 eth0

iface eth0 inet6 static
  address 2a01:4f8:221:1266::2
  netmask 64
  gateway fe80::1

问题答案:

您可能想先阅读简单的路由概念或子网和路由

如果网关不在子网中,如何创建macvlan docker网络?

网关地址必须与接口在同一子网中。要使用此新子网,您将需要用完一个IP地址并将其分配在主机上的某个位置作为网关。

子网路由到网桥网络。

从主机屏幕快照中,已将88.99.114.16/28子网设置为通过主机88.99.102.103进行路由。如果希望Docker使用子网中的其余IP地址,则需要在主机上的某个位置创建一个接口用作网关。

创建一个供Docker使用的网桥网络,该网桥将被分配网关地址88.99.114.17

docker network create \
  --driver=bridge \
  --subnet 88.99.114.16/28 \
  --gateway=88.99.114.17 \
  name0

您可能还需要启用IP转发才能使路由正常工作。在/etc/sysctl.conf以下位置配置IP转发:

net.ipv4.ip_forward = 1

并应用新设置

sysctl -p /etc/sysctl.conf

然后使用路由网络在新桥上运行容器,应该能够访问网关和互联网

docker run --net=name0 --rm busybox \
  sh -c "ip ad sh && ping -c 4 88.99.114.17 && wget api.ipify.org"

您可能需要允许访问iptables中的子网,具体取决于您的默认FORWARD策略。

iptables -I DOCKER -d 88.99.114.16/28 -j ACCEPT

可以从外部访问子网中的服务

docker run --net=name0 busybox \
  nc -lp 80 -e echo -e "HTTP/1.0 200 OK\nContent-Length: 3\n\nHi\n"

然后在外面

○→ ping -c 2  88.99.114.18
PING 88.99.114.18 (88.99.114.18): 56 data bytes
64 bytes from 88.99.114.18: icmp_seq=0 ttl=63 time=0.527 ms
64 bytes from 88.99.114.18: icmp_seq=1 ttl=63 time=0.417 ms

--- 88.99.114.18 ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.417/0.472/0.527/0.055 ms

○→ curl 88.99.114.18
Hi

不需要macvlan接口映射。

当我只有IP地址但没有mac地址时,如何使用macvlan网络运行容器?

macvlan用于将物理/主机接口映射到容器中。由于您没有这些地址的物理接口,因此很难将其映射到容器中。



 类似资料:
  • 这是minikube dashbaord的输出 我在安全组级别和LinuxVM上启用了端口45493。但是,当我尝试访问Kube仪表板时,运气不好。 但是,当我执行下面的操作时,它工作并生成状态代码为200的index.html文件 在高级别重现的步骤如下: > EC2 Ubuntu的大小t2.large 安装minikube, 执行部署,就像k kubectl get pods -n kuber

  • 问题内容: 我的智慧到此为止,我梳理了每个Google搜索结果,没有任何帮助。 我完全无法使Docker容器访问互联网。IP转发已启用(),ufw已关闭,我尝试添加这些标志。我在Google上找到的所有可能的解决方案都失败了。 有人知道如何提供帮助吗? 尝试按照此处的建议重设所有内容,通过告诉我即使它没有运行,也可能破坏整个事情。 问题答案: 解决。我按照以下说明进行操作:在行中注释掉

  • 我正在尝试将容器部署到AWS上的专用网络Fargate集群。我的单个专有网络上确实有一个互联网网关: 我的集群/服务所在的VPC中确实有一个NAT网关,用于特定子网: 该子网的路由似乎也可以: 服务的安全组不会阻止任何传入连接: 但我的容器甚至没有以臭名昭著的异常开始:CannotPullContainerError:来自守护进程的错误响应:Gethttps://registry-name/:ne

  • Docker容器访问与互联 Docker 允许通过外部访问容器或容器互联的方式来提供网络服务。 Dockefile在网络方面除了提供一个EXPOSE之外,没有提供其它选项。下面这些参数可以覆盖Dockefile的expose默认值: --expose=[] : Expose a port or a range of ports from the container

  • 使用 HTTP 进行网络访问 有时候我们需要从网络上获取资源数据,一种常见的解决方法就是使用 HTTP 进行网络访问。 使用 HTTP 进行网络访问有三个步骤: 创建一个 HTTP 请求 HttpRequest 通过 setResponseCallback() 设置一个请求完成时的回调函数 使用 HttpClient 发送 HttpRequest HttpRequest 有四种类型:POST PU

  • 我在Ubuntu 16上使用python 3.5。 我正在尝试使用aiohttp编写一个简单的客户端。 这是我的代码。我从这里拿走了。这是禁用ssl检查的第一个代码示例: 对于某些站点,此代码有效。对于其他人,包括或则不起作用。相反,代码会产生以下错误: 我尝试了一个简单的脚本,类似这样: 这工作,我能够达到谷歌。curl和wget也可以访问谷歌。 做一些研究,我遇到了一个不同的问题。那个问题和我