您的位置:首页 > 运维架构 > Docker

centos6 Docker桥接到主机所在的内网

2016-02-03 17:50 573 查看
测试环境:windows7台式机: ip:10.0.1.6/16 网关:10.0.0.254/16 上网正常。
vmware虚拟机一台: centos6.6_64minieth0 ip:10.0.1.21/16 网关:10.0.0.254/16
用到软件包:pipeworkiproute-2.6.32-130.el6ost.netns.2.x86_64.rpm下载地址:https://yunpan.cn/crp5XAESHHh3d 访问密码 57e8

一、CentOS6.6安装docker

1、因为selinux和LXC有冲突,所以需要禁用

sed -i's@SELINUX=enforcing@SELINUX=disabled@g' /etc/selinux/configsetenforce0

2、配置YUM

centos base源我使用的本地源,安装docker需要epel源,我这里使用的是aliyun的epel源aliyuncentos:http://mirrors.aliyun.com/help/centosaliyunepel:http://mirrors.aliyun.com/help/epelyum源配置操作略过。

3、安装docker

#docker-io来自epel源,所以epel源一定要配置
yuminstall docker-io -y



4、启动docker

servicedocker start

chkconfigdocker on[root@localhost~]# chkconfig --list | grep dockerdocker 0:off 1:off 2:on 3:on 4:on 5:on 6:off

5、检查docker版本

dockerversion




二、febootstrap自制Docker的CentOS6.6 base image

1、安装febootstrap

febootstrap只有在centos6时提供,到centos7不再提供,但是该rpm是可以在centos7上使用的,可以提取出来到centos7上安装使用,测试正常ok。

yuminstall febootstrap -y



2、使用root账号制作镜像

使用root账号制作镜像,普通用户制作后会有各种问题:

#febootstrap 基本用法是febootstrap [--options] REPO TARGET [MIRROR] ,后面可根据实际情况安装相应的包 -i 包名
febootstrap-i bash \-i wget-i yum -i iputils -i iproute -i man -i vim -i vi -i openssh-server -iopenssh-clients \-i tar -igzip -i cronie-anacron -i crontabs -i rsyslog -i passwd \centos66centos66-image http://10.0.0.250/centosiso/centos6.6_x64/ 提示:我这里使用的是本地镜像源,速度快,如果没有条件的可以使用阿里云或者163的镜像源也是一样的。 (-i 安装package, centos66 操作系统版本,centos66-doc安装目录,最后是源地址)-i 镜像所需要安装的工具:把-i后面的参数传递给yum来实现安装,上面安装了ssh服务
命令的执行完成后,会在当前目录下生成一个目录centos6-image 为了避免出现bash-4.1.2#这种情况,可以在centos6-doc目录的root目录把.bash_logout .bash_profile .bashrc这三个文件设置一下
cdcentos66-image && cp etc/skel/.bash* root/

#上面成功后:开始制作镜像

[root@localhostcentos66-image]# pwd/home/centos66-image tar -c .|docker import - centos66-base



(centos66-bash为docker镜像名字)
3、检查镜像制作

dockerimages



到此镜像制作完毕。为了简单保存或者利用制作好的镜像,可以参考下面的第4步操作

该实验外的知识补充:

4、导出镜像和导入镜像方便分享镜像文件

4.1、导出镜像:
操作命令:
dockersave IMAGENAME |bzip2 -9 -c>img.tar.bz2
操作演示:

#查看现有的镜像dockerimages



#导出镜像dockersave centos66-base | bzip2 -9 -c>centos66-base.tar.bz2





4.2、导入镜像(换一台机器)

操作命令:
bzip2 -d-c <img.tar.bz2| docker load
操作演示:
bzip2 -d-c <centos66-base.tar.bz2 | docker load#检查dockerimages

三、centos 6 Docker桥接到主机所在的内网

1docker网络介绍

Docker作为目前最火的轻量级容器技术,有很多令人称道的功能,如Docker的镜像管理。然而,Docker同样有着很多不完善的地方,网络方面就是Docker比较薄弱的部分。因此,我们有必要深入了解Docker的网络知识,以满足更高的网络需求。本文首先介绍了Docker自身的4种网络工作方式,然后通过3个样例 ―― 将Docker容器配置到本地网络环境中、单主机Docker容器的VLAN划分、多主机Docker容器的VLAN划分,演示了如何使用pipework帮助我们进行复杂的网络设置,以及pipework是如何工作的

#Docker的4种网络模式

我们在使用docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式:

※host模式,使用--net=host指定。※container模式,使用--net=container:NAME_or_ID指定。※none模式,使用--net=none指定。※bridge模式,使用--net=bridge指定,默认设置。

下面分别介绍一下Docker的各个网络模式。

1.1 host模式

众所周知,Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,MountNamespace隔离文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的NetworkNamespace隔离。一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个NetworkNamespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。

例如,我们在10.10.101.105/24的机器上用host模式启动一个含有web应用的Docker容器,监听tcp80端口。当我们在容器中执行任何类似ifconfig命令查看网络环境时,看到的都是宿主机上的信息。而外界访问容器中的应用,则直接使用10.10.101.105:80即可,不用任何NAT转换,就如直接跑在宿主机中一样。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。

1.2 container模式

在理解了host模式后,这个模式也就好理解了。这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。

1.3 none模式

这个模式和前两个不同。在这种模式下,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。

1.4 bridge模式

bridge模式是Docker默认的网络设置,此模式会为每一个容器分配NetworkNamespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。下面着重介绍一下此模式。

1.4.1 bridge模式的拓扑

当Docker server启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。接下来就要为容器分配IP了,Docker会从RFC1918所定义的私有IP网段中,选择一个和宿主机不同的IP地址和子网分配给docker0,连接到docker0的容器就从这个子网中选择一个未占用的IP使用。如一般Docker会使用172.17.0.0/16这个网段,并将172.17.42.1/16分配给docker0网桥(在主机上使用ifconfig命令是可以看到docker0的,可以认为它是网桥的管理接口,在宿主机上作为一块虚拟网卡使用)。单机环境下的网络拓扑如下,主机地址为10.10.101.105/24。

Docker完成以上网络配置的过程大致是这样的:

在主机上创建一对虚拟网卡veth pair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因此,veth设备常用来连接两个网络设备。
Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0。另一端放在主机中,以veth65f9这样类似的名字命名,并将这个网络设备加入到docker0网桥中,可以通过brctlshow命令查看。

2、安装相关工具包

#安装pipework
git clonehttps://github.com/jpetazzo/pipeworkcd pipework/cppipework /usr/bin/chmod +x/usr/bin/pipework

#安装iproute-2.6.32-130.el6ost.netns.2.x86_64.rpm
yumlocalinstall iproute-2.6.32-130.el6ost.netns.2.x86_64.rpm -y





3、查看当前主机网络信息

ifconfig-a



说明:docker在启动之后就会创建一个名为docker0的虚拟网卡,以此来和生成的容器进行通信的,而容器则默认情况下是通过docker0 nat方式访问外网,而外网想访问docker容器,则默认情况下需要端口映射。

所以此实验为了避免这种必须端口映射的问题,将docker容器的虚拟网卡桥接到你其他主机所在的公司内网,方便互访,且能以此实现跨主机间的docker容器的访问。
注意:虽然这种方法能解决很多麻烦事,和实现跨主机的访问,但是随着docker数量的不断增加也会伴随着广播风暴的问题,这里一定要注意。

4、停止docker服务

[root@localhosthome]# service docker stopStoppingdocker: [ OK ]

5、创建自定义桥接网卡br0

yuminstall bridge-utils -ycd/etc/sysconfig/network-scripts/cpifcfg-eth0 ifcfg-eth0_bakcpifcfg-eth0 ifcfg-br0
ifcfg-eth0配置:
DEVICE=eth0TYPE=EthernetONBOOT=yesBRIDGE=br0 #注意添加此项不要奇怪,这里没有BOOTPROTO项是完全正常的,请继续操作。

ifcfg-br0的配置:
DEVICE=br0ONBOOT=yesBOOTPROTO=staticIPADDR=10.0.1.21 #原先eth0的IPNETMASK=255.255.0.0 #原先eth0的子网掩码GATEWAY=10.0.0.254 #网关DNS1=223.5.5.5
配置完毕后重启网络服务。
我是ssh远程登录操作的,在重启服务(service network restart)断开网络了,之后又手动ifup br0启动了。
提醒:如果你的主机有多余的网卡,就像我这里的虚拟机还有个eth1,那么你这个步骤这里可以将eth1桥接到br0上,eth0的ip地址不变,让其作为你的管理ip。

5.1、查看桥接状态

[root@localhost~]# brctl show



#设置开机自启动

echo"ifup br0" >> /etc/rc.d/rc.local

6、修改docker容器启动时自动桥接到br0(重点)

网上很多关于ubuntu的操作方法如下:修改/etc/default/docker修改默认的桥接网络为br0:$ more /etc/default/dockerDOCKER_OPTS="-b=br0"
我这里使用的是centos6.6_64_mini
操作如下:
vim/etc/sysconfig/docker将other_args=后面添加'-b=br0',最后为:other_args='-b=br0'
原内容:




修改后的内容




7、启动docker

servicedocker start
8、检查docker运行参数是否有-b=br0

#下图中显示为第6步的操作已经启效果。
ps -ef |grep docker


9、以--net=none方式启动一个容器

#我这里为了演示方便,没有让其进入后台-d模式,都是另起一个shell在宿主上进行其他操作。

dockerrun --name test1 --net=none -i -t centos66-base /bin/bash


10、查看当前容器网络情况




11、查看主机上的网桥状态

brctlshow





12、使用pipework给容器test1设置ip及网关信息。

pipeworkbr0 -i eth0 test1 10.0.1.50/16@10.0.0.254



没有报错及成功,到test1容器去看看吧。
13、第2次查看test1容器的ip、路由情况。








#ping测试

ping 10.0.0.254



ping www.baidu.com
#提示:我的外网路由器有mac地址绑定,所以我先要去绑定以下10.0.1.50(容器的IP地址),如果你再测试到这里时,切记你自己的外网路由是否有什么限制。



好了,可以再自行ping下内容的其他主机测试。

14、第2次看下宿主的网桥状态




15、删除docker0网桥

#停止docker默认网桥ifconfigdocker0 down #删除docker默认网桥brctldelbr docker0 #查看物理机上有哪些网桥brctlshow



16、重启test1容器再观察

ifconfig





#pipework方式设置的ip,当容器重启之后ip也会随之丢失

#重新设置刚才相同的ip地址之后观察
pipework br0 -i eth0 test110.0.1.50/16@10.0.0.254



#总结:容器重启之后pipework方式设置的ip会丢失,需要重新设置,且重启生成的网卡的mac地址也是不一样的,所以导致外网有mac地址绑定的环境影响重启之后docker容器访问外网,不影响内容网的互访。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: