目录
4.1使用docker network create命令在docker内自定义一个网络
一、概述
docker run创建Docker容器时,可以用--net选项指定容器的网络模式。
Docker有以下多种种网络模式:
bridge模式 | 使--net =bridge指定,默认设置;这是默认的网络驱动程序(不指定驱动程序创建的容器默认是bridge驱动) |
host模式 | 使--net =host指定;主机网络。消除容器和主机的网络隔离,直接使用主机的网络 |
none模式 | 使--net =none指定;表示关闭容器的所有网络连接 |
container模式 | 使--net =container:NAMEorID指定。(局限大,很少用) |
overlay | 覆盖网络。可以将多个Docker守护进程连接,实现跨主机容器通讯(swarm集群) |
macvlan | 将MAC地址分配给容器,使容器作为网络上的物理设备。不通过Docker主机网络栈进行路由,直接通过MAC地址路由到容器。 |
自定义网络 | 自己设置网关,每个容器的ip |
网络插件 | 可以通过Docker安装和使用第三方网络插件 |
使用docker network ls来查看docker网络模式
[root@zhoujunru ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
1a1e6b67637f bridge bridge local
95d22f1b2507 host host local
2ddda9c8493a none null local
使用docker network inspect network-id命令查看一个具体网络的详细信息
二、bridge模式
2.1、网桥工作原理:
网桥是数据链路层的工作设备,它的工作原理类似于交换机的工作原理,是根据数据包的目的MAC地址来转发数数据。当一个数据包到达网桥的一个接口时,网桥会读取数据包的目的MAC地址,并将其保存在一个转发表中,然后,网桥会检查这个MAC地址是否在转发表中,如果目的MAC地址在转发表中,则网桥会将数据包转发到相应的接口,并更新转发表中信息。如果目的MAC地址不在转发表中,则网桥会将数据包广播到所有的其他接口,以便寻找目的设备的位置。通过这种工作原理,网桥可以根据目的MAC地址来进行有针对性的转发,来提高网络的传输效率和数据安全性。
在docker网络中,docker0网桥是一个用于连接多个docker容器的虚拟网络设备。它实际上是一个liuux内核的虚拟交换机,与物理交换机相似。但是只能在主机内部进行通信。它的作用是将多个docker容器连接在同一逻辑网段中,实现docker容器之间的通信。
在网络层面,通常通过路由器来实现不同网段之间的通信。而网桥主要用于连接同一网段内的设备,连接不同网段的设备和网络通常需要使用路由器。在某些情况下,网桥也可以用于实现不同网段之间的通信,这种方式被称为桥接路由。
桥接路由是一种将两个不同网段连接起来的技术,其中通过网桥将两个网段连接起来 ,然后设置网桥接口的IP地址作为两个网段的默认网关,从而实现两个网段之间的互相通信。
2.2、docker网桥工作原理
当启动一个docker容器时,docker将会为它创建一个虚拟以太网接口(veth-pair),其中一个端点连接到docker宿主机上,一个端点连接搭配容器内部。这个虚拟以太网设备实际上是两个veth-pair设备,一个在容器内部,一个在宿主机上。Docker网桥(docker0)将这些连接到同一网桥上的容器之间的流量转发到正确的容器上去,从而实现容器之间的通信。
在docker内部,docker网桥(docker0)还内置了dhcp服务器,能够自动为新创建的容器分配IP地址,并设置默认网关等网络参数。因此,docker容器会被自动分配到相同的网段中,这个网段是docker网桥的所处的网段。
一般Docker会使用172.17.0.0/16这个网段,并将172.17.0.1/16分配给docker0网桥(在主机上使用ip addr命令是可以看到docker0,在宿主机上作为一块虚拟网卡使用)
2.3、验证测试
分别运行centos01、centos02容器
观察现象:
# centos01 --- linux主机 veth0ec6ae3@if28 ---- 容器内 eth0@if29
# centos02 --- linux主机 vethb41650c@if30 ---- 容器内 eth0@if31
# 只要启动一个容器,就有一对网卡
# veth-pair 就是一对的虚拟设备接口,它都是成对出现的。一端连着协议栈,一端彼此相连着。
# 正因为有这个特性,它常常充当着一个桥梁,连接着各种虚拟网络设备
在centos02容器中测试与宿主机和其他容器的网络连通性。
对应的网络拓扑图:
三、host模式
如果启动容器的时候使用host模式,是和宿主机共用一个网络。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
使用host模式启动容器centos03:
使用host模式启动容器后看到,使用ip addr查看网络环境时,看到的都是宿主机上的信息。这种方式创建出来的容器,可以看到host上的所有网络设备。这种方式是不安全的。如果在隔离良好的环境中(比如租户的虚拟机中),可以使用这种方式。
四、自定义网络
使用自定义网络的好处就是网络隔离。
对应的网络拓扑图:
4.1使用docker network create命令在docker内自定义一个网络
[root@zhoujunru ~]# docker network create --help
Usage: docker network create [OPTIONS] NETWORK
Create a network
Options:
--attachable Enable manual container attachment
--aux-address map Auxiliary IPv4 or IPv6 addresses used by Network driver (default map[])
-d, --driver string Driver to manage the Network (default "bridge")
--gateway stringSlice IPv4 or IPv6 Gateway for the master subnet
--help Print usage
--internal Restrict external access to the network
--ip-range stringSlice Allocate container ip from a sub-range
--ipam-driver string IP Address Management Driver (default "default")
--ipam-opt map Set IPAM driver specific options (default map[])
--ipv6 Enable IPv6 networking
--label list Set metadata on a network (default [])
-o, --opt map Set driver specific options (default map[])
--subnet stringSlice Subnet in CIDR format that represents a network segment
4.2启动两个容器测试,使用刚刚自定义的网络mynet
再来查看下mynet网络的详细信息
4.3测试ping容器名和IP地址,看看能不能ping通
4.4配置网络连通
配置处于docker0网桥的所在网络的容器centos02与处于自定义网络中的容器cento04能够互相ping通。
使用docker network connect 命令连接容器cento02到另外一个网络mynet
此时centos02与centos04容器能够互相ping通。
再次测试centos01与centos04能不能互相ping通过。发现不能ping通,原因是配置网络连接。
结论:处于不同网络的容器如果要跨网络与其他容器通信,就需要使用 docker network connect [OPTIONS] NETWORK CONTAINER 连接