目录

1 iptables简介

1.1 基本操作指令

1.2 iptables 工作流程

2 实现多主机间Docker容器通信

2.1 目标

2.2 操作步骤总结

2.3 具体操作步骤


1 iptables简介

iptables很重要,但是我还没未进行详细学习,这里这是介绍个大概,后续进行补充完善。在本文2.3的第(5)部分中涉及到了iptables的相关内容,所以在这里对iptables做个介绍。

  • iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的”安全框架”中,这个”安全框架”才是真正的防火墙,这个框架的名字叫netfilter
  • netfilter才是防火墙真正的安全框架(framework),netfilter位于内核空间。
  • iptables其实是一个命令行工具,位于用户空间,我们用这个工具操作真正的框架。

1.1 基本操作指令

  • 查看filter表所有规则(-t不写的话,默认查询filter表)
iptables -L
  • 查看nat表中的DOCKER链的信息(v:显示详细信息,n:以数字的方式显示ip、port)
iptables -t nat -vnL DOCKER
  • 将当前的iptables配置导出为标准输出
iptables-save

1.2 iptables 工作流程

2 实现多主机间Docker容器通信

2.1 目标

  • 创建虚拟机1(centos7),开启Docker容器a
  • 创建虚拟机2(centos7),开启Docker容器b
  • 保证a、b之间能相互ping通

2.2 操作步骤总结

  • 在任意一台主机上安装ETCD,用来存储网络相关的环境变量信息
  • 将子网信息(B级ip)写入ETCD
  • 在2台要相互访问的主机上分别安装Flannel,对接ETCD
  • 在2台要相互访问的主机上分别配置Docker要使用Flannel生成的子网信息(C级ip)
  • 在2台要相互访问的主机上分别配置“允许数据包转发”
  • 验证

整体过程如下图:

2.3 具体操作步骤

(1)  etcd的安装、配置、启动(在虚拟机1中安装)

  • 安装:yum install etcd -y
  • 修改配置文件(localhost改为ip):vi /etc/etcd/etcd.conf
ETCD_LISTEN_CLIENT_URLS="http://安装etcd的宿主机ip:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://安装etcd的宿主机ip:2379"
  • 启动:systemctl start etcd
  • 设置开机启动:systemctl enable etcd

(2) 将规划好的子网写入etcd

键是一个文件“config”,值是json字符串,描述一个子网

etcdctl --endpoints="http://安装etcd的宿主机ip:2379" set /atomic.io/network/config '{ "Network": "172.17.0.0/16", "Backend": {"Type": "vxlan"}} '

(3) Flannel 的安装、配置(2台虚拟机都需要安装)

  • 简介:Flannel是CoreOS维护的一个网络组件,在每个主机上运行守护进程负责维护本地路由转发,Flannel使用ETCD来存储容器网络与主机之前的关系。
  • 安装:yum install flannel -y
  • 配置:vi /etc/sysconfig/flanneld
FLANNEL_ETCD_ENDPOINTS="http://宿主机ip:2379"
  • 基于“大子网(B类ip)”,Flannel启动后会进一步生成子网信息(C类ip),作为docker的环境变量
  • 查看子网信息(Flannel启动后,现在还没启动):cat /var/run/flannel/docker

(4) 配置Docker使用Flannel生成的网络信息(把本机Docker和Flannel关联起来,2台都要)

  • 打开如下文件:vi /usr/lib/systemd/system/docker.service
  • 在 ExecStart 前新增一行
EnvironmentFile=/run/flannel/docker
  • ExecStart这一行的内容更改为:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock $DOCKER_NETWORK_OPTIONS

(5) 将两台虚拟机的FORWARD链设置为允许(2台虚拟机都需要配置)

  • 默认情况下,输入指令 iptables -vnL 会发现FORWARD链默认是拒绝状态
  • 即:来自外部的访问数据包进入到Linux系统之后,如果数据包的目的ip不在本机ip网段内的话(宿主机网段和docker网段隔离的),
  • 该数据包会被判断是否满足FORWARD链的规则,如果满足则路由到目的ip(docker容器上)
  • 输入指令,可以让来自外部的数据包访问到Docker容器(如果主机A设置该iptables规则,则其他主机中的Docker容器可以访问到该主机中的Docker容器,前提当然要保证两台主机之间本身是能ping通的):
  • 哪台虚拟机的容器需要被访问,就输入指令:
iptables -P FORWARD ACCEPT

(6) 服务启动

在2台主机上分别进行如下操作:

  • 重新加载配置文件:systemctl daemon-reload
  • 启动Flannel:systemctl restart flanneld
  • 设置Flannel开启自启动:systemctl enable flanneld
  • 重启Docker:systemctl restart docker

如果后来又修改了相关配置,需要先重启Flannel,再重启Docker(不是必要操作,按需进行):

  • systemctl restart flanneld
  • systemctl restart docker

(7) 验证

在a容器中pingb容器,b容器中pinga容器,保证相互之间能ping通即可。

