Docker使用中可能遇到的问题

Docker并不是一个新的技术,容器化也不是,早在2006年就陆续出现了LXC, OpenVZ,Jail等容器虚拟化技术,但是为什么Docker却能异军突起呢?Docker的核心是基于 Linux的CGroup、Namespace和LayeredFS技术,通过资源的控制、隔离和对镜像的分层处理,是Docker容器能够将应用程序和运行环境打包到一起,这样就可以Build, Ship And Run anywhere。与其说是Docker火,不如说是其天生的轻量级属性,正好迎合了云计算大行其道的今天。因此,笔者认为Docker改变整个云计算和互联网的格局是迟早的事,但是Docker在使用中,特别是在国内,又有什么需要注意的问题呢?

Docker使用中可能遇到的问题

1. 编译

Docker虽然说是一个开源的项目,但是如果你要在国内成功编译它是一件非常困难的事情。Docker是用Go来开发的,Go被誉为互联网时代的C语言,由google主导开发,它的开发者包括了 Chrome V8引擎和Unix的开发者,因此它天生就是易用且简介的。它具有良好的包管理、简介的语法和非常好的灵活性。但是,在国内很多package,你是不一定能够取下来的,这样就导致编译过程很难进行。

2. 安装

如果你在国外,没有GFW的限制,拥有非常好的网速,你使用Docker就像是在开一辆跑车。但如果你在国内,就好比是开了一辆没油的跑车。我曾经很多次遇到了安装失败的问题,而且安装速度非常缓慢。同时,如果你要在全封闭的内网安装Docker就更麻烦,你需要将所有的安装包完整迁移到内网,这个工作量是非常大的。下面就是一个官方安装失败的例子:

root@ghostcloud:~# curl -fsSL https://get.docker.com/ | sh 
 
apparmor is enabled in the kernel and apparmor utils were already installed 
 
+ sh -c apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D 
 
Executing: gpg --ignore-time-conflict --no-options --no-default-keyring --homedir /tmp/tmp.cr8hxY45Ve --no-auto-check-trustdb --trust-model always --keyring /etc/apt/trusted.gpg --primary-keyring /etc/apt/trusted.gpg --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D 
 
gpg: requesting key 2C52609D from hkp server p80.pool.sks-keyservers.net 
 
?: p80.pool.sks-keyservers.net: Host not found 
 
gpgkeys: HTTP fetch error 7: couldn't connect: Success 
 
gpg: no valid OpenPGP data found. 
 
gpg: Total number processed: 0 

3. 镜像pull非常慢

Docker为什么火,有一个重要的原因就是它开创性的分层镜像机制,你的环境和应用程序都会被打包到镜像中。但是,一个比较大的问题是,Docker所有的镜像都依赖于基础镜像,而这些基础镜像都在国外的docker hub上,当你兴致勃勃准备用docker大干一场时,pull的漫长等待一定会让你很抓狂,而最后的超时失败,更会让你有说脏话的冲动。

4. 镜像存储

Dockerhub在国外这个问题还好,但是默认的dockerhub所有镜像都是公开的,就是说你的镜像别人都能够下载。这个策略跟github是一样的,如果你要用免费的,那么你就得开源。否则,给钱买私有仓库吧。Docker的私有仓库价格是非常贵的,而且速度还很慢。你不可能需要共享镜像时,都push到国外,再pull回来吧。当然有的人可能要说,我可以搭建私有仓库。不过私有仓库仅时候企业内部私有网络使用,而且没有基础镜像,如果你有跨区域的使用,是非常难处理的。

5. 云端的部署问题

至少在我写这篇文章的时候,不是每一家公有云厂商的基础镜像都能顺利的安装docker,docker是轻量级的虚拟化技术不假,但它仍然不能在短期内替代VM。如果你要在VM上使用docker,需要对网络、存储等做一些特殊的处理。

6. 容器和主机的管理

Docker是轻量级的不假,但是随着轻量以后,势必会出现大量的容器和主机。本身使用docker的出发点是降低运维成本,提升效率,但是管理上的成本相反却会上升。主机的监控、容器的监控、容器和容器之间的联系等等,都需要专业的公司来处理。很多人可能会想,我可以使用kubernetes,mesos等开源框架,不过我想给你敲一个警钟,如果你没有10人以上的运维团队,最好不要去碰这类框架。这类框架设计之初就是管理成千上万台的主机,如果你没有这么大的量,一定会让你日后的维护非常的酸爽。

7. 容器的性能

容器有性能损失吗?如果你要将系统搬迁到docker上,你是否会有担忧?CPU、内存、磁盘IO的性能到底如何?如何进行优化?这些都是需要大量测试和优化的。

8. 容器的安全

容器到底安全吗?容器是操作系统级的虚拟化技术,多个容器实际是共享了操作系统内核。容器的安全一直在不断的向前发展,但是你必须要了解容器可能受攻击的面有多大,如何来进行避免。

9. 网络问题

容器本身支持多达5种网络模式,默认的方式只是非常基础的简单应用,对于您的实际环境,则需要专门的特殊处理,才能是网络性能达到最优化。

10. 容器型运维人员短缺

目前国内对linux比较熟悉的运维都是供不应求,而容器是建立在linux之上的,诚然容器可以提升开发、测试和运维的效率,但是这是建立在你有懂docker的运维的人员。据我所知,目前国内对docker很熟悉的运维人员非常少,docker的一手资料基本都是英文的,对英文非常熟悉的运维人员并不多。

对于上面的问题,其中的每一条都可能延伸出来很长的篇幅,这些都是笔者在实际开发和应用中遇到过的问题, Docker的发展速度飞航快,到现在已经3年了,现在它已经从一个测试-发布的工具,逐步转变成为基础架构的组成部分,正式迈向产品化环境,但实际使用中依然有很多需要注意的地方。2016年3月31日,精灵云(www.ghostcloud.cn) Docker混合云PaaS/CaaS正式上线,欢迎注册使用。