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

运维小路

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

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

相关推荐
老王聊主机2 小时前
2025年京东云快速搭建幻兽帕鲁联机服务器教程
运维·服务器·京东云
开源优测5 小时前
这些年 devops 和自动化测试项目实践工具链集合
运维·devops
Bytebase6 小时前
MySQL 如何赶上 PostgreSQL 的势头?
运维·数据库·dba·开发者·数据库管理·devops
namelijink8 小时前
docker-compose部署下Fastapi中使用sqlalchemy和Alembic
adb·docker·fastapi
MonkeyKing_sunyuhua8 小时前
在 Ubuntu 22.04 上从 Wayland 切换到 X11的详细步骤
linux·运维·ubuntu
xchenhao8 小时前
Linux 环境(Ubuntu)部署 Hadoop 环境
大数据·linux·hadoop·ubuntu·hdfs·环境·dfs
水彩橘子8 小时前
docker+ffmpeg+nginx+rtmp 拉取摄像机视频
nginx·docker·ffmpeg
凡人的AI工具箱8 小时前
每天40分玩转Django:Django DevOps实践指南
运维·后端·python·django·devops
running thunderbolt8 小时前
Linux : Linux环境开发工具vim / gcc / makefile / gdb / git的使用
linux·git·vim
鼾声鼾语9 小时前
thingsboard通过mqtt设备连接及数据交互---记录一次问题--1883端口没开,到服务器控制面板中打开安全组1883端口
运维·服务器·安全