详解Docker中VLAN网络模式的配置

前言

Docker作为目前最火的轻量级容器技术,有很多令人称道的功能,如Docker的镜像管理。然而,Docker同样有着很多不完善的地方,网络 方面就是Docker比较薄弱的部分。因此,我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

Docker网络模式选择

目前已有不少文章介绍了Docker的网络模型,但是在实际应用中还是有不少坑和需要注意的点

在Docker应用到生产环境的时候,网络模型的选择主要有以下几种

1、原生Bridge NAT模式

2、Linux Bridge VLAN模式

3、利用第三方的网络方案

原生的Bridge NAT模式

这是Docker原生的网络模式,每台主机的容器都在一个独立的子网中,外部访问必须通过主机端口映射的方式。同时不同主机间的容器间访问也必须通过这种主机端口映射的方式。换句话说,一台主机上的容器其实是不知道另外一台主机的容器的。这种方式是否可以用于生产,一开始我是忧郁的,同时之前有写文章写NAT的性能损耗比较大,在没有资源做完整测试的情况下,我们最初的方案就没敢用这个网络方案。但是最近测试自己测试的结果看,NAT的性能是可以接受的(QPS和Latency和VLAN的模式都比较接近),只要有合适的方案将不同主机的容器联通就可。如用Mesos+Marathon+Bamboo+HAProxy的方式就可以的。

Linux Bridge VLAN模式

这是我考虑Docker网络模型一开始就想决定好的,主要有几方面的原因:

1、NAT的方式一开始不敢用

2、其它第三饭的工具还不太成熟

3、一开始容器的数量不可能太多(因为VLAN的模式受限于VLAN的整体数量,只能4096个容器),如果按照一个主机10-16个容器算,可以支持到256台主机,这个还是可以接受的

4、每个主机需要一个独立IP,并且可以互联互通

5、运维管理要简单,毕竟我们的运维体系还是物理机体系的

6、可以做到主机网络和VLAN网络的隔离

我们用的主机是CentosOS 7.X系列, 主机的网络配置如下:两个1G的网卡,通过Bond的方式绑在一起,然后配置主机一个虚拟网卡在VALN 1上,容器的Docker0的Bridge在另外一个VLAN 1上

网卡配置:

这里需要注意的是必须安装了bridge-utils, NetworkManager

步骤

配置两个网卡,不要配置IP/GATEWAY等网络参数,增加MASTER=bond0以及SLAVE=yes

完整例子如:

TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=enp2s0f0
UUID=7f6fa8e9-0177-46a8-b8ea-55c2187bea11
DEVICE=enp2s0f0
ONBOOT=yes
MASTER=bond0
SLAVE=yes

增加bond0网络配置/etc/sysconfig/network-scripts/ifcfg-bond0,并根据使用情况选择 mode值,内容如下。因为要在bond0上再配置VLAN所以没有配置IP等相关参数。如果配置了IP等参数则可以认为bond0就是一个普通网卡了。

DEVICE=bond0
NAME=bond0
TYPE=Bond
BONDING_MASTER=yes
ONBOOT=yes
BOOTPROTO=none
BONDING_OPTS="miimon=100 mode=0"

可以通过cat /proc/net/bonding/bond0看配置的情况

在bond0上配置vlan,这里的vlan号为136,所以文件名为/etc/sysconfig/network-scripts/ifcfg-bond0.136,内容为:

VLAN=yes
TYPE=Ethernet
DEVICE=bond0.136
NAME=bond0.136
PHYSDEV=bond0
ONBOOT=yes
BOOTPROTO=static
BRIDGE=docker0

因为后续需要将docker的bridge(docker0)挂在这个vlan上,所以TYPE必须是Ethernet,而且多了项配置BRIDGE=docker0

配置docker的bridge( /etc/sysconfig/network-scripts/ifcfg-docker0),名字也可以用别的,为了减少docker engine需要增加-b启动参数,所以用了默认的名字。同时没有给docker0配置IP,因为有另外一个vlan的ip来管理主机

TYPE=bridge
VLAN=yes
DEVICE=docker0
SLAVE=bond0.136
NAME=docker0
ONBOOT=yes
BOOTPROTO=none

