设为首页 收藏本站
查看: 2681|回复: 0

[经验分享] centos6 Docker桥接到主机所在的内网

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-2-4 08:42:51 | 显示全部楼层 |阅读模式
测试环境:
windows7台式机:   ip:10.0.1.6/16  网关:10.0.0.254/16 上网正常。
vmware虚拟机一台:  centos6.6_64mini
eth0 ip:10.0.1.21/16  网关:10.0.0.254/16


用到软件包:
pipework
iproute-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/config
setenforce0

2、配置YUM源

centos  base源我使用的本地源,安装docker需要epel源,我这里使用的是aliyun的epel源
yum源配置操作略过。

3、安装docker

#docker-io来自epel源,所以epel源一定要配置
yuminstall docker-io -y
QQ截图20160204083708.jpg

4、启动docker

servicedocker start
QQ截图20160204083717.jpg

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


5、检查docker版本

dockerversion

QQ截图20160204083725.jpg


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

1、安装febootstrap

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

yuminstall febootstrap -y
QQ截图20160204083754.jpg


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 \

提示:我这里使用的是本地镜像源,速度快,如果没有条件的可以使用阿里云或者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/


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

[iyunv@localhostcentos66-image]# pwd
/home/centos66-image

tar -c .|docker import - centos66-base
QQ截图20160204083828.jpg

(centos66-bash为docker镜像名字)

3、检查镜像制作

dockerimages
QQ截图20160204083836.jpg

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

该实验外的知识补充:

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

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

操作演示:

#查看现有的镜像
dockerimages
QQ截图20160204083914.jpg

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

QQ截图20160204083920.jpg



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

操作命令:
bzip2 -d-c <img.tar.bz2| docker load

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



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

1、docker网络介绍


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
cd 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

QQ截图20160204083930.jpg


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

ifconfig-a
QQ截图20160204083943.jpg


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

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

4、停止docker服务

[iyunv@localhosthome]# service docker stop
Stoppingdocker:                                           [  OK  ]


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



yuminstall bridge-utils -y
cd/etc/sysconfig/network-scripts/
cpifcfg-eth0 ifcfg-eth0_bak
cpifcfg-eth0 ifcfg-br0

ifcfg-eth0配置:
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BRIDGE=br0                       #注意添加此项
不要奇怪,这里没有BOOTPROTO项是完全正常的,请继续操作。

ifcfg-br0的配置:
DEVICE=br0
ONBOOT=yes
BOOTPROTO=static
IPADDR=10.0.1.21                     #原先eth0的IP
NETMASK=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、查看桥接状态

[iyunv@localhost~]# brctl show
QQ截图20160204083951.jpg

#设置开机自启动

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


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

网上很多关于ubuntu的操作方法如下:
修改/etc/default/docker修改默认的桥接网络为br0:
$ more /etc/default/docker
DOCKER_OPTS="-b=br0"

我这里使用的是centos6.6_64_mini
操作如下:
vim/etc/sysconfig/docker
将other_args=后面添加'-b=br0',最后为:other_args='-b=br0'
原内容:

QQ截图20160204083958.jpg
修改后的内容
QQ截图20160204084003.jpg

7、启动docker

servicedocker start

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

#下图中显示为第6步的操作已经启效果。
ps -ef |grep docker
QQ截图20160204084010.jpg
9、以--net=none方式启动一个容器

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

dockerrun --name test1 --net=none -i -t centos66-base /bin/bash
QQ截图20160204084017.jpg
10、查看当前容器网络情况
QQ截图20160204084022.jpg

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

brctlshow

QQ截图20160204084027.jpg

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

pipeworkbr0 -i eth0 test1 10.0.1.50/16@10.0.0.254
QQ截图20160204084032.jpg

没有报错及成功,到test1容器去看看吧。

13、第2次查看test1容器的ip、路由情况。

QQ截图20160204084038.jpg
QQ截图20160204084042.jpg

#ping测试

ping 10.0.0.254
QQ截图20160204084050.jpg
ping www.baidu.com
#提示:我的外网路由器有mac地址绑定,所以我先要去绑定以下10.0.1.50(容器的IP地址),如果你再测试到这里时,切记你自己的外网路由是否有什么限制。
QQ截图20160204084056.jpg
好了,可以再自行ping下内容的其他主机测试。

14、第2次看下宿主的网桥状态
QQ截图20160204084101.jpg

15、删除docker0网桥

#停止docker默认网桥
ifconfigdocker0 down

#删除docker默认网桥
brctldelbr docker0         

#查看物理机上有哪些网桥
brctlshow
QQ截图20160204084111.jpg

16、重启test1容器再观察

ifconfig

QQ截图20160204084115.jpg

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

#重新设置刚才相同的ip地址之后观察
pipework br0 -i eth0 test110.0.1.50/16@10.0.0.254
QQ截图20160204084123.jpg
#总结:容器重启之后pipework方式设置的ip会丢失,需要重新设置,且重启生成的网卡的mac地址也是不一样的,所以导致外网有mac地址绑定的环境影响重启之后docker容器访问外网,不影响内容网的互访。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-173496-1-1.html 上篇帖子: 宿主机访问操作docker方式 下篇帖子: 使用Dockerfile构建镜像 主机
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表