玩转Docker-------第四部------------(原生网络&自定义网络、容器通信)

Docker网络——实现容器间通信、容器与外网通信以及容器的跨主机访问 前言 自定义网络 建议使用自定义的网桥来控制哪些容器可以相互通信,还可以自动DNS解析容器名称到IP地址。Docker提供了创建这些网络的默认网络驱动程序,你可以创建一个新的Bridge网络,Overlay或Macvlan网络。你还可以创建一个网络插件或远程网络进行完整的自定义和控制。 你可以根据需要创建任意数量的网络,并且可以在任何给定时间将容器连接到这些网络中的零个或多个网络。此外,您可以... 阅读详情

玩转Docker-------第四部------------(原生网络&自定义网络、容器通信)

1.Docker原生网络

安装Docker时,它会自动创建三个网络,bridge(创建容器默认连接到此网络)、 none 和host。

docker network ls

在这里插入图片描述

docker网络模式功能
Host容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
Container(Joined)创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围。
None该模式关闭了容器的网络功能。
Bridge此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信。
运行容器的时候指定网络模式:

模式					参数
host模式				使用 --net=host(–network host) 指定。
none模式				使用 --net=none 指定。
bridge模式				使用 --net=bridge 指定,默认设置。
container模式			使用 --net=container:NAME_or_ID 指定。

bridge网桥模式

bridge模式是Docker默认的网络设置,当Docker server启动时,会在主机上创建一个名为docker0的虚拟网桥。
在这里插入图片描述
docker安装时会创建一个名为docker0的linux bridge,新建的容器会自动桥接到这个接口

[root@server1 ~]# docker run -d --name nginx nginx
998e60bd9dcd844c256d2889dfbc31e5cb7b7a34cfbd9298340b57d65142ac9c
[root@server1 ~]# brctl show
bridge name	bridge id		STP enabled	interfaces
docker0		8000.02422aa432f0	no		veth3c75f87

在这里插入图片描述
可以发现,当挂起一个容器时,就会出现相对应的网桥接口:

docker inspect nginx

在这里插入图片描述
这时,我们的容器就通过docker0网桥与宿主机建立通信了:

ping 172.17.0.3
curl 172.17.0.3

在这里插入图片描述

桥接模式下容器没有公共 ip,只有宿主机可以访问,外部主机不可见,容器要访问外网必须通过宿主机的 NAT 规则,所以我们如果要想通过访问本机的80端口去访问容器,就需要做端口映射,将容器的80映射到server1主机上的80端口才行。而且桥接模式下容器是没有对外的ip的,在企业中我们的server1主机ip应该是能进入到公网的IP,所以我们打开ip_forward的功能,让容器可以通过server1访问到外网。

不仅如此,只要宿主机做了NAT,我们同时在容器中做好dns解析,就能与外网通信

在这里插入图片描述
这样在容器开启的时候,就会生成网络对,相当于一根网线,连接容器与docker0,docker0在通过内核路由功能转发到我们的真实网卡上面,然后在出去,访问到公网。

host模式

host模式下容器会和宿主机共享网络。

相当于使用了Vmware中的桥接模式,与宿主机在同一个网络中,但没有独立IP地址。

一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离。一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。

host模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。

做此过程之前删除上一步骤中运行的所有容器

netstat -antlp	#先查看宿主机的端口情况
docker run -d --name nginx  --network host nginx
netstat -antlp	#再次查看宿主机的端口情况(80端口打开了)
brctl show

在这里插入图片描述
在这里插入图片描述
我们可以看到它并不像bridge模式那样,没有在docker0下桥接接口,而是与宿主机共用一个网络

用外部主机访问,可以看到nginx默认发布页面

curl 192.168.43.71

在这里插入图片描述

docker run -it --rm --network host busybox
ip addr

在这里插入图片描述
可以看到与宿主机的网络一模一样

这时候,如果此时我们再开一个nginx:

docker run -d --name nginx2  --network host nginx
docker ps	#开启成功
docker ps	#其中一个nginx消失
docker ps -a	#可以看到被停掉的nginx

在这里插入图片描述
在这里插入图片描述
这是因为两个nginx的端口和ip冲突了

none模式

none模式是指禁用网络功能,只有lo接口,在容器创建时使用–network none

none模式关闭了容器的网络功能,但是在以下两种情况下是有用的:

  1. 容器并不需要网络(例如只需要写磁盘卷的批处理任务)。
  2. overlay:在docker1.7代码进行了重构,单独把网络部分独立出来编写,所以在docker1.8新加入的一个overlay网络模式。
docker run -it --rm --network none busybox
ip addr

在这里插入图片描述

可以看到只有lo接口

在这里插入图片描述
查看到网络是不可以使用的

2.Docker自定义网络

原生网络是docker安装后自动创建的,真正需要配置的是自定义网络。

Docker 提供三种 user-defined 网络驱动:bridge, overlay 和 macvlan。

bridge驱动类似默认的bridge网络模式,但增加了一些新的功能
overlay 和 macvlan 用于创建跨主机的网络

bridge网络驱动

[root@server1 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
f905d0cfd038        bridge              bridge              local
5dc66fa4665c        host                host                local
304f37a81f85        none                null                local
[root@server1 ~]# docker network create -d bridge my_net1     # 创建自定义桥接
c73546940ab666d4c641eed79df76d8963f133a578b570209f1a6e922ce90efe
[root@server1 ~]# docker network ls       #可以看出我们的自定义网络加进去了
NETWORK ID          NAME                DRIVER              SCOPE
f905d0cfd038        bridge              bridge              local
5dc66fa4665c        host                host                local
c73546940ab6        my_net1             bridge              local
304f37a81f85        none                null                local

[root@server1 ~]# docker run -it --name vm1 --network my_net1 ubuntu  # 用自定义网络运行
root@9616cfb055e9:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
9: eth0@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
       valid_lft forever preferred_lft forever
## 发现网段变成了172.18网段了,说明自定义网络的时候网段是递增的,和开启容器时ip递增一样

## 我们还可以自定义网关和网段:
[root@server1 ~]# docker network create -d bridge --subnet 172.22.0.0/24 --gateway 172.22.0.1 my_net2
f5f5655d83dbd39958379c8c90d75025748a18787eb5de120f64224e83eee3d3
[root@server1 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
f905d0cfd038        bridge              bridge              local
5dc66fa4665c        host                host                local
c73546940ab6        my_net1             bridge              local
f5f5655d83db        my_net2             bridge              local
304f37a81f85        none                null                local
[root@server1 ~]# docker run -it --name vm2 --network my_net2 ubuntu
root@2da970629875:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
12: eth0@if13: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:16:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.22.0.2/24 brd 172.22.0.255 scope global eth0  #确实变成了172.22网段
       valid_lft forever preferred_lft forever


##自定义IP
[root@server1 ~]# docker run -it --name vm3 --network my_net2  --ip 172.22.0.100 ubuntu
root@71d882cabbc7:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
14: eth0@if15: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:16:00:64 brd ff:ff:ff:ff:ff:ff
    inet 172.22.0.100/24 brd 172.22.0.255 scope global eth0
       valid_lft forever preferred_lft forever
root@71d882cabbc7:/# ping 172.22.0.2     #可以ping同刚才那个VM2容器,因为桥接在同一网络上
PING 172.22.0.2 (172.22.0.2) 56(84) bytes of data.
64 bytes from 172.22.0.2: icmp_seq=1 ttl=64 time=0.207 ms
64 bytes from 172.22.0.2: icmp_seq=2 ttl=64 time=0.086 ms
64 bytes from 172.22.0.2: icmp_seq=3 ttl=64 time=0.158 ms
^C
--- 172.22.0.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.086/0.150/0.207/0.050 ms


[root@server1 ~]# brctl show
bridge name	bridge id		STP enabled	interfaces
br-c73546940ab6		8000.02421577f327	no		veth734b2f2  #my_net1只桥接了一个网卡
br-f5f5655d83db		8000.024214c10f10	no		vethee1d0ed
							vethfdca8a6                      # my_net2桥接了两个
docker0		8000.02422aa432f0	no		
# 桥接在不同网桥上的容器,彼此之间不能通信#

[root@server1 ~]# iptables -S
-A DOCKER-ISOLATION-STAGE-2 -o br-f5f5655d83db -j DROP
-A DOCKER-ISOLATION-STAGE-2 -o br-c73546940ab6 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
可以看到三个网桥对互相之间的数据都是DROP
都是互相丢弃的所以不同网桥之间是无法通信的。

那我们如何让不同网桥之间进行通信呢?

[root@server1 ~]# docker network connect my_net2 vm1
[root@server1 ~]# docker attach vm1
root@9616cfb055e9:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
9: eth0@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
       valid_lft forever preferred_lft forever
16: eth1@if17: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:16:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.22.0.3/24 brd 172.22.0.255 scope global eth1      # 多了172.22的网卡
       valid_lft forever preferred_lft forever
root@9616cfb055e9:/# ping vm1
PING vm1 (172.18.0.2) 56(84) bytes of data.
64 bytes from 9616cfb055e9 (172.18.0.2): icmp_seq=1 ttl=64 time=0.028 ms
64 bytes from 9616cfb055e9 (172.18.0.2): icmp_seq=2 ttl=64 time=0.033 ms
64 bytes from 9616cfb055e9 (172.18.0.2): icmp_seq=3 ttl=64 time=0.032 ms
^C
--- vm1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.028/0.031/0.033/0.002 ms
root@9616cfb055e9:/# ping vm2
PING vm2 (172.22.0.2) 56(84) bytes of data.
64 bytes from vm2.my_net2 (172.22.0.2): icmp_seq=1 ttl=64 time=0.066 ms
64 bytes from vm2.my_net2 (172.22.0.2): icmp_seq=2 ttl=64 time=0.050 ms
64 bytes from vm2.my_net2 (172.22.0.2): icmp_seq=3 ttl=64 time=0.048 ms
^C64 bytes from vm2.my_net2 (172.22.0.2): icmp_seq=4 ttl=64 time=0.048 ms
64 bytes from vm2.my_net2 (172.22.0.2): icmp_seq=5 ttl=64 time=0.050 ms
64 bytes from vm2.my_net2 (172.22.0.2): icmp_seq=6 ttl=64 time=0.140 ms
64 bytes from vm2.my_net2 (172.22.0.2): icmp_seq=7 ttl=64 time=0.066 ms
^C64 bytes from vm2.my_net2 (172.22.0.2): icmp_seq=8 ttl=64 time=0.051 ms
64 bytes from vm2.my_net2 (172.22.0.2): icmp_seq=9 ttl=64 time=0.049 ms
^C
--- vm2 ping statistics ---
9 packets transmitted, 9 received, 0% packet loss, time 8001ms
rtt min/avg/max/mdev = 0.048/0.063/0.140/0.028 ms
root@9616cfb055e9:/# ping vm3
PING vm3 (172.22.0.100) 56(84) bytes of data.
64 bytes from vm3.my_net2 (172.22.0.100): icmp_seq=1 ttl=64 time=0.057 ms
^C
--- vm3 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.057/0.057/0.057/0.000 ms
#我们发现可以ping通#

root@9616cfb055e9:/# cat /etc/hosts
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.18.0.2	9616cfb055e9
172.22.0.3	9616cfb055e9   #这就是dns的自动解析,它自带dns解析

这里我们先介绍bridge,overlay 和macvlan在我们学习了容器之间的通信之后在进行学习

3.Docker容器间通信

通过上面的实验我们可以知道,使用同一自定义网络(即同一网段)运行的容器是可以相互通信的,那么如果两个容器不在同一网段,但我们也想让它通信,怎么办?

方法1:使用内嵌的 DNS server 通过容器名去自动解析容器的IP地址

[root@server1 ~]# docker run -it --name vm1 --network my_net1 ubuntu
root@21692ff10442:/# [root@server1 ~]# docker run -it --name vm2 --network my_net1 ubuntu
root@c9c781f485c2:/# ping vm1
PING vm1 (172.18.0.2) 56(84) bytes of data.
64 bytes from vm1.my_net1 (172.18.0.2): icmp_seq=1 ttl=64 time=0.061 ms
64 bytes from vm1.my_net1 (172.18.0.2): icmp_seq=2 ttl=64 time=0.051 ms
^C
--- vm1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.051/0.056/0.061/0.005 ms
root@c9c781f485c2:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
20: eth0@if21: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.3/16 brd 172.18.255.255 scope global eth0
       valid_lft forever preferred_lft forever
  我们可以看到这里多出了一个网卡eth0@if21,ip为172.18.0.3

方法2:joined(类似于默认的 host 模式,容器之间共享网络)

container模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。

[root@server1 ~]# docker run -it --name vm1  ubuntu
root@9ff4ffcba7c0:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
22: eth0@if23: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
root@9ff4ffcba7c0:/# [root@server1 ~]# docker run -it --name vm2  --network container:vm1 ubuntu
root@9ff4ffcba7c0:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
22: eth0@if23: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

可以发现,和vm1网络完全一致,使用相同的网络name space:

这样做的用处在于,两个容器之间可以使用 localhost(回环接口)进行快速通信,适用于 web 服务器和应用服务器。

方法3:使用–link连接容器

[root@server1 ~]# docker run -d nginx     #不加--name时系统会自动分配一个容器名
105b5c0c65f16c22681f6f193411ba459b12af7a225021cb8f23282cba5d818d
[root@server1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
105b5c0c65f1        nginx               "nginx -g 'daemon of…"   15 seconds ago      Up 14 seconds       80/tcp              lucid_aryabhata
[root@server1 ~]# docker run -it --name vm1 --link lucid_aryabhata:web ubuntu
###使用--link连接这个容器,并为它起个别名web,因为系统给的太难记了###
root@6c5b91bc7b5b:/# ping web
PING web (172.17.0.2) 56(84) bytes of data.
64 bytes from web (172.17.0.2): icmp_seq=1 ttl=64 time=0.070 ms
64 bytes from web (172.17.0.2): icmp_seq=2 ttl=64 time=0.106 ms
^C     #发现是可以通信的,这是因为我们的容器做了两件事
--- web ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.070/0.088/0.106/0.018 ms
root@6c5b91bc7b5b:/# cat /etc/hosts    # 第一,写了解析
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.17.0.2	web 105b5c0c65f1 lucid_aryabhata
172.17.0.3	6c5b91bc7b5b
root@6c5b91bc7b5b:/# env   # 第二设置了环境变量
...    
WEB_NAME=/vm1/web
WEB_PORT_80_TCP_PROTO=tcp
WEB_PORT_80_TCP_ADDR=172.17.0.2
...



[root@server1 ~]# docker stop lucid_aryabhata    #关闭刚开始的nginx容器
lucid_aryabhata
[root@server1 ~]# docker run -d nginx            #重新开一个
db52f4e7087049f0c0fba22cc2d9b909eb52a70cb266fb6940308f72a668fdf2
[root@server1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
db52f4e70870        nginx               "nginx -g 'daemon of…"   2 minutes ago       Up 2 minutes        80/tcp              happy_ptolemy
[root@server1 ~]# docker inspect happy_ptolemy
 "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",  #它的ip地址也是172.17.0.2
                    "IPPrefixLen": 16,

[root@server1 ~]# docker start lucid_aryabhata    #再打开刚才第一个nginx容器
lucid_aryabhata
[root@server1 ~]# docker inspect lucid_aryabhata 
 "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.3",      # 它的ip地址变成了0.3了
          #####说明容器关闭后其获得的ip地址会被释放#####


[root@server1 ~]# docker start lucid_aryabhata 
lucid_aryabhata
[root@server1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
db52f4e70870        nginx               "nginx -g 'daemon of…"   13 minutes ago      Up 13 minutes       80/tcp              happy_ptolemy
105b5c0c65f1        nginx               "nginx -g 'daemon of…"   29 minutes ago      Up 8 seconds        80/tcp              lucid_aryabhata
[root@server1 ~]# docker start vm1 
vm1
[root@server1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
db52f4e70870        nginx               "nginx -g 'daemon of…"   13 minutes ago      Up 13 minutes       80/tcp              happy_ptolemy
6c5b91bc7b5b        ubuntu              "/bin/bash"              29 minutes ago      Up 5 seconds                            vm1
105b5c0c65f1        nginx               "nginx -g 'daemon of…"   30 minutes ago      Up 25 seconds       80/tcp              lucid_aryabhata
[root@server1 ~]# docker attach vm1 
root@6c5b91bc7b5b:/# 
root@6c5b91bc7b5b:/# 
root@6c5b91bc7b5b:/# 
root@6c5b91bc7b5b:/# cat /etc/hosts 
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.17.0.3	web 105b5c0c65f1 lucid_aryabhata     #VM1上的本地解析也变了
172.17.0.4	6c5b91bc7b5b

4.容器是如何访问外网的?

容器与外网通信是通过iptables的SNAT实现的:

容器访问外网是通过 iptables 的 SNAT 实现的,容器和 docker0 是桥接的方式,docker0 是
容器的网关,到达 docker0 后,通过 linux 内核的路由功能(ip_forward),然后防火墙会做
伪装,也就是 SNAT,然后通过物理网卡接口到外网。

[root@server1 ~]# iptables -t nat -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-N DOCKER
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.22.0.0/24 ! -o br-f5f5655d83db -j MASQUERADE
-A POSTROUTING -s 172.18.0.0/16 ! -o br-c73546940ab6 -j MASQUERADE   #为容器的ip做了地址伪装
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A DOCKER -i br-f5f5655d83db -j RETURN
-A DOCKER -i br-c73546940ab6 -j RETURN
-A DOCKER -i docker0 -j RETURN

在物理机开启ip_forward让server1可以上网

[root@server0 ~]# sysctl -a |grep ip_forward
net.ipv4.ip_forward = 1
net.ipv4.ip_forward_use_pmtu = 0

# 测试:
[root@server1 ~]# ping baidu.com
PING baidu.com (220.181.38.148) 56(84) bytes of data.
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=1 ttl=51 time=61.6 ms
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=2 ttl=51 time=47.0 ms
^C
--- baidu.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 47.045/54.362/61.679/7.317 ms

#然后我们在进入ubuntu容器测试:
[root@server1 ~]# docker start vm1
vm1
[root@server1 ~]# docker attach vm1 
root@6c5b91bc7b5b:/# 
root@6c5b91bc7b5b:/# ping baidu.com
PING baidu.com (39.156.69.79) 56(84) bytes of data.
64 bytes from 39.156.69.79: icmp_seq=1 ttl=47 time=58.3 ms
64 bytes from 39.156.69.79: icmp_seq=2 ttl=47 time=48.7 ms
^C
--- baidu.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 48.767/53.583/58.399/4.816 ms
root@6c5b91bc7b5b:/# 
# 这样容器就也可以上网了。

5.外网是如何访问容器的?

[root@server1 ~]# docker run -d --name vm1 -p 80:80 nginx  做端口映射(冒号后的是容器内部的端口)
d995bd5ba8fe0008c288081d958fcb0bab05c9532232dc6c1986c7be2e3eee85
[root@server1 ~]# docker port vm1     ##查看容器端口映射情况
80/tcp -> 0.0.0.0:80
[root@server1 ~]# iptables -t nat -S     ##查看防火墙策略
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.2:80

访问流程:
外部主机访问时--> 访问到宿主机的 eth0(192.168.43.71:80)--> 然后火墙做了DNAT转换 --> 访问172.17.0.2(容器地
址)

测试:访问192.168.43.71
在这里插入图片描述

在这里插入图片描述
docker-proxy 打开了80端口,我们每打开一个容器,都会开启一个docker-proxy 进程

在这里插入图片描述

注意:

宿主机访问本机容器使用 iptables 的 DNAT,外部主机访问容器或者容器之间访问是
docker-proxy 实现的。

流程:

外部主机 --> 宿主机 eth0 --> docker-proxy(外部访问容器时通过 docker-proxy 处理数据
包,不是防火墙) --> docker0(172.17.0.1) --> 容器

6.Docker跨主机的容器网络

docker跨主机的网络方式:

docker原生的overlay和macvlan
第三方的flannel、weave、calico

CNM(container network model)模型

三类组件作用
Sandbox容器网络栈(namespace
Endpoint将sandbox接入network(veth)
Network包含一组endpoint,同一network的endpoint可以通信

使用macvlan实现Docker容器跨主机网络

macvlan特点:

  1. 使用linux内核提供的一种网卡虚拟化技术
  2. 性能好:因为无需使用桥接,直接使用宿主机物理网口。

清理掉之前的容器,删除自定义网络:

[root@server1 ~]# docker network prune
WARNING! This will remove all networks not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Networks:
my_net1
my_net2

[root@server1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
baa31764f59f        nginx               "nginx -g 'daemon of…"   8 minutes ago       Up 8 minutes        0.0.0.0:8080->80/tcp   vm2
d995bd5ba8fe        nginx               "nginx -g 'daemon of…"   19 minutes ago      Up 19 minutes       0.0.0.0:80->80/tcp     vm1
[root@server1 ~]# docker rm -f vm1
vm1
[root@server1 ~]# docker rm -f vm2
vm2
[root@server1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

给两台主机都添加上一块新的虚拟网卡。
在这里插入图片描述

[root@server1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:a5:b1:7f brd ff:ff:ff:ff:ff:ff
    inet 192.168.43.71/24 brd 192.168.43.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 240e:bf:d429:dd57:20c:29ff:fea5:b17f/64 scope global mngtmpaddr dynamic 
       valid_lft 2237sec preferred_lft 2237sec
    inet6 2409:8a70:f8a1:ae10:20c:29ff:fea5:b17f/64 scope global mngtmpaddr dynamic 
       valid_lft 259144sec preferred_lft 172744sec
    inet6 fe80::20c:29ff:fea5:b17f/64 scope link 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:2a:a4:32:f0 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:2aff:fea4:32f0/64 scope link 
       valid_lft forever preferred_lft forever
44: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 00:0c:29:a5:b1:89 brd ff:ff:ff:ff:ff:ff

添加之后,我们可以看到现在有ens0和eth1这两块网卡

激活这两块网卡,并开启混杂模式:

server1:
[root@server1 ~]# ip link set up eth1
[root@server1 ~]# ip link set eth1 promisc on

server2:
[root@server2 ~]# ip link set up eth1
[root@server2 ~]# ip link set eth1 promisc on
[root@server2 ~]# ip a
能看到PROMISC 就会说明开启了
4: eth1: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> 

在这里插入图片描述

server1和server2上创建macvlan 网络模型:

[root@server1 ~]# docker network create -d macvlan --subnet 172.20.0.0/24 --gateway 172.20.0.1 -o parent=eth0 macvlan1
90bee86d976bb3293faf2531d7c71e82666f540cafed47ec6d3f756480cbb1fc

[root@server2 ~]# docker network create -d macvlan --subnet 172.20.0.0/24 --gateway 172.20.0.1 -o parent=eth0 macvlan1
499d58aa9c967b3559302a57a664d1abde6c0afef74d12c7cc70a8f9eba3b0ee

在这里插入图片描述
在这里插入图片描述

[root@server1 ~]# docker run -it --name vm1 --network macvlan1 --ip 172.20.0.11 ubuntu
[root@server2 ~]# docker run -it --name vm2 --network macvlan1 --ip 172.20.0.12 ubuntu
#运行容器,macvlan 模型这里必须手动指定 ip 地址,如果不指定会自动分配,单调递增,两台主机可能会冲突。

在server1上:
root@1046c09fdcab:/# ping 172.20.0.12
PING 172.20.0.12 (172.20.0.12) 56(84) bytes of data.
64 bytes from 172.20.0.12: icmp_seq=1 ttl=64 time=0.956 ms
64 bytes from 172.20.0.12: icmp_seq=2 ttl=64 time=0.548 ms

在server2上:
root@e22da2aae025:/# ping 172.20.0.11
PING 172.20.0.11 (172.20.0.11) 56(84) bytes of data.
64 bytes from 172.20.0.11: icmp_seq=1 ttl=64 time=0.458 ms
64 bytes from 172.20.0.11: icmp_seq=2 ttl=64 time=0.558 ms


#########两台主机就可以互相通信了##########


[root@server1 rpms]# brctl show
bridge name	bridge id		STP enabled	interfaces
docker0		8000.02422aa432f0	no	

[root@server2 ~]# brctl show
bridge name	bridge id		STP enabled	interfaces
docker0		8000.0242c65fa427	no	

并且两台主机的网络都没有桥接到docker0上。而是直接占用了物理网卡。无需 NAT 或端口映射

但是,我们发现这样就出现了一个问题,我们每次创建一个网络就需要一块新的网卡,这样显然是不现实的。

解决方法:

macvlan会独占网卡,但是可以使用vlan的子接口实现多macvlan网络,最多可以将物理二层网络划分成4094各逻辑网络,且彼此隔离。

所以:macvlan网络在物理网络二层是隔离的,无法直接通信,但是可以在三层上(即容器内部)通过网关将macvlan网络连通起来。

使用 vlan 子接口实现多 macvlan 网络

vlan 可以将物理二层网络划分为 4094 个逻辑网络,彼此隔离,取值为 1~4094,这样就极大的提升了网卡的复用性

[root@server1 rpms]# docker network create -d macvlan --subnet 172.21.0.0/24 --gateway 172.21.0.1 -o parent=eth0.1 macvlan2
b908e524d6ae3471366ef0351b7fcfb6d8213fcbd1258d065e6bb7324329a541
[root@server1 rpms]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
f905d0cfd038        bridge              bridge              local
5dc66fa4665c        host                host                local
90bee86d976b        macvlan1            macvlan             local
b908e524d6ae        macvlan2            macvlan             local
304f37a81f85        none                null                local


[root@server2 ~]# docker network create -d macvlan --subnet 172.21.0.0/24 --gateway 172.21.0.1 -o parent=eth0.1 macvlan2
6731f6bfad762ebe68028166a566a59102d6a4a34017c00408fa4aa5a0a7da70
[root@server2 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
353e8449c00f        bridge              bridge              local
0c145a0ac5db        host                host                local
499d58aa9c96        macvlan1            macvlan             local
6731f6bfad76        macvlan2            macvlan             local
7369a58f2403        none                null                local

server1和server2:
6: eth0.1@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 00:0c:29:05:08:07 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::20c:29ff:fe05:807/64 scope link 
       valid_lft forever preferred_lft forever

[root@server1 ~]# docker run -it --name vm3 --network macvlan2 --ip 172.21.0.11 ubuntu
[root@server2 ~]# docker run -it --name vm4 --network macvlan2 --ip 172.21.0.12 ubuntu

在这里插入图片描述
在这里插入图片描述
同一个macvlan的容器才可以互相通信

注意:macvlan 网络在二层是隔离的,所以不同 macvlan 容器不能通信,可以在三层通过网关连接(加路由),docker 本身不做任何限制,像传统 vlan 那样管理即可。网络选型时如果对网络比较熟悉,选 macvlan较好,因为只需要把网络设备调整好,docker 方面基本不用做什么调整。

docker 同宿主机不同网络容器通信+跨宿主机容器之间网络互连详解 覆盖网络(Overlay Network)优点:内置支持,易于使用,支持多主机通信和服务发现。缺点:需要 Docker Swarm 模式。第三方网络插件(如 Weave Net)优点:提供更高级的网络功能,适用于复杂网络需求。缺点:需要额外安装和配置。使用桥接网络(变通方法)优点:不需要额外的网络插件,适用于简单的跨宿主机通信。缺点:配置复杂,需要手动设置路由和 IP 转还有种docker compose 需要借助 docker swarm 就不介绍了。 阅读详情

相关推荐

Docker --docker网络知识详解(原生网络、自定义网络、容器通信、跨主机容器网络)

1、Docker的原生网络 docker的镜像是令人称道的地方,但网络功能还是相对薄弱的部分。 docker安装后会自动创建3种网络:bridge、host、none

ly660402的博客 1247

Docker学习之路(三)Docker网络详解

1. Docker的4种网络模式 我们在使用docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式: host模式,使用--net=host指定。 container模式,使用--net=container:NAME_or_ID指定。 none模式,使用--net=none指定。 bridge模式,使用--net=...

1693

Docker容器通信

桥接口 Docker容器通信 容器之间除了使用ip通信外,还可以使用容器名称通信。 docker 1.10开始,内嵌了一个DNS server. dns解析功能必须在自定义网络中使用。 启动容器时使用 --name 参数指定容器名称。 默认的桥接中不带解析。 server1 docker run -d --name vm1 --network my_net1 nginx #-d 打入后台 docker run -it --name vm2 --network my_net1 ubuntu ping vm1

weixin_46754666的博客 2965

docker之网络配置

docker之网络配置

weixin_67677668的博客 9280

Docker网络——原生网络介绍、自定义网络创建、实现容器间通信、容器与外网通信、跨主机网络访问

1.什么是Docker网络?     Docker早期版本中的网络基于主机桥接,但是Docker 1.0包含了一种新形式的网络,允许容器直接连接到主机以太网接口。默认情况下,一个容器有一个回路以及一个连接到默认内部桥接的接口,但是如果需要的话也可以配制成直接访问。通常,直接访问比桥接的速度更快。   然而,桥接方法在许多情况下是非常有用的。桥接是通过主机自动创建一个内部网络适配器并为其分配一个主机本身尚未使用的子网。然后,当新的容器连接到这座桥,它们的地址进行自动分配。容器启动时你可以将其连接到主机接口或端

weixin_45792518的博客 973

【云原生】第七篇--Docker容器网络与通信原理深度解析

自从docker容器出现以来,容器的网络通信就一直是大家关注的焦点,也是生产环境的迫切需求。而容器的网络通信又可以分为两大方面:单主机容器上的相互通信和跨主机的容器相互通信。而本文将分别针对这两方面,对容器的通信原理进行简单的分析,帮助大家更好地使用docker。...

检哥说IT的博客 1978

Docker—— --net=host参数改变容器网络模式

--net=host: (1).加了--net=host以后就不需要再做端口映射了.比如docker容器内在8080端口起了一个web server.不加的话需要把本机的某个port比如7979和docker内的8080做一个映射关系,访问的时候访问7979. 加了net=host则直接访问8080. 另外,加了net=host后会使得创建的容器进入命令行好名称显示为主机的名称而不是一串id.  root@box:/# (2).容器中的app1无法访问到宿主机的app2,因为两者不在一个网络内。最简

Ti__iT的博客 2万+

【71页PPT】工业40及智能制造解决方案(附下载方式)

2013年,工业4.0平台发布白皮书,正式确立其发展战略。工业4.0不仅是技术的升级,更是制造业思维的重构。工业4.0的核心是通过信息物理系统(CPS)实现工厂内外的互联,构建高度灵活的个性化生产模式。它不仅是技术革新,更是一种生产方式的变革,使传统行业界限模糊化,催生新的商业模式和合作形式。德国作为制造业强国,其GDP的25%和出口总额的60%依赖制造业,因此工业4.0成为其维持全球领先地位的重要战略。CPS是工业4.0的基石,通过计算、通信与控制技术(3C)实现物理世界与信息世界的深度融合。

2501_92808811的博客 950

docker容器使用--net=host获取容器IP,报错VM-XX:Name or Service not known

目录标题1. 背景和问题背景问题问题查找 1. 背景和问题 背景 项目使用了Nacos微服务架构,由于项目运行需要启动注册中心、网关、认证中心、分布式事务中心等多个微服务,非常占用物理机内存和CPU,所以部署了一个开发服务器,把这些服务运行在服务器上,我只需要运行自己正在开发的的服务模块就可以,这样开发用的物理机一下就释放了很多内存,开发起来更顺畅。 问题 但是问题来了,docker容器自动分配的ip为172.17.0.0/24网段的ip,开发用的物理机和这个容器不在一个网段,根本没法访问到,这时候网上查到

小兀的博客 6288

RK3576+IMX415 MIPI摄像头零拷贝显示系统

MIPI CSI-2是嵌入式视觉系统中主流的高速图像传感器接口标准,其核心价值在于低延迟、高带宽与硬件级DMA直通能力。基于V4L2子系统与DRM/KMS驱动栈,可构建从传感器RAW数据到帧缓冲区的零拷贝通路,显著降低CPU负载并提升实时性。该技术广泛应用于工业检测、边缘AI推理前数据接入及多路同步采集等场景。本文以Rockchip RK3576 SoC和索尼IMX415传感器为典型组合,详解MIPI物理层适配、内核驱动集成、GStreamer零拷贝管道搭建及systemd服务化部署,覆盖从硬件信号完整性到

weixin_36047538的博客 217

Eclipse在Mac上报错JNI_CreateJavaVM?可能是你的JDK架构搞错了(附Adoptium JDK下载指南)

本文深入解析了Mac(尤其是Apple Silicon芯片)上Eclipse启动时出现“JNI_CreateJavaVM”错误的根本原因,即JDK架构(aarch64与x86_64)不匹配。文章提供了详细的诊断步骤,并推荐通过下载并配置Eclipse Adoptium提供的aarch64版本JDK来彻底解决问题,同时附上清晰的配置指南。

weixin_29065659的博客 321

5、网络配置

目标 1、Docker网络配置 2、Docker部署SpringCloud项目 Docker网络配置 Docker网络模式介绍 Docker在创建容器时有四种网络模式:bridge/host/container/none,bridge为默认不需要用–net去指定,其他三种模式需要在创建容器时使用–net去指定 1.bridge模式(默认模式) docker run时使用–net=bridge,这种...

weixin_45180919的博客 402

OnlyOffice Docker部署踩坑实录:解决Nginx反向代理导致的editor.bin下载失败

本文详细解析了在Docker中部署OnlyOffice时,因Nginx反向代理配置不当导致editor.bin下载失败的常见问题。通过分析问题根源,提供了从Nginx代理配置、Docker网络设置到OnlyOffice容器内部调整的完整解决方案,并分享了实战调试技巧与性能优化建议,帮助用户彻底解决这一部署难题。

wine的专栏 523

Docker 4 (网络模式:Docker原生网络、自定义网络、容器通信、跨主机容器网络)

目录一、Docker原生网络1.桥接网络2.host网络3.none模式二、Docker自定义网络2.创建自定义网桥3.双网卡实现不同网段间通信三、Docker容器通信1.内部访问外部2.外部访问内部四、跨主机容器网络1.跨主机同网段容器通信2.跨主机不同网段容器通信 一、Docker原生网络 docker的镜像是令人称道的地方,但网络功能还是相对薄弱的部分。docker安装后会自动创建3种网络:bridge、host、none; 首先将前面的harbor仓库停掉 docker安装时会创建一个名为 doc

qq_38664479的博客 2215

零基础学写《扫雷》游戏(Qt扫雷源码)

扫雷游戏是在windows系统中自带的游戏,他的游戏玩法其实很简单,20世纪初期电脑上没有啥游戏可以玩,所以扫雷游戏也算是当时是最常火爆的一个电脑游戏。以下文章详细介绍扫雷游戏的实现。实现语言为C++。

啊渊的专栏 1万+

【STM32实物】基于STM32设计的智能仓储管理系统

近年来,随着我国仓储发展的和药品需求的不断增多,许多医院都采用药物仓储管理系统。我国的药物仓储产业已经有了长足的发展,仓库的规模不断变大,对仓储的要求也不断增高,药物的存储,识别以及对仓储环境条件的要求成为仓储的重要决策,他们可以根据不同的特点在不同场景中使用。本文详细介绍了一个基于单片机技术的智能仓储管理系统的设计与实现,这个系统可谓是集射频识别(RFID)技术和环境监测传感器于一身,旨在提高仓储操作的自动化和精确度。

嵌入式阿齐Archie 1万+

Docker原生网络、自定义网络、Docker容器通信、跨主机容器网络

Docker原生网络、自定义网络、Docker容器通信、跨主机容器网络

weixin_44891093的博客 1721

新能源汽车电池及充电原理详解

本文详细介绍了新能源汽车的电池包结构、铅酸电池充放电原理,以及交流和直流充电的工作原理和优缺点。内容涵盖电池串联并联原因、充电设备如车载充电机、交流充电桩和直流充电桩的介绍,以及不同充电模式的连接方式。通过对充电过程的深入探讨,有助于读者理解新能源汽车的充电技术。

让你爱上电路设计 4525

Docker网络配置与自定义IP容器通信

互联网是由许多小型网络构成的,每个网络上都有许多主机,这样便构成了一个有层次的结构。IP地址在设计时就考虑到地址分配的层次特点,将每个IP地址都分割成网络号和主机号两部分,以便于 IP地址的寻址操作。

让优秀成为一种习惯! 3044

Cadence PSpice 模型1:基于自带库新建二极管的PSpice模型图文教程

使用Cadence PSpice进行电路图的仿真时,难免会遇到软件自带库中没有合适的元器件的情况,这就需要设计师自己新建元器件模型,本文详细介绍使用PSpice软件修改自带库的元器件模型的参数以得到自己需要的PSpice模型库的方法。

fydar的博客 4413

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an &ldquo;advanced algorithms&rdquo; book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Docker 网络模型深度解析:原生模式、自定义网络与容器通信

Docker 网络是容器化应用的核心基础设施,它实现了容器与容器、容器与宿主机、容器与外部网络的互联互通。理解 Docker 网络模型,是构建复杂分布式容器应用的前提。本文将从 Docker 原生网络模式、自定义网络创建与接入、容器间通信与 DNS 解析 三个维度,全面拆解 Docker 网络的工作原理与实战操作。

YongCheng_Liang的博客 1528

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

docker网络(原生网络、自定义网络、容器间通信、外网访问容器、跨主机容器网络)

1.docker原生网络 #docker在安装好时会有3种网络模型:bridge(默认),host,none [root@server1~]#dockernetworkls NETWORKID NAME DRIVER SCOPE ea925c5af3d3 bridge bridge local be91de06ba4f host host local ed22b5d774a7 none null local #docker在安装好后会自动新建一个docker0的接口,所有的容器都会自动桥接到docker0

Aimee_c的博客 3214

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Docker 高级网络 - 自定义网桥实现容器间通信

docker netword create -d 网桥类型(不指定,默认是 bridge) 网络名称例如创建一个类型为 bridge,名称为 mynet1 的网络.

CYK_byte的博客 2937

Docker-学习总结(原生网络、自定义网络、同一主机不同容器通信、跨主机不同容器通信)

文章目录概念原生网络自定义网络容器通信访问外网跨主机容器网络模型macvlan 概念 网络对 网络栈 docker - porxy 端口映射自动创建docker-proxy 网卡混杂模式 promisc 原生网络 bridge host容器和物理机网络共享 none 自定义网络 bridge-DNS 容器名 与 IP地址解析(单机) overlay(集群) macvlan(集群) 自定义 –sub...

csdnlb的博客 935

Docker容器网络与通信

Overlay 网络是指在不改变现有网络基础设施的前提下,通过某种约定通信协议,把二层报文封装在IP报文之上的新的数据格式。这样不但能够充分利用成熟的IP路由协议进程数据分发;而且在 Overlay 技术中采用扩展的隔离标识位数,能够突破 VLAN 的4000数量限制支持高达16M的用户,并在必要时可将广播流量转化为组播流量,避免广播数据泛滥。因此,Overlay 网络实际上是目前最主流的容器跨节点数据传输和路由方案。

m0_62943934的博客 1502

Docker篇之docker容器之间的通信

自从Docker容器工具诞生以来,当我们在正式线上环境进行容器部署以及容器管理任务时,通常容器之间是需要进行数据通信的,来支撑正常业务运转。因此容器间的通信也随之成为热点,也是生产环境中的重中之重。 容器间的网络通信可分为两大方面:单主机容器上的相互通信,跨主机的容器相互通信。 一、Docker单主机容器通信 1、假设通过容器ip访问 【不可行】 由于docker容器每次在重启后,其IP会发生变化。因此通过容器ip访问不可行。 2、假设通过宿主机的ip:port访问 【不可行】 通过宿主机的ip:port

小橙子的笔记屋 7403
上一篇: 玩转Docker----- 第三部-----------docker公有、私有仓库的搭建
下一篇: 玩转Docker-------第五部-----------数据卷管理&convoy卷插件
xrt0211
博客等级 码龄7年 270粉丝 115原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值