此文献给对Docker特别感兴趣且想自己尝试部署的你~
如果你想更方便地使用Docker容器,可以选择网易蜂巢,以比云主机还低的价格购买灵活高配的全SSD容器,一键部署,自助运维,交付快人一步!可点击左下角“阅读原文”进入蜂巢官网( c.163.com ),迎新即将开放注册,并有惊喜礼包,敬请期待!
部署Docker的准备
docker容器是依赖内核的namespace实现的,因此我们在使用docker前首先确保系统运行的内核版本足够新。我们使用的是debian 7 backports版本的3.14bpo系列内核。
除了内核版本,在新的dell服务器上,如果是追求高性能,不在乎服务器能源消耗的,请确认BIOS里面的风扇转速已经调整到合适转速,grub配置中加入intel节能关闭参数GRUB_CMDLINE_LINUX_DEFAULT="intel_idle.max_cstate=0 idle=poll quiet",然后运行update-grub后重启服务器。
在我们的网络设计中,docker0用于docker启动的默认本地网络。服务器的docker0默认使用x.y.z.1/24。同时服务器的内网网卡eth1设置为bridge模式,一般我们会命名为br0。 例如interface文件关键的网桥设置如下:
auto br0
iface br0 inet static
bridge_ports eth0
address x.y.w.67
netmask 255.255.255.0
auto docker0
iface docker0 inet static
bridge_ports none
address x.y.z.1
netmask 255.255.255.0
iface br0 inet static
address x.y.z.1/24
netmask 255.255.255.0
最后的网络接口如下:
admin @yx 190: ~$ ip add
1 : lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00 : 00 : 00 : 00 : 00 : 00 brd 00 : 00 : 00 : 00 : 00 : 00
inet 127.0.0.1 / 8 scope host lo
valid_lft forever preferred_lft forever
2 : eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master br0 state UP qlen 1000
link/ether b8:ca: 3 a: 6 c:db: e0 brd ff:ff:ff:ff:ff: ff
3 : eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether b8:ca: 3 a: 6 c:db: e1 brd ff:ff:ff:ff:ff: ff
inet a.b.c.67 / 24 brd a.b.c.255 scope global eth1
valid_lft forever preferred_lft forever
6 : br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether b8:ca: 3 a: 6 c:db: e0 brd ff:ff:ff:ff:ff: ff
inet x.y.w.67 / 24 brd x.y.w.255 scope global br0
valid_lft forever preferred_lft forever
7 : docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
link/ether 56 : 84 : 7 a:fe: 97 : 99 brd ff:ff:ff:ff:ff: ff
inet x.y.z.1 / 24 brd x.x.z.255 scope global docker0
valid_lft forever preferred_lft forever
我们使用的是shorewall的配置,因此防火墙的interface参数里面要加入特殊的设置。配置如下:
admin@yx190 :~ $ sudo cat /etc/shorewall/interfaces
# SVN:0
net eth1 detect arp_ignore= 1 ,norfc1918
loc br 0 detect routeback,arp_ignore= 1
lvs tunl 0 detect arp_ignore= 8
lvs dummy 0 detect arp_ignore= 8
br0和一般的网卡设置不一样的是会加入routeback,这个参数的作用是允许网络包到网卡桥接的虚拟网卡中。否则会匹配到-A net_frwd -o br0 -g sfilter规章,导致网络不可用。 docker启动的时候会在iptables里面插入以下规则:
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 10.160.245.0/24 ! -o docker0 -j MASQUERADE
如果是防火墙在后期加载了额外的规则重启shorewall,会导致docker不能通过NAT访问外网链接。如果要完全避免防火墙重启导致的规则不可用,可以在/etc/shorewall/masq加入对应的映射规则。
docker程序在默认启动时设置sysctl net.ipv4.ip_forward=1。注意不要误操作将这个设置改掉,同时修改arp表的数值,配置如下:
net.ipv4.neigh. default .gc_thresh1 = 2048
net.ipv4.neigh. default .gc_thresh2 = 8192
net.ipv4.neigh. default .gc_thresh3 = 16384
一台服务器的连接假设是10个,就会使用10个arp表资源。通常服务器会开20个左右的容器,那么将用到200个左右的配置,一不小心就会导致arp表不够。
debian系统请确保安装aufs。如果需自定义管理网桥,可以安装bridge-utils。请确保/var/lib/docker所在的分区有足够的空间允许容器。在数据盘上建立文件,然后将/var/lib/docker软链到数据盘的文件。
我们只需要将debian sid中的docker 1.9捞回来,然后dpkg -i安装即可。我们选择这个版本的原因是:这个版本第一次将/etc/hosts和/etc/hostname设置为允许用户修改。这个可以满足我们部分应用依赖/etc/hosts配置的需求。
在完成所有的系统配置后,最重要的一点是重启确认所有配置都符合预期。
一般考虑gfw和带宽速度问题,我们不使用docker官方的registery服务,因此我们会自己搭建一个docker registery私服。最简单的方式是访问https://github.com/docker/docker-registry,按照官方文档生成一个docker registery。我们在使用私服的时候只要执行docker login http://xxx.xxx,注册一个帐号。激活帐号后再次执行docker login http://xxx.xxx后,按照一般的docker push/pull就可以将自己的镜像推送到私有的docker registery。 这样我们就可以跨节点共享docker镜像文件了。当然开发或者QA也可以通过这样的命令将自己的docker镜像上传到私服,而且可以针对性的进行版本控制。
我们一般使用[https://github.com/docker/docker/tree/master/contrib]下的脚本来生成镜像tar包。 一般情况下我们会执行cat debian.tar|docker import -这样的命令将生成的文件导入docker中,然后执行docker tag 760be50bb36b netease:wheezy这样的命令对导入生成的镜像760be50bb36b打tag。最后docker images输出如下:
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
netease wheezy 0c3b779e49e6 5 days ago 144 . 3 MB
关于镜像制作,不得不提及Dockerfile文件。以下是一个简单的memcached的Dockerfile设置。
############################################################
# Dockerfile to run Memcached Containers
# Based on Ubuntu Image
############################################################
# Set the base image to use to Ubuntu
FROM netease :wheezy
# Set the file maintainer (your name - the file's author)
MAINTAINER Maintaner Name
# Update the default application repository sources list
RUN apt-get update
# Install Memcached
RUN apt-get install -y memcached
# Default Memcached run command arguments
# Change this value in Tutum to modify mem size
CMD [ "-m" , "64" ]
# Set the user to run Memcached daemon
USER daemon
# Set the entrypoint to memcached binary
ENTRYPOINT memcached
这个配置的效果就是建立镜像,镜像如果启动,就会启动一个64M大小的memcached。然后我们将这个镜像的tag设置成netease:memcached64m。
一般情况下会使用docker run -d netease:memcachd64m –p 11211:11211,启动docker容器。-p参数是用于端口映射。一台服务器会有多个memcached,如果配置不同的端口很容易导致程序端配置变复杂,而且这是依赖防火墙规则,而防火墙重启容易导致业务故障。运行docker run -d netease:memcachd64m。docker ps输出如下:
docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d868c7aabf37 netease:wheezy /bin/sh -c 'exec mem 11 weeks ago Up 11 weeks - yixin191-memcached0
我们在docker容器中加入额外的一块网卡设备eth1,并且配置上指定的ip。最后的效果是docker的eth0是连接docker0的,eth1是连接br0的。因为br0配置了内网,所以docker容器可以识别为机房的一个物理服务器节点。所有的业务方可以通过设置的x.y.w.130`ip连接到容器内部。
因为安全更新,软件升级等原因,需要升级镜像文件。用户执行如下操作docker run -t -i netease:memcached64m /bin/bash,然后按照一般的方式交互的操作容器的内容,完成需要的更新后,直接退出。接着执行docker ps -a,找到对应的docker容器id,执行docker commit 760be50bb36b和docker tag xxxx netease:memcached64mv1(760be50bb36b对应容器的id,xxxx对应docker commit后生成镜像的id),然后docker push到私有registery。
Docker默认插入的iptables nat规则,防火墙可以访问到内外网。但其他服务器不能直接连接容器,除非docker启动时设置端口映射。可以将容器作为一个内网节点对待,拥有所有的内网网络设置。 容器内网若要加多个路由,一种方案是在容器启动时docker run --cap-add=NET_ADMIN ...,允许容器修改网络设置(针对可登录容器):
另一种方案如下:
#获取容器的pid
docker inspect --format='{{ .State.Pid }}' 7bbe46d84519
#连接namespace
ln -s /proc/15140/ns/net /var/run/netns/15140
#设置路由
ip netns exec 15140 ip route del x.y.z.222 via z.y.z.1
建议熟悉docker run命令的输出,了解docker运行参数设置,这样就可以按需合理调整配置。
Docker容器相对更加的轻量级一点,因为docker底层使用了网桥,我们可以通过linux网桥的强大功能配合openflow等组网技术实现更加复杂的网络。
如果你想更方便地使用Docker容器,可以选择网易蜂巢,以比云主机还低的价格购买灵活高配的全SSD容器,一键部署,自助运维,交付快人一步!可点击左下角“阅读原文”进入蜂巢官网(c.163.com),迎新即将开放注册,并有惊喜礼包,敬请期待!
关注“网易云”,精彩不错过
网易蜂巢即将开放注册,欢迎您进入蜂巢官网c.163.com了解详细功能,感谢您的阅读 。 本公众号将会持续推送更多精彩文章,欢迎关注!
关注“ 网易云 ” 了解动态
获取云计算技术干货