Docker-网络&跨主机通信

作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

我们在上一章,讲了虚拟化,虚拟化是把硬件虚拟化,然后创建出来的虚拟机完全隔离,而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,他就有一种模式其实就和我们上面路由模式。

运维小路

一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!

关注微信公众号《运维小路》获取更多内容。

相关推荐
AlfredZhao8 小时前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户97183563346614 小时前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪15 小时前
linux 拷贝文件或目录到指定的位置
linux
大树881 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠1 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质1 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush41 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5201 天前
Linux 11 动态监控指令top
linux
Inhand陈工1 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn861 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker