docker bridge不能联网_一分钟看懂Docker的网络模式和跨主机通信

  • vagrant启动虚拟机docker-node1,通过docker-node1启动里面的容器test1 和test2,当进入test1容器,ping baidu发现可以ping通。这是什么原理呢,肯定是通过可以转接的方式,容器---虚拟机----宿主机--baidu。
f2edd221f5aef348170697cb6860a93b.png
230ea13058c21df4b4668fb3db81b537.png
09dec71eeb778f6894a93dff2d9a4722.png

为了更好的了解docker网络

  • 停止test2,删除test2
sudo docker pssudo docker stop test2sudo docker rm test2sudo docker ps
8a73fa41093f672e1447e18de42b36be.png
  • docker 网络

可以看到一个 ,这也是linux中常见的一种网络结构。桥接的形式

sudo docker network ls
0516e70e039e27ecf2d7e4f33a2da1aa.png

对于test1 来讲,他是通过bridge的方式

sudo docker inspect test1
8a379a606d23b48751058dd5c790711b.png
ip a

这个机器有5个网路,除了lo,eth0,eth1,docker0,veth8765ce0@if5,上节课讲过veth其实是连接了2个networknamespace,veth8765ce0@if5是负责连接docker0上边的,容器test1里面也应该有个和veth连接的。

423de536aa146a2f5c0c3eed4bdcdd03.png
sudo docker exec test1 ip a

eth0@if6 和外边的veth8765ce0@if5 其实是一对。

c1e45637ad9aa5ec1b65c71465393f0a.png

查看他们的关系

sudo yum install -y bridge-utils#安装后可以运行brctl这个命令了brctl
47bb3e74a60ffc83cdfdc8ae02e1163f.png
1342091d71d5d761c61cbe83db5c190e.png
brctl show

因为目前就一个test1的桥接,所以就显示一个。

b58e00b090625d35884a38b6e701ddc7.png
sudo docker run -d --name test2 busybox /bin/sh -c "while true; do sleep 3600;done"brctl showsudo docker network inspect bridgeip a

多创建了容器,其实多了一对veth,容器内多了veth,宿主内也增加了veth,其实就类似一个线,他们互相连接。

eb39aed937ee8212a7577b6dad062e49.png
09a6be21efadbcf9d1932cfe21627507.png
01cf3d1f157738bf8d08a598664ded85.png

test1 和test2 之前通过docker0,docker0 类似test1和test2之前的路由器,docker0 在通过nat的eth0连接互联网

0377f1cbbed717b59649696bb0dbb8f6.png

PS:主要理解容器之前如何的互相访问,容器和外边的世界如何通信。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于第一个问题,我可以为您解答Java UDP网段广播与接收的问题。 首先,UDP是一种无连接的传输协议,它不像TCP那样建立连接,而是直接将数据包发送出去。因此,UDP广播可以实现网段的传输。 下面是一个Java UDP广播和接收的示例代码: 广播端: ```java import java.net.*; public class UDPBroadcaster { public static void main(String[] args) throws Exception { DatagramSocket socket = new DatagramSocket(); socket.setBroadcast(true); String message = "Hello, World!"; DatagramPacket packet = new DatagramPacket(message.getBytes(), message.length(), InetAddress.getByName("255.255.255.255"), 8888); socket.send(packet); socket.close(); } } ``` 接收端: ```java import java.net.*; public class UDPReceiver { public static void main(String[] args) throws Exception { DatagramSocket socket = new DatagramSocket(8888); byte[] buffer = new byte[1024]; DatagramPacket packet = new DatagramPacket(buffer, buffer.length); socket.receive(packet); String message = new String(packet.getData(), 0, packet.getLength()); System.out.println("Received message: " + message); socket.close(); } } ``` 在广播端,我们创建了一个DatagramSocket,并将其设置为广播模式。然后,我们创建一个DatagramPacket,并将其发送到广播地址(255.255.255.255)的端口8888。在接收端,我们同样创建了一个DatagramSocket,并指定端口号为8888。当接收到数据包时,我们可以从DatagramPacket中获取数据,并将其转换为字符串。 接下来,我为您解答第二个问题。如果您想在Docker容器之间实现主机通信,您可以使用Docker网络Docker网络是一种虚拟网络,它允许Docker容器在同一主机或不同主机之间进行通信。 下面是一个使用Docker网络进行主机通信的示例: 假设我们有两台主机,分别为Host1和Host2。我们在Host1上创建一个名为mynetwork的Docker网络,并在该网络中启动一个名为container1的容器: ``` docker network create mynetwork docker run --name container1 --network mynetwork -d busybox sleep 3600 ``` 然后,在Host2上也创建一个名为mynetwork的Docker网络,并在该网络中启动一个名为container2的容器: ``` docker network create mynetwork docker run --name container2 --network mynetwork -d busybox sleep 3600 ``` 现在,我们可以在container1中ping container2: ``` docker exec container1 ping container2 ``` 在这个示例中,我们使用Docker网络实现了在两台主机之间的容器通信。您可以使用类似的方法在其他应用程序中实现主机通信。 希望以上解答对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值