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,他就有一种模式其实就和我们上面路由模式。

运维小路

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

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

相关推荐
我送炭你添花5 分钟前
树莓派 3B+ 部署 TR-069 ACS(自动配置服务器)GenieACS 实录
运维·服务器·网络协议
皓月盈江10 分钟前
MoonBit国产编程语言创建新包和使用新包
linux·moonbit·国产编程语言·moonbit教程·moonbit创建包·moonbit使用包
小明_GLC12 分钟前
关于租用阿里云服务器拉取Docker镜像的问题
docker
扫地生大鹏14 分钟前
阿里云大模型服务器安装SNMP包启发
运维·服务器
今晚打佬虎19 分钟前
精准阻断 Docker 容器映射端口:流量路径诊断与 iptables 配置
运维·docker·容器
那年一路北21 分钟前
基于 Maven + Docker 的 WebApp 打包与部署
docker·maven·web app
honsor24 分钟前
机房/档案室专用以太网温湿度传感器:智能监控赋能环境安全
运维·网络·物联网·安全
小白郭莫搞科技24 分钟前
鸿蒙跨端框架Flutter学习:ListView卡片样式详解
linux·服务器·windows
栈低来信36 分钟前
Linux设备模型
linux
晚风吹长发44 分钟前
初步了解Linux中的信号捕捉
linux·运维·服务器·c++·算法·进程·x信号