分析如下:

  • 分别在两台宿主机上查看Docker分配ip的情况:ps -ef |grep docker
  • 同一个ETCD(先规定一个大子网,让不同docker容器配置ip),对应多个不同的Flannel,具体分配各docker子网ip的工作由各自宿主机的Flannel来完成。于是,解决了不同主机docker容器ip冲突的问题
  • 具体来说:当初我们在ETCD中规划的“大子网”在"172.17.0.0/16"范围内,是一个B类ip,然后不同宿主机下的Flannel为Docker分配的ip范围(C类ip)分别在:bip=172.17.99.1/24 、bip=172.17.75.1/24范围内。C类ip的范围是在B类ip的基础上随机分配的,即便往ETCD中加入新的Docker,那么Flannel给这个Docker分配的ip段也是基于"172.17.0.0/16"分配的,且和其他Docker的ip不会冲突
  • 我们发现:两个dockerIP的范围都在最初规划的“大子网”"172.17.0.0/16"范围内。flannel启动后会生成如下文件信息,作为docker的环境变量:cat /var/run/flannel/docker
  • 在Docker启动时,读取上述变量文件并引用:vi /usr/lib/systemd/system/docker.service

6 实现多主机间 Docker 容器通信相关推荐

  1. Docker原生网络、自定义网络、Docker容器通信、跨主机容器网络

    Docker原生网络.自定义网络.Docker容器通信.跨主机容器网络 Docker原生网络 bridge Host none Docker自定义网络 自定义bridge overlay macvia ...

  2. 容器安装java_在docker容器中安装Java(从宿主机向docker容器中拷贝文件)

    操作系统 [root@Optimus /]# uname -a Linux Optimus 2.6.32-504.el6.x86_64 #1 SMP Wed Oct 15 04:27:16 UTC 2 ...

  3. 2台主机的docker互相通信的方法

    主机清单: 192.168.6.132 主机名 vm132 系统centos7 192.168.6.132 主机名 vm132 系统centos7 安装docker wget -O /etc/yum. ...

  4. 6. 修改docker端口 (映射宿主机和docker容器中的端口)

    文章目录 1. 查询已运行的容器 2. 停止docker服务 3. 进入主机配置文件目录 4. 修改配置文件 5. 验证是否生效 1. 查询已运行的容器 2. 停止docker服务 systemctl ...

  5. 宿主机和docker容器之间的文件拷贝

    1.从容器里面拷文件到宿主机 在宿主机里面执行以下命令: docker cp 容器名:要拷贝的文件在容器里面的路径 要拷贝到宿主机的相应路径 示例: 假设容器名为nginx,要从容器里面拷贝的文件路为 ...

  6. Docker容器间网络通信

    自从Docker容器出现以来,容器网络通信就一直是被关注的焦点,也是生产环境的迫切需求.容器网络通信又分为两大方面:单主机容器上的相互通信,和跨主机的容器相互通信. 一.Docker单主机容器通信 基 ...

  7. docker容器的网络配置,允许docker可以被宿主机以外的其它主机访问以及局域网内可以直接访问docker容器ip

    自从Docker容器出现以来,容器的网络通信就一直是被关注的焦点,也是生产环境的迫切需求.容器的网络通信又可以分为两大方面:单主机容器上的相互通信,和跨主机的容器相互通信. 一.端口映射(局域网,外网 ...

  8. docker 容器之间通信_四、Docker 网络原理、分类及容器互联配置

    本文是<Docker必知必会系列>第四篇,原文发布于个人博客:悟尘纪. 上一篇:Docker必知必会系列(三):基于 Docker-registry/Nexus3 搭建本地仓库 Docke ...

  9. Docker网络容器通信

    Docker网络&容器通信 docker网络 原生网络 自定义网络 docker容器通信 ip通信 Docker DNS Server joined容器 link docker跨主机通信 容器 ...

最新文章

  1. crawler_爬虫开发的曲线图
  2. C#前后端操作json数据
  3. 1502: [NOI2005]月下柠檬树 - BZOJ
  4. c语言楼梯有10级台阶,C语言小程序之没事爬楼梯
  5. java倒计时跳出窗口_java倒计时弹出框
  6. PHP笔记-用户登录例子
  7. 贝壳反击浑水做空报告 股价上涨近6%
  8. 开源TinyXML 最简单的新手教程
  9. 【转】JS判断SWF,JPG加载完毕、兼容(Activex,plugIn)所有浏览器
  10. 使用 virt-install 创建虚拟机
  11. c++ string字符串翻转
  12. AD18的PCB开槽方法
  13. 怎么不带卡、刷手机进出图书馆---手机NFC
  14. java百度云盘,看完直呼内行
  15. QPainter图像混合
  16. adb:设置手机屏幕亮度
  17. sql 计算周环比wow_Oracle计算环比的方法
  18. 一、微信支付介绍和接入指引
  19. 航拍无人机 无人车_无人机将有自己的时刻
  20. 顶会速递 | ICLR 2020录用论文之自然语言处理篇

热门文章

  1. 【编译原理】 如何将控制语句翻译成四元式
  2. 风影ASP.NET基础教学 7用户控件编程
  3. 系统架构师----笔记
  4. 七款代码味道识别工具【简介】
  5. mysql经典语句(外键开关)
  6. 【深度解刨C语言】符号篇(全)
  7. Python、MATLAB股票投资:ARIMA模型最优的选股、投资组合方案与预测
  8. 6.27软件园与血站见习报告
  9. ajax返回报错html,Jquery AJAX POST调用返回200状态确定,但错误
  10. python中frame=none是什么意思啊_在python的init函数中,master和master=none的目的是什么?...