docker+openvswitch实现主机与容器的网络通信

主要用到openvswitch和netns网络名称空间的相关知识还有ip命令的使用。

实验环境的结构图如下:

思路如下:

  1. 安装openvswitch
  2. ovs创建br0,br1,并启动两个不加载网络的docker容器
  3. 将容器关联网桥br0,并设置ip、vlan
  4. 创建veth0与veth1网卡对
  5. 创建netns名称空间,并添加veth0.0和veth1.0接口,并配置相关信息
  6. 将veth0.1和veth1.1分别桥接至br0,br1,并配置相关信息
  7. 添加SNAT和DNAT规则
  8. 给br1配置ip测试连通

具体步骤如下

1.安装openvswitch

# yum install -y openvswitch

下载OpenvSwitch项目提供的支持Docker容器的辅助脚本ovs-docker:

# wget https://github.com/openvswitch/ovs/raw/master/utilities/ovs-docker

# chmod a+x ovs-docker

此处脚本最好放在/root目录下,后续使用ovs-docker命令需要用到

2.ovs创建br0,br1,并启动两个不加载网络的docker容器

# ovs-vsctl add-br br0

# ovs-vsctl add-br br0

# ip link set br0 up

# ip link set br1 up

# docker run –it –privileged=true –net=none –name box1 busybox:latest /bin/sh

# docker run –it –privileged=true –net=none –name box2 busybox:latest /bin/sh

通过ctrl p+ctrl q可以退出容器并且不关闭容器

3.将容器关联网桥br0,并设置ip、vlan

# ./ovs-docker add-port br0 eth0 box1 –ipaddress=10.0.0.1/24 –gateway=10.0.0.253

# ./ovs-docker set-vlan br0 eth0 box1 5

# ./ovs-docker add-port br0 eth0 box2 –ipaddress=10.0.0.2/24 –gateway=10.0.0.253

# ./ovs-docker set-vlan br0 eth0 box2 5

此时可以先测试容器的互通性,两容器相互ping测试。

4.创建veth0与veth1网卡对

# ip link add veth0.0 type veth peer name veth0.1

# ip link add veth1.0 type veth peer name veth1.1

注意开启:net.ipv4.ip_forward=1

5.创建netns名称空间,并添加veth0.0和veth1.0接口,并配置相关信息

# ip netns add r1               创建netns名称空间r1

# ip link set veth0.0 netns r1          添加两个接口

# ip link set veth1.0 netns r1

# ip netns exec r1 ip link set veth0.0 up   启动两个接口

# ip netns exec r1 ip link set veth1.0 up

# ip netns exec r1 ip addr add 192.168.2.221/24 dev veth1.0        给veth1.0添加ip

# ip netns exec r1 ifconfig veth1.0:1 192.168.1.223/24 up        配置两个浮动ip

# ip netns exec r1 ifconfig veth1.0:2 192.168.1.224/24 up

# ip netns exec r1 ip addr add 10.0.0.253/24 dev veth0.1        配置容器的网关地址

6.将veth0.1和veth1.1分别桥接至br0,br1,并配置相关信息

# ovs-vsctl add-port br0 veth0.1

# ovs-vsctl add-port br1 veth1.1

# ip link set veth0.1 up

# ip link set veth1.1 up

# ovs-vsctl set port veth0.1 tag=5        tag实际就是配置vlan,否则在vlan 5的容器内流量不会经过此接口

此时可以测试容器的通信(容器内ping 10.0.0.253,ping 192.168.1.221)

7.添加SNAT和DNAT规则

SNAT:使得容器box1和box2能访问外网

# ip netns exec r1 iptables –t nat –A POSTROUTING –s 10.0.0.1/32 –j SNAT –-to-source 192.168.2.223

# ip netns exec r1 iptables –t nat –A POSTROUTING –s 10.0.0.2/32 –j SNAT –-to-source 192.168.2.224

DNAT:使得外网能够访问容器

# ip netns exec r1 iptables –t nat –A PREROUTING –d 192.168.2.223/32 –j DNAT –-to-destination 10.0.0.1

# ip netns exec r1 iptables –t nat –A PREROUTING –d 192.168.2.224/32 –j DNAT -–to-destination 10.0.0.2

8.给br1配置IP并测试整个通信

# ifconfig br1 192.168.1.122

最后网桥br0和br1的接口信息:

测试整个网络的通信

在容器中(box1):ping 10.0.0.2,ping 10.0.0.253,ping 192.168.1.221,ping 192.168.1.223,ping 192.168.1.224,ping 192.168.1.122,ping 192.168.1.222(本机ip)

在本机中(192.168.1.222):ping 192.168.1.122,ping 192.168.1.223,ping 192.168.1.224,ping 192.168.1.221

以上

