作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
我们在上一章,讲了虚拟化,虚拟化是把硬件虚拟化,然后创建出来的虚拟机完全隔离,而Docker则是软件(内核)虚拟化,他的隔离性会低于虚拟机。我们将通过3-4周来讲解Docker相关内容,由于涉及到内容较多,就不一一列出来具体的细节,主要从以下几个方面来讲解:
Docker基本情况
Docker基本命令
Dockerfile
Docker镜像
Docker仓库
Docker原理
Docker网络&存储&日志(本小节属于)
Docker-Compose
Docker番外篇
我们在讲解docker详细信息的时候,讲过docker有多种网络模式,今天我们就来详细讲解下最重要的网络模式-桥接模式,以及如何实现Docker的跨主机通信。
Bridge Network(桥接模式)
创建网桥
lua
docker network create -d bridge my-bridge
使用网桥
创建一个自定义的 bridge 网络。在创建容器时,通过--network my-bridge参数将容器连接到这个自定义的 bridge 网络。
arduino
docker run -itd --network my-bridge 192.168.31.43:5000/centos:7
如前面所述,bridge 网络是 Docker 默认的网络模式。它基于 Linux 网桥(如docker0)来实现。当创建一个 bridge 网络的容器时,Docker 会为容器创建一对虚拟网络接口(veth pair)。一个接口放在容器内部作为容器的网络接口,另一个接口连接到宿主机的网桥。这样,容器之间就可以通过网桥进行通信,并且可以通过宿主机的网络接口访问外部网络。网桥起到了类似于物理交换机的作用,它根据 MAC 地址来转发数据包。
默认的Docker网桥docker0默认的地址是172.17.0.1/16,所以我们默认安装Docker以后,创建的容器ip地址都是从这里分配出去的。
sql
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:fb:2c:07:61 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
如果我们手工创建了网桥则IP地址会递归变成172.18.0.1/16,然后我们如果创建的容器使用了这个网桥,则ip地址也会从这个地址段进行分配的。
perl
4: br-e344a2408164: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:cf:2e:80:30 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.1/16 brd 172.18.255.255 scope global br-e344a2408164
valid_lft forever preferred_lft forever
inet6 fe80::42:cfff:fe2e:8030/64 scope link
valid_lft forever preferred_lft forever
#这个就是其中一个容器网络接口信息
#虽然看不到对应的ip地址
#但是可以看到他接入的网桥是是上面的网桥地址
6: vethbfe8be7@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-e344a2408164 state UP group default
link/ether 22:15:68:6f:e1:26 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::2015:68ff:fe6f:e126/64 scope link
valid_lft forever preferred_lft forever
普通应用,一般很少会额外创建网桥,但是在compose里面会使用得比较多一点。
跨主机通信
由于其他网络模式使用较少,所以我们这里就不讲解。从上面的信息我们可以看到如果要实现跨主机通信,那么必须要确保每个主机的的网桥ip地址不冲突,其实k8s也是需要每个主机的的容器ip地址段不冲突,下面我们就手工模拟下如何实现跨主机通信。
这个需求也是来源也是以前的工作经验,因为如果你做公司业务容器化改造的时候,可能会出现部分业务已经完成容器化而部分业务还没有改造,而他们会有相互调用关系。
主机IP
容器IP
192.168.31.209
172.16.1.1/24
192.168.31.210
172.16.2.1/24
1.修改docker0网桥的地址
bash
#vi /etc/docker/daemon.json
#这个地址尽量避免和主机ip地址冲突,然后重启docker
#192.168.31.209 配置
{
"bip": "192.168.1.1/24"
}
#vi /etc/docker/daemon.json
#这个地址尽量避免和主机ip地址冲突,然后重启docker
#192.168.31.201 配置
{
"bip": "192.168.2.1/24"
}
2.手动添加路由
csharp
#31.210配置
ip route add 192.168.1.0/24 via 192.168.31.209
#31.209配置
ip route add 192.168.2.0/24 via 192.168.31.210
3.开启iptables转发
bash
#31.209和31.210同时配置
iptables -P FORWARD ACCEPT
这样就可以实现跨主机通信,但是我们这个是手工维护的规则,适合临时使用,不适合大面积使用。实际上在k8s里面有一个网络组件Calico,他就有一种模式其实就和我们上面路由模式。
运维小路
一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!
关注微信公众号《运维小路》获取更多内容。