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

运维小路

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

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

相关推荐
爪娃侠3 分钟前
LeetCode热题100记录-【二叉树】
linux·算法·leetcode
rufeike3 小时前
Rclone同步Linux数据到google云盘
linux·运维·服务器
csdn_aspnet3 小时前
如何在 Linux 上安装 Python
linux·运维·python
良许Linux3 小时前
怎么自学嵌入式?
linux
良许Linux3 小时前
你见过的最差的程序员是怎样的?
linux
良许Linux3 小时前
想从事嵌入式软件,有推荐的吗?
linux
西贝爷5 小时前
批量删除git本地分支和远程分支命令
运维
jianbiao14835 小时前
远程服务器下载llama模型
运维·服务器
bookish_2010_prj5 小时前
Jupyter notebook定制字体
linux·python·jupyter
fei_sun6 小时前
获取ssh密钥
运维·ssh