转载

Docker容器部署

此文献给对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软链到数据盘的文件。

Docker安装

我们只需要将debian sid中的docker 1.9捞回来,然后dpkg -i安装即可。我们选择这个版本的原因是:这个版本第一次将/etc/hosts和/etc/hostname设置为允许用户修改。这个可以满足我们部分应用依赖/etc/hosts配置的需求。

最后check配置

在完成所有的系统配置后,最重要的一点是重启确认所有配置都符合预期。

容器使用

基础设施

一般考虑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了解详细功能,感谢您的阅读 本公众号将会持续推送更多精彩文章,欢迎关注!

Docker容器部署

网易云

关注“ 网易云了解动态

获取云计算技术干货

正文到此结束
Loading...