测试环境:

windows7台式机:   ip10.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、因为selinuxLXC有冲突,所以需要禁用

 

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

setenforce0


2、配置YUM

 

centos  base源我使用的本地源,安装docker需要epel源,我这里使用的是aliyunepel

aliyuncentoshttp://mirrors.aliyun.com/help/centos

aliyunepelhttp://mirrors.aliyun.com/help/epel

yum源配置操作略过。


3、安装docker

 

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

yuminstall docker-io -y

centos6 Docker桥接到主机所在的内网_第1张图片


4、启动docker

 

servicedocker start

wKioL1axy0CjM0CkAAARhpOoE0s794.png

 

chkconfigdocker on

[root@localhost~]# chkconfig --list | grep docker

docker             0:off 1:off 2:on 3:on 4:on 5:on 6:off



5、检查docker版本

 

dockerversion


centos6 Docker桥接到主机所在的内网_第2张图片



二、febootstrap自制DockerCentOS6.6 base p_w_picpath

 

1、安装febootstrap

 

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

 

yuminstall febootstrap -y

centos6 Docker桥接到主机所在的内网_第3张图片



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-p_w_picpath http://10.0.0.250/centosiso/centos6.6_x64/

 

提示:我这里使用的是本地镜像源,速度快,如果没有条件的可以使用阿里云或者163的镜像源也是一样的。

 

(-i 安装package centos66 操作系统版本,centos66-doc安装目录,最后是源地址)

-i 镜像所需要安装的工具:把-i后面的参数传递给yum来实现安装,上面安装了ssh服务

 

命令的执行完成后,会在当前目录下生成一个目录centos6-p_w_picpath

 

为了避免出现bash-4.1.2#这种情况,可以在centos6-doc目录的root目录

.bash_logout .bash_profile  .bashrc这三个文件设置一下

 

cdcentos66-p_w_picpath && cp etc/skel/.bash* root/

 

 

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

 

[root@localhostcentos66-p_w_picpath]# pwd

/home/centos66-p_w_picpath

 

tar -c .|docker import - centos66-base

wKioL1axy56ClyW2AAAawkNeSXY213.png


(centos66-bashdocker镜像名字)

 

3、检查镜像制作

 

dockerp_w_picpaths

wKiom1axy2Swjxg3AAAURMvhlZ8181.png


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

 

该实验外的知识补充:

 

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

 

4.1、导出镜像:

操作命令:

dockersave IMAGENAME |bzip2 -9 -c>img.tar.bz2

 

操作演示:

 

#查看现有的镜像

dockerp_w_picpaths

wKioL1axy9Hw6-b2AAAUj_Ko5Ic456.png


#导出镜像

dockersave centos66-base | bzip2 -9 -c>centos66-base.tar.bz2


wKioL1axy-izKTRyAAAQTA0lPpk289.png




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

 

操作命令:

bzip2 -d-c <img.tar.bz2| docker load

 

操作演示:

bzip2 -d-c

#检查

dockerp_w_picpaths

 

 

 

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

 

1docker网络介绍

 

 

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

 

 

#Docker4种网络模式

 

我们在使用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使用了LinuxNamespaces技术来进行资源隔离,如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设备常用来连接两个网络设备。

Dockerveth 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


centos6 Docker桥接到主机所在的内网_第4张图片



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

 

ifconfig-a

centos6 Docker桥接到主机所在的内网_第5张图片



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

 

所以此实验为了避免这种必须端口映射的问题,将docker容器的虚拟网卡桥接到你其他主机所在的公司内网,方便互访,且能以此实现跨主机间的docker容器的访问。

注意:虽然这种方法能解决很多麻烦事,和实现跨主机的访问,但是随着docker数量的不断增加也会伴随着广播风暴的问题,这里一定要注意。

 

4、停止docker服务

 

[root@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                     #原先eth0IP

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上,eth0ip地址不变,让其作为你的管理ip

 

5.1、查看桥接状态

 

[root@localhost~]# brctl show

wKioL1axzEqA9ABeAAAWyQyES9c130.png


#设置开机自启动

 

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'

原内容:


centos6 Docker桥接到主机所在的内网_第6张图片

修改后的内容

centos6 Docker桥接到主机所在的内网_第7张图片


7、启动docker

 

servicedocker start

 

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

 

#下图中显示为第6步的操作已经启效果。

ps -ef |grep docker

wKiom1axzFSxE2e2AAAbG3kdefo039.png

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

 

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

 

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

wKiom1axzHHhqIp2AAAOWTBuePA054.png

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

centos6 Docker桥接到主机所在的内网_第8张图片


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

 

brctlshow


wKioL1axzOKjlyyPAAAXMqMgsyU478.png


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

 

pipeworkbr0 -i eth0 test1 10.0.1.50/[email protected]

wKioL1axzPvDxY5aAAANhvXXfA8660.png


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

 

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


centos6 Docker桥接到主机所在的内网_第9张图片

wKioL1axzRuRDu09AAAcP7JO39U850.png


#ping测试

 

ping 10.0.0.254

wKiom1axzN-jL7W2AAAixmfcZo4656.png

ping www.baidu.com

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

wKiom1axzPGSB2l3AAAjznOo7iY006.png

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

 

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

wKioL1axzVOBM1cWAAAYWwnF-BM502.png


15、删除docker0网桥

 

#停止docker默认网桥

ifconfigdocker0 down

 

#删除docker默认网桥

brctldelbr docker0          

 

#查看物理机上有哪些网桥

brctlshow

wKioL1axzWbzqPcHAAAVQ_Tfxq0385.png


16、重启test1容器再观察

 

ifconfig


centos6 Docker桥接到主机所在的内网_第10张图片


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

 

#重新设置刚才相同的ip地址之后观察

pipework br0 -i eth0 test110.0.1.50/[email protected]

centos6 Docker桥接到主机所在的内网_第11张图片

#总结:容器重启之后pipework方式设置的ip会丢失,需要重新设置,且重启生成的网卡的mac地址也是不一样的,所以导致外网有mac地址绑定的环境影响重启之后docker容器访问外网,不影响内容网的互访。