CentOS 7 Docker

CentOS 7已经包含了Docker支持,可以不用像以前那样使用第三方EPEL软件仓库。但是,目前发行版本的Docker版本过低,我测试遇到创建的bridge网络,vm虚拟机无法通过ssh登录。不过,测试最新Docker官方版本已经修复了bug,所以采用官方最新版本安装部署。

配置Bridge网络

默认的docker会启动一个NAT网络的bridge名字是 docker0 ,使用NAT网络就需要为每个运行的容器配置一个端口映射,以便外部能够访问虚拟容器中的服务。

而实际环境,每个虚拟容器分配独立的IP地址,采用bridge模式,虚拟交换机和物理网卡绑定,能够直接把虚拟机和外部联通。( Network Configuration ) 所以,这里预先配置好命名为 docker0 的bridge网络。

单网卡Bridge网络

测试环境的ThinkPad 220是单块网卡,操作系统识别为 enp0s25 ,对应在 /etc/sysconfig/network-scripts 目录下有如下配置

ifcfg-enp0s25:

TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME=enp0s25
UUID=65795f55-ce7a-471d-8cd5-a092640dfa63
ONBOOT=yes
#IPADDR0=192.168.1.21
#PREFIX0=24
#GATEWAY0=192.168.1.1
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
HWADDR=F0:DE:F1:9B:0C:7B
BRIDGE=docker0

这里修改了系统OS安装以后自动创建的 ifcfg-enp0s25 ,注释掉原先直接分配给物理网卡 enp0s25 的IP和网关(这部分配置要移到 docker0 网桥配置中 )

#IPADDR0=192.168.1.21
#PREFIX0=24
#GATEWAY0=192.168.1.1

然后增加一行将网卡绑定到bridge设备docker0的配置,这样网络启动时相当于物理网卡和虚拟交换机docker0连接,则后续连接到docker0的虚拟容器就能够通过网桥和物理网卡访问外网:

BRIDGE=docker0

ifcfg-docker0:

DEVICE=docker0
ONBOOT=yes
TYPE=Bridge
DELAY=0
STP=off
MTU=1500
DEFROUTE=no
NM_CONTROLLED=no
HOTPLUG=no
IPADDR0=192.168.1.21
PREFIX0=24
GATEWAY0=192.168.1.1

这里IP和网关配置是从原ifcfg-enp0s25配置中移来的,这样网桥将继承原物理网卡的IP地址

比较奇怪,这里迁移到 ifcfg-docker0 的指定默认网关 GATEWAY0=192.168.1.1 没有生效,最后还是我启动服务器以后,手工输入命令:

ip route add default via 192.168.1.1 dev docker0

才设置好默认路由。

RHEL 7开始,新的启动系统服务使用systemd管理 (systemd 不使用/etc/inittab 文件)

双网卡Bridge网络(含VLAN支持)

如果物理机网络和虚拟机网络采用不同的vlan,并且结合了双网卡bonding模式:

  • eth0eth1 物理网卡创建 bonding
  • 给 bonding 添加VLAN50 (用于物理服务器)
  • 给 bonding 添加VLAN150 (用于虚拟容器)
  • 创建网桥 docker0 并和 VLAN150 的bonding设备绑定

ifcfg-eth0:

DEVICE=eth0
TYPE="Ethernet"
HWADDR=D4:3D:7E:7A:07:D8
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes
PEERDNS=no
ETHTOOL_OPTS="speed 1000 duplex full autoneg on"
RX_MAX=`ethtool -g "$DEVICE" | grep 'Pre-set' -A1 | awk '/RX/{print $2}'`
RX_CURRENT=`ethtool -g "$DEVICE" | grep "Current" -A1 | awk '/RX/{print $2}'`
[[ "$RX_CURRENT" -lt "$RX_MAX" ]] && ethtool -G "$DEVICE" rx "$RX_MAX"

ifcfg-eth1:

DEVICE=eth1
TYPE="Ethernet"
HWADDR=D4:3D:7E:7A:07:D9
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes
PEERDNS=no
ETHTOOL_OPTS="speed 1000 duplex full autoneg on"
RX_MAX=`ethtool -g "$DEVICE" | grep 'Pre-set' -A1 | awk '/RX/{print $2}'`
RX_CURRENT=`ethtool -g "$DEVICE" | grep "Current" -A1 | awk '/RX/{print $2}'`
[[ "$RX_CURRENT" -lt "$RX_MAX" ]] && ethtool -G "$DEVICE" rx "$RX_MAX"

ifcfg-bond0:

DEVICE=bond0
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
BONDING_OPTS="miimon=100 mode=4 xmit_hash_policy=layer3+4"

ifcfg-bond0.50

DEVICE=bond0.50
ONBOOT=no
VLAN=yes
IPADDR=192.168.50.1
NETMASK=255.255.255.0
BOOTPROTO=none
MTU=1500
DEFROUTE=yes
NM_CONTROLLED=no
HOTPLUG=no

以上bonding配置支持vlan50,实现双网卡双活模式通讯

ifcfg-bond0.150:

DEVICE=bond0.150
ONBOOT=yes
VLAN=yes
BRIDGE=docker0
MTU=1500
NM_CONTROLLED=no
HOTPLUG=no

ifcfg-docker0:

DEVICE=docker0
ONBOOT=yes
TYPE=Bridge
DELAY=0
STP=off
MTU=1500
DEFROUTE=no
NM_CONTROLLED=no
HOTPLUG=no
IPADDR0=192.168.150.1
PREFIX0=22
#GATEWAY=192.168.150.254

以上创建专用于虚拟机的vlan150的bonding设备,并将设备和网桥 docker0 进行绑定,这样后续创建的docker虚拟机将可通过该设备进行通讯。

有一个特别的要求,就是 docker0 上必须设置IP地址,否则会导致 docker 服务无法启动( docker 会根据 docker0 上绑定的IP地址来决定vm的分配IP地址范围)提示以下错误:

Could not find a free IP address range for interface 'docker0'. Please configure its address manually and run 'docker -b docker0'

比较奇怪,在 docker0 这个bridge上分配的IP地址,没有能够 ping 通,测试 ssh 也没有成功。不过,我测试了一下访问连接外部网络端口(设置了从 docker0 接口作为默认路由),然后观察 netstat -an | grep 80 可以看到数据流确实从 docker0 接口IP出去 。

安装docker

经过验证,当前CentOS 7发行版的docker版本 0.11 存在bug,创建的虚拟容器启动ssh服务之后,无法从外部ssh登录 - Docker虚拟容器ssh登录问题解决方法,而这个bug在最新的 1.2 版本已解决,所以改为直接下载docker最新可执行代码 https://docs.docker.com/installation/centos/:

cd /usr/sbin
wget https://get.docker.io/builds/Linux/x86_64/docker-latest -O docker
chmod +x docker

运行docker服务

./docker -d &

下一步行动

虚拟容器的大规模部署基础环境: