centos6 Docker桥接到主机所在的内网
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了centos6 Docker桥接到主机所在的内网相关的知识,希望对你有一定的参考价值。
测试环境:
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‘[email protected][email protected][email protected]‘ /etc/selinux/config
setenforce0
2、配置YUM源
centos base源我使用的本地源,安装docker需要epel源,我这里使用的是aliyun的epel源
aliyuncentos:http://mirrors.aliyun.com/help/centos
aliyunepel:http://mirrors.aliyun.com/help/epel
yum源配置操作略过。
3、安装docker
#docker-io来自epel源,所以epel源一定要配置
yuminstall docker-io -y
4、启动docker
servicedocker start
chkconfigdocker on
[[email protected]~]# chkconfig --list | grep docker
docker 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/
#上面成功后:开始制作镜像
[[email protected]]# 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桥接到主机所在的内网
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
git clonehttps://github.com/jpetazzo/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
3、查看当前主机网络信息
ifconfig-a
说明:docker在启动之后就会创建一个名为docker0的虚拟网卡,以此来和生成的容器进行通信的,而容器则默认情况下是通过docker0 nat方式访问外网,而外网想访问docker容器,则默认情况下需要端口映射。
所以此实验为了避免这种必须端口映射的问题,将docker容器的虚拟网卡桥接到你其他主机所在的公司内网,方便互访,且能以此实现跨主机间的docker容器的访问。
注意:虽然这种方法能解决很多麻烦事,和实现跨主机的访问,但是随着docker数量的不断增加也会伴随着广播风暴的问题,这里一定要注意。
4、停止docker服务
[[email protected]]# 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、查看桥接状态
[[email protected]~]# brctl show
#设置开机自启动
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‘
原内容:
修改后的内容
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/[email protected]
没有报错及成功,到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/[email protected]
#总结:容器重启之后pipework方式设置的ip会丢失,需要重新设置,且重启生成的网卡的mac地址也是不一样的,所以导致外网有mac地址绑定的环境影响重启之后docker容器访问外网,不影响内容网的互访。
以上是关于centos6 Docker桥接到主机所在的内网的主要内容,如果未能解决你的问题,请参考以下文章