Docker的配置

按机器用途类型,修改 Docker 启动文件 /usr/lib/systemd/system/docker.service,内容如下:

在 ExecStart=/usr/bin/docker daemon -H fd:// 这行后面加上:

   --fixed-cidr=172.20.56.16/28 --default-gateway=172.20.56.1 --registry-mirror=http://registry.xxxx.com:5000 --insecure-registry=docker.xxx.com:5000 --storage-driver=overlay --ip-forward=false --iptables=false --log-driver=journald
   (注释:"--fixed-cidr="后面填写的是该机器容器IP子网段;"--default-gateway="后面填写的是容器IP子网网关;"--registry-mirror="后面填写的是生产环境的docker registry域名。)

这里有几个坑:

1、对于Docker的存储,不要使用默认的方式,而是要使用overlay,同时是配合CentOS 7.X

2、因为开始安装机器的时候网络配置不是Bond的模式,需要配置好bond后需要清理下原有的配置

修改 /etc/sysctl.conf 文件,把 “net.ipv4.ip_forward” 的值修改为1

不需要在/etc/sysconfig/network文件上配置gateway

创建文件 /etc/modules-load.d/bonding.conf,内容如下:bonding

3、默认情况,安装好docker后,并没有docker用户组和docker用户,必须使用root之行,如果不用root则需要:

创建docker用户组:sudo groupadd docker

把当前用户加入docker用户组,例如当前使用的是apps用户:sudo usermod -aG docker apps

创建docker用户并加入docker用户组:sudo useradd docker -g docker

修改“/var/lib/docker”目录及其子目录的owner和group:sudo chown -R docker:docker

退出并重新登录,刷新当前用户的权限。

最大的坑是我们在某些主机上安装一些平台服务如Zookeeper,如果容器想访问这些配置为容器的主机上的服务是访问不通,,这个弄好了好久都没有办法,找网络的同事,从交换机配置等来看都没有问题,然后在老罗的指导下做以下尝试:

- 在主机上启动tcpdump,然后在主机上抓取来自于容器的ping包,可以发现主机收到了容器发来的ICMP包,但是容器没有收到任何响应,ping总是超时,难道是主机抛弃了ICMP包?

a、打开火星文检测看看是否有包进来: sudo sysctl net.ipv4.conf.bond0/51.log_martians=1 (bond0/51为对应bond0.51的网卡)可以看到有包进来说明有来源不明的数据包。

b、从以上两点可以想到网络上我们配置了两个不同的网卡,不同的网断,原理上他们应该是各自隔离的,及访问网段1的数据要从网段1的网卡进来,如果从网段2进来,Linux认为是非法包

d、据其原因,是因为Linux的RP(Reverse Path)过滤的问题,在这种情况下,需要将这台主机的RP关闭就可

sudo sysctl net.ipv4.conf.bond0/51.rp_filter=0
sudo sysctl net.ipv4.conf.bond0/52.rp_filter=0
sudo sysctl net.ipv4.conf.all.rp_filter=0
sudo sysctl net.ipv4.conf.bond0.rp_filter=0

第三方网络Plugin

目前比较好的选择是以下几种,不过还在摸索中

Calico, http://projectcalico.org/

Contiv, http://docs.contiv.io

总结

以上就是Docker中VLAN网络模式配置的详细介绍,希望这篇文章的全部内容对大家学习或者使用Docker能有所帮助,如果有疑问大家可以留言交流。

(0)