原文地址:https://www.cnblogs.com/whych/p/9601889.html

时间: 2024-10-16 07:42:19

docker+openvswitch实现主机与容器的网络通信的相关文章

Docker容器学习梳理--容器间网络通信设置(Pipework和Open vSwitch)

自从Docker容器出现以来,容器的网络通信就一直是被关注的焦点,也是生产环境的迫切需求.容器的网络通信又可以分为两大方面:单主机容器上的相互通信,和跨主机的容器相互通信.下面将分别针对这两方面,对容器的通信原理进行简单的分析,帮助大家更好地使用docker.前面已经在Docker容器学习梳理--基础知识(2)这一篇中详细介绍了Docker的网络配置以及pipework工具. docker单主机容器通信 基于对net namespace的控制,docker可以为在容器创建隔离的网络环境,在隔离的

Docker的单主机容器网络

作者:杨冬 欢迎转载,也请保留这段声明.谢谢! 出处: https://andyyoung01.github.io/ 或 http://andyyoung01.16mb.com/ 本篇文章主要探索Docker的单机容器网络,了解一下单个Docker主机上网络的各种模式,从而为后续理解跨主机容器网络打下基础. Docker默认容器网络的建立和控制是一种结合了network namespace,iptables,Linux网桥及route table等多种技术的综合解决方案,本篇主要针对于如何使用单

Docker:使用Ambassador进行跨主机间容器通信

由于Docker自身的网络的原因,想要在多主机间的容器之间进行通信是比较麻烦的事情.可以利用Ambassador容器来实现这一功能. 基本原理: 利用Ambassador来实现主机间容器进行通信时,需要在两台需要通信的容器的主机上都启动Ambassador容器.由Ambassador容器提供数据转发服务. 当客户端主机上的容器client_container想要同服务器端主机上的容器server_container通信时,client_container容器直接访问同一台主机上运行的client

[docker]使用quaaga实现(rip ospf)实现主机间容器互通

使用quaaga实现(rip ospf)实现主机间容器互通 - n1设置 brctl addbr br0 ip a a 10.1.1.1/24 br0 ip a a 10.1.1.1/24 dev br0 ip l s dev br0 up systemctl stop docker dockerd -b=br0 docker run -itd --name=router --privileged --net=host georce/router - n2设置 brctl addbr br0 i

10: docker 跨主机的容器间通信(macvlan / overlay )

docker 跨主机的容器间通信(macvlan) 作用: 虚拟多个mac地址,虚拟出多个网卡给容器用. #创建macvlan网络 docker network create --driver macvlan(要创建的网络类型) --subnet  子网IP段  --gateway 本机网关 -o parent=本机网卡  创建的macvlan网络名称 [[email protected] ~]# docker network create --driver macvlan --subnet 1

如何实现docker跨主机之间容器通信问题(方法二)

主机名 宿主机IP 容器分配网段 启动容器的IP testa 192.168.1.105 172.172.0.0/24 172.172.0.10 testb 192.168.1.106 172.172.1.0/24 172.172.1.10 1.在testa主机上创建docker桥接网络 docker network create --subnet=172.172.0.0/24 docker-br0 2.在testb主机上创建docker桥接网络 docker network create --

docker1.9网络新特性,overlay网络实现主机间容器互联

Docker1.9引入了新的网络机制,包括一整套的网络操作命令和跨主机的网络支持. 该网络特性主要是为了实现容器的网络互联(单主机/跨主机),取代了之前的--link网络模式. docker网络命令: 查看当前的docker网络: # docker network ls NETWORK ID         NAME               DRIVER            a77b0f433ea0        none                null              

Docker OpenvSwitch 应用部署

Docker OpenvSwitch 应用部署 安装部署OVS并建立GRE隧道 节点1:192.168.1.198 容器网段:172.17.1.0/24 节点2:192.168.1.199 容器网段:172.17.2.0/24 1.节点1节点2操作:修改docker 默认IP地址网段,主配置文件内修改配置参数. vim /lib/systemd/system/docker.service # bip参数设置IP地址 指定的是网关. ExecStart=/usr/bin/dockerd --bip

Docker第四回(容器虚拟化网络)

一.docker网络简介 网络作为docker容器化实现的6个名称空间的其中之一,是必不可少的.其在Linux内核2.6时已经被加载进内核支持了.网络名称空间主要用于实现网络设备和协议栈的隔离,列如:一个docker host有4块网卡,在创建容器的时候,将其中一块网卡分配给该名称空间,那么其他名称空间是看不到这块网卡的.且:一个设备只能属于一个名称空间.因为一个名称空间绑定一个物理网卡和外界通信,且一个物理网卡不能分配多个名称空间,这使得我们只能创建4个名称空间.如果要创建的名称空间多于我们的