docker Pipework配置宿主机和docker实例的IP
摘要: 本文讲的是Docker使用自定义网桥docker,并且自定义容器的ip地址。 Docker 服务默认会创建一个 docker0 网桥,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。 用户也可以指定网桥来连接各个容器。
Docker 服务默认会创建一个 docker0 网桥,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。
一、设置网络桥接,步骤如下:
1. 首先安装bridge-utils工具包
$ yum install bridge-utils
然后可以用 “brctl show” 来查看当前网桥信息,可以看到目前只有一个 docker0
$ brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.56847afe9799 no
2. 然后创建一个网桥 br0
$ vim /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE="br0"
ONBOOT="yes"
TYPE="Bridge"
BOOTPROTO="static"
IPADDR="192.168.31.154"
NETMASK="255.255.255.0"
GATEWAY="192.168.31.1"
DEFROUTE="yes"
NM_CONTROLLED="no"
3. 编辑vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=none
BRIDGE=br0
4. 编辑 /etc/sysconfig/docker 文件,添加如下Docker参数,是Docker默认使用上面新添加的网桥
other_args="-b br0"
5. 重启网络服务
$ service docker restart
6. 查看配置
$ brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000c29e7dd97 no eth0
新建一个容器,可以看到它已经桥接到了 br0 上了。
6. 最后,如果要删除网桥,执行下边的命令
$ ip link set dev br0 down
$ brctl addbr br0
二、 Pipework 配置Docker固定IP
我们在自定义网桥的基础上去做固定IP配置,Pipework有个缺点就是给容器指定完固定IP,如果容器重启,那么固定IP会消失,还需要重新指定,容器量大时可写个脚本来完成
1. 下载PipeWoke
下载地址:https://github.com/jpetazzo/pipework.git
解压到/usr/local/bin/,并且加上可执行权限
2. 启动两个容器
docker run -itd --name test1 --net=none centos /bin/bash
docker run -itd --name test2 --net=none centos /bin/bash
3. 设置容器IP
pipework br0 test2 192.168.15.244/24@192.168.15.1
pipework br0 test1 192.168.15.243/24@192.168.15.1
其中@后面的ip为Docker容器宿主机的网关
或者是2,3合并执行如下的命令:
pipework br0 $(docker run -itd --name test1 --net=none centos /bin/bash) 192.168.31.243/24@192.168.31.1
pipework br0 $(docker run -itd --name test2 --net=none centos /bin/bash) 192.168.31.244/24@192.168.31.1
4. 在rc.local中配置,如下:
vim /etc/rc.d/init.d/rc.local
具体内容:
service docker start
docker start test1
docker start test2
pipework br0 test2 192.168.31.244/24@192.168.31.1
pipework br0 test1 192.168.31.243/24@192.168.31.1
当然要给rc.local可执行权限:
chmod +x rc.local
另外需要注意的是,在执行rc.local的时候系统里面的path变量没有初始化完成,所以需要用命令的完全路径
如果不知道命令路径位置,使用which,比如 which docker 就会显示docker所在的路径
三、报错处理:
在通过pipework 给docker容器分配IP的时候, 系统报出以下错误:
Object "netns" is unknown, try "ip help".
该错误是由于系统版本暂时不支持namespaces, 可通过更新内核或者iproute的方法获取对namespaces的支持.更新方法如下:
添加yum源:
cat /etc/yum.repos.d/rdo.repo
[openstack-kilo]
name=OpenStack Kilo Repository
baseurl=https://repos.fedorapeople.org/repos/openstack/EOL/openstack-icehouse/epel-6/
skip_if_unavailable=0
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-RDO-kilo
## 接下来更新iproute即可:
yum update iproute -y