相关推荐

  • 详解Centos7 下建立 Docker 桥接网络

    前言 最近职业规划开始有了转变,在创业团队中一个人的角色不可能只有一个,说说我现在担任过的角色:配置管理,项目经理,售前技术支持,售后技术支持,测试,少许开发工作,产品策划:除了市场营销,其他杂七杂八的都干过了.最后我发现我最适合的职位也许是devops,这个岗位的工作内容请大家自行百度. 回正题,去年开始关注docker,直到今年看了坛子里的大神们对docker调研实践后,我决定也开始实践.就从改造公司研发和运维环境开始,这次的帖子主要是将自己构建docker桥接物理网络的过程讲述一遍,本来网

  • Docker 网络命令详解

    •docker network create •docker network connect •docker network ls •docker network rm •docker network disconnect •docker network inspect 创建网络 zane@zane-V:~$ docker network create simple-network zane@zane-V:~$ docker network inspect simple-network { "N

  • Docker 网络模式(四种)详细介绍

    Docker 网络模式 本文首先介绍了Docker自身的4种网络工作方式, Docker作为目前最火的轻量级容器技术,有很多令人称道的功能,如Docker的镜像管理.然而,Docker同样有着很多不完善的地方,网络方面就是Docker比较薄弱的部分.因此,我们有必要深入了解Docker的网络知识,以满足更高的网络需求. 四种网络模式 我们在使用docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式: · host模式,使用--net=h

  • Docker网络代理设置详解

    背景 在一些实验室环境,服务器没有直接连接外网的权限,需要通过网络代理.我们通常会将网络代理直接配置在/etc/environment./etc/profile之类的配置文件中,这对于大部分操作都是可行的.然而,docker命令却使用不了这些代理. 比如docker pull时需要从外网下载镜像,就会出现如下错误: $ docker pull hello-world Unable to find image 'hello-world:latest' locally Pulling reposit

  • Docker为网络bridge模式指定容器ip的方法

    前言 众所周知bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace.设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上.下面来看看Docker为网络bridge模式指定容器ip的方法. 实现方法 如果只是简单创建一个bridge模式的网络是无法给容器指定ip的 [root@vultrvpn conf.d]# docker network create --driver bridge wordpress_net ad1ff3d972

  • docker 学习笔记之docker连接网络的设置

    1.如果docker主机不需要通过代理连接外网 则docker的相关命令(如docker search)或docker容器与网络相关的操作都可以正常进行,不需要特殊设置. 2.当docker主机 是通过代理才能连接外网时,采用服务方式启动守护进程 如果docker守护进程是通过服务的方式启动的(sudo start docker) 当我们执行如  docker search ubuntu 命令时,会报错 Error response from daemon: Get https://index.

  • Docker 手动配置容器网络实例详解

    Docker 手动配置容器网络 docker容器的网络是net命名空间与虚拟设备的结合,容器在启动时会创建一对虚拟接口veth pair,这一对接口分别放到本地和容器中,在本地的veth会被分配类似vethxxxx的名称并被桥接到指定网桥的上(默认为docker0),可以通过brctl show命令查看网桥上挂载的接口,在容器中的veth会从网桥获取一个未使用地址,该veth的名称会被更改为eth0并配置默认路由到vethxxxx,docker允许在启动容器的时候通过--net参数指定不同的网络

  • 详解Docker中VLAN网络模式的配置

    前言 Docker作为目前最火的轻量级容器技术,有很多令人称道的功能,如Docker的镜像管理.然而,Docker同样有着很多不完善的地方,网络 方面就是Docker比较薄弱的部分.因此,我们有必要深入了解Docker的网络知识,以满足更高的网络需求. Docker网络模式选择 目前已有不少文章介绍了Docker的网络模型,但是在实际应用中还是有不少坑和需要注意的点 在Docker应用到生产环境的时候,网络模型的选择主要有以下几种 1.原生Bridge NAT模式 2.Linux Bridge

  • 详解javascript中的Strict模式

    简介 在ES5中,引入了strict模式,我们可以称之为严格模式.相应的sloppy mode就可以被称为非严格模式. 严格模式并不是非严格模式的一个子集,相反的严格模式在语义上和非严格模式都发生了一定的变化,所以我们在使用过程中,一定要经过严格的测试.以保证在严格模式下程序的执行和非严格模式下的执行效果一致. 使用Strict mode strict mode会改变javascript的一些表现,我们将会在下一节中进行详细的讲解. 这里先来看一下,怎么使用strict mode. Strict

  • 详解Nginx中的Rewrite的重定向配置与实践

    一:理解地址重写 与 地址转发的含义. 地址重写与地址转发是两个不同的概念. 地址重写 是为了实现地址的标准化,比如我们可以在地址栏中中输入 www.baidu.com. 我们也可以输入 www.baidu.cn. 最后都会被重写到 www.baidu.com 上.浏览器的地址栏也会显示www.baidu.com. 地址转发:它是指在网络数据传输过程中数据分组到达路由器或桥接器后,该设备通过检查分组地址并将数据转发到最近的局域网的过程. 因此地址重写和地址转发有以下不同点: 1. 地址重写会改变

  • 详解ES6中的代理模式——Proxy

    什么是代理模式 代理模式(英语:Proxy Pattern)是程序设计中的一种设计模式. 所谓的代理者是指一个类别可以作为其它东西的接口.代理者可以作任何东西的接口:网络连接.内存中的大对象.文件或其它昂贵或无法复制的资源. 著名的代理模式例子为引用计数(英语:reference counting)指针对象. 当一个复杂对象的多份副本须存在时,代理模式可以结合享元模式以减少内存用量.典型作法是创建一个复杂对象及多个代理者,每个代理者会引用到原本的复杂对象.而作用在代理者的运算会转送到原本对象.一

  • 详解Docker中容器的备份、恢复和迁移

    今天,我们将学习如何快速地对docker容器进行快捷备份.恢复和迁移.Docker是一个开源平台,用于自动化部署应用,以通过快捷的途径在称之为容器的轻量级软件层下打包.发布和运行这些应用.它使得应用平台独立,因为它扮演了 Linux上一个额外的操作系统级虚拟化的自动化抽象层.它通过其组件cgroups和命名空间利用Linux内核的资源分离特性,达到避免虚拟机开销的目的.它使得用于部署和扩展web应用.数据库和后端服务的大规模构建组件无需依赖于特定的堆栈或供应者. 所谓的容器,就是那些创建自Do

  • 详解Linux中退出编辑模式的命令

    vim 有三种模式,注意:这三种模式有很多不同的叫法,我这里是按照鸟哥的linux书中的叫法. 一般指令模式.编辑模式.指令列命令模式 1.vim 文件名      进入一般模式: 2.按 i 进行编辑   进入编辑模式 :(或者I, o, O, a, A, r, R) 3.编辑结束,按ESC 键 跳到一般模式模式: 4.按:     进入指令列命令模式 : 进入指令列模式后的明林如下 1.保存不退出: :w 保存文件但不退出vi 编辑 :w! 强制保存,不退出vi 编辑 :w file 将修改

  • 详解docker中使用systemctl启动服务报错的解决办法

    docker版本: [root@localhost gae_proxy]# docker version Client: Version: 1.10.3 API version: 1.22 Package version: docker-common-1.10.3-46.el7.centos.10.x86_64 Go version: go1.6.3 Git commit: d381c64-unsupported Built: Thu Aug 4 13:21:17 2016 OS/Arch: l

  • 详解docker中Dockerfile指令创建镜像

    写在前面: 继续docker的学习,昨天用docker成功跑了tomcat,但是在centos中镜像跑的容器手动装jdk和tomcat,今天学习用Dockerfile创建镜像,并在上面搭建java环境,跑一个spring boot小项目. Dockerfile: Dockerfile由一行行命令语句组成,并且支持用"#"开头作为注释,一般的,Dockerfile分为四部分:基础镜像信息,维护者信息,镜像操作指令和容器启动时执行的指令. Dockerfile的书写规则及指令使用方法 Do

  • 详解Docker中安装配置Oracle数据库

    本文使用的OS是Ubuntu([16.04.1_server][1])[注:Ubuntu是安装在vmware虚拟机上的]. 其他的Oracle连接工具:[sqldeveloper-4.1.5.21.78-x64][2] 或[navicat-premium][3]. 1.docker search oracle ---------------------查看docker仓库中的oracle相关内容. docker search oracle 可以看到下图所示的信息: 2.docker pull s

  • 详解设计模式中的模板方法模式及在C++中的使用

    模板方法模式是设计模式行为型中最简单的一种设计模式.在实际中你甚至可能经常用到,只是你自己不知道它是一种设计模式罢了. 模板方法模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 角色: 抽象类(AbstractClass): 定义抽象的原语操作,具体的子类将重定义它们以实现一个算法,实现一个模板方法,定义一个算法的骨架.该模板方法不仅调用原语操作,也调用定义 具体子类 (ConcreteClass): 实现原语操作

随机推荐