最近有几个已经就业的小伙伴,过来问千锋健哥关于Docker网络配置的问题,他们在实际开发中还是有些疑问。关于Docker网络这一块的内容确实很多,为了让大家搞清楚这个问题,健哥准备搞几篇系列文章,来为各位小伙伴解惑。这次健哥带来的是Docker网络的Bridge模式,接下来我们直接上干货!!!
Docker容器和服务之所以强大的原因之一,是可以将它们连接在一起,或者将它们连接到非Docker的工作负载上。而Docker容器和服务甚至都不需要知道它们部署在Docker容器上。无论Docker主机是运行在Linux、window上,或者两者混合运行,都可以使用Docker以与平台无关的方式来管理它们。
而这一切的基础,都是缘于Docker网络提供的强大功能和良好设计!
一. 操作环境
我们先说一下运行所需要的环境,如下:
centos 7.x版本
docker版本:Docker version 20.10.18, build b40c2f6
xshell 7
二. Docker network 常用命令
我们先来看看Docket中提供的常用network命令。
1.查看docker network帮助手册
[root@hecs-215393 ~]# docker network --help # 查看docker network 帮助手册
Usage: docker network COMMAND
Manage networks
Commands:
# 通过网络连接容器
connect Connect a container to a network
# 创建一个网络连接
create Create a network
# 关闭容器连接
disconnect Disconnect a container from a network
# 显示一个或多个网络上的详细信息
inspect Display detailed information on one or more networks
# 列出所有网络
ls List networks
# 删除所有未使用的网络
prune Remove all unused networks
# 删除一个或者多个网络
rm Remove one or more networks
Run 'docker network COMMAND --help' for more information on a command.
[root@hecs-215393 ~]#
2.列出docker网络
[root@hecs-215393 ~]# docker network ls # 列出docker网络
NETWORK ID NAME DRIVER SCOPE
5b15d96cf179 bridge bridge local
12bf219add93 host host local
66b6768156e6 none null local
[root@hecs-215393 ~]#
3.通过docker network create创建一个网络
[root@VM-8-11-centos ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
52f8e50a864d bridge bridge local
5534ad5d6eca host host local
d60aa65de36e none null local
# 创建一个docker网络
[root@VM-8-11-centos ~]# docker network create qf
6fc2499a6dd26591e1b61f1d20e3c9c61f4b64e3de77b7a832be0f68572ec279
# 再次查看一下当前的网络状态
[root@VM-8-11-centos ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
52f8e50a864d bridge bridge local
5534ad5d6eca host host local
d60aa65de36e none null local
6fc2499a6dd2 qf bridge local
[root@VM-8-11-centos ~]#
4.查看qf网络的详细信息
[root@VM-8-11-centos ~]# docker network inspect qf
[
{
"Name": "qf",
"Id": "6fc2499a6dd26591e1b61f1d20e3c9c61f4b64e3de77b7a832be0f68572ec279",
"Created": "2022-10-09T16:41:48.505578412+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.19.0.0/16",
"Gateway": "172.19.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
[root@VM-8-11-centos ~]#
三. Docker网络的作用
在开始学习Docker网络用法之前,我们再来了解一下Docker网络的作用,主要作用如下:
Docker网络可以负责容器间的相互连接和通信,以及端口映射;
当容器`ip`地址发生更改时,可以通过服务名称进行网络通信,不会因为`ip`的更改导致服务不可用。
四. 网络模式
Docker的网络有以下几种网络模式。
网络模式 | 说明 |
bridge, 虚拟网桥, 默认模式 | 每一个容器有独立的ip, 并将容器连接到docker0网桥上 |
host | 使用宿主机的ip和端口号, 容器不会虚拟出自己的网卡、配置ip |
none | 有独立的network namespace,但是并未对其进行任何网络设置 |
container | 和一个指定的容器共享ip和端口号, 不会虚拟出网卡、配置ip等操作. |
1. bridge模式
网桥模式,是docker默认的网络模式。
1.1 案例说明
我们可以创建两台centos容器,分别进入这两台容器中查看网络情况,查看ip是否相同。
进入容器,查看各自的ip地址。
结论:通过观察可以发现,这两个centos容器的ip地址并不相同。docker服务默认会创建一个docker0网桥,它在内核层连通了其它物理或者虚拟网卡,它会将所有容器和本机放到同一个物理网络。docker默认指定了docker0接口的ip地址和子网掩码,让主机和容器之间通过互相通信。
1.2 在宿主机中查看docker0网桥
[root@VM-8-11-centos ~]# ifconfig
br-6fc2499a6dd2: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.19.0.1 netmask 255.255.0.0 broadcast 172.19.255.255
ether 02:42:4d:db:86:7e txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:51ff:fe04:52a8 prefixlen 64 scopeid 0x20<link>
ether 02:42:51:04:52:a8 txqueuelen 0 (Ethernet)
RX packets 38121 bytes 10882894 (10.3 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 37569 bytes 6650084 (6.3 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.8.11 netmask 255.255.252.0 broadcast 10.0.11.255
inet6 fe80::5054:ff:fe78:5b59 prefixlen 64 scopeid 0x20<link>
ether 52:54:00:78:5b:59 txqueuelen 1000 (Ethernet)
RX packets 4294502 bytes 424094659 (404.4 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4245669 bytes 638810894 (609.2 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 11 bytes 1488 (1.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 11 bytes 1488 (1.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
veth0593288: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::6434:bff:fe38:6a0c prefixlen 64 scopeid 0x20<link>
ether 66:34:0b:38:6a:0c txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 9 bytes 698 (698.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
veth340b971: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::dcb5:69ff:fe5a:d5e2 prefixlen 64 scopeid 0x20<link>
ether de:b5:69:5a:d5:e2 txqueuelen 0 (Ethernet)
RX packets 19 bytes 1714 (1.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 23 bytes 2670 (2.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
docker使用linux进行桥接,在宿主机上虚拟一个docker网桥「docker0」。docker启动一个容器会根据docker网桥的网段,分配给容器一个ip地址,称为container-ip。
docker网桥是每个容器的默认网关,同一台宿主机内的容器都会接入一个网桥,这样容器之间就能通过container-ip进行通信了。
当创建容器的时候,如果没有指定网络模式,默认会使用bridge,使用的就是docker0。在宿主机执行ifconfig时,可以查看到docker0或者自己创建的网络。
eth0, eth1… 代表网卡一,网卡二…
lo, 表示本地回环网络。
inet ip用来表示网卡的ip地址。
2. bridge模式详解
整个宿主机的网桥模式都是docker0,类似于一个交换机有一大堆接口,每个接口都可以称为veth。在宿主机和容器内分别创建一个虚拟接口,并让他们彼此连通「veth pair」;
每个实例内部都有一块网卡,每个接口可以称为eth0。
docker0上面每个veth,匹配某个容器内部的eth0,一一配对 或 两两配对。
重要结论:将宿主机上的所有容器都连接到这个内部网络上,两个容器在同一个网络下,会从这个网卡拿到分配的ip,此时两个容器的网络是互通的。
2.1 验证案例
启动两台centos容器,在宿主机当中查看网络在情况. ip addr
进入mycentos01容器。
进入mycentos02容器。
宿主机eth0, docker0与容器内eth0之间的对应关系。
完整图示:
2.2 bridge使用的正确姿势
# 启动容器的时候,显示的指定为bridge模式
--network bridge或者--network=bridge
五. 总结
各位小伙伴,今天千锋健哥为大家带来的birdge模式就是这些内容了,是不是很容易理解呢?
docker网络作为整个docker体系中极为重要的一个知识点,在生产中经常被用到,尤其是网络模式当中的bridge模式和host模式更是应该重点掌握。
自定义网络,可以通过服务名称「容器名称」进行容器间的通信。自动处理了容器名称与ip地址的映射关系,这样使得容器间通信更为可靠和容易。