28.9 其他项目

28.9.1 CoreOS

项目官方网站为https://coreos.com/,代码在https://github.com/coreos维护。

CoreOS项目基于Python语言,遵循Apache 2.0许可,由CoreOS团队在2013年7月发起,目前已经正式发布首个稳定版本。

CoreOS项目目标是提供一个基于Rocket容器的轻量级容器化Linux发行版,通过轻量的系统架构和灵活的应用部署能力来简化数据中心的维护成本和复杂度。

CoreOS基于一套精简的Linux环境,不使用包管理工具,而将所有应用都进行容器化,彼此隔离,从而提高了系统的安全性。此外,运行期间,系统分区是只读状态,利用主从分区支持更稳定的无缝升级。配合Etcd(分布式高可用的键值数据库)、Fleet(分布式init任务管理)、Flannel(Overlay网络管理)等工具,CoreOS也将适用于在大规模集群环境中进行使用。参见图28-21。

28.9 其他项目 - 图1

图28-21 CoreOS项目

该项目目前得到了KPCB等多家基金的投资。

28.9.2 OpenStack支持

OpenStack是近些年Linux基金会发起的,最受欢迎的云开源项目。项目的官方网站在http://www.openstack.org。项目遵循Apache许可,受到包括IBM、Cisco、AT&T、HP、Rackspace等众多企业的大力支持。

项目的目标是搭建一套开源的架构即服务(Infrastructure as a Service,IaaS)实现方案,主要基于Python语言实现。该项目孵化出来的众多子项目已经在业界产生了诸多影响。

OpenStack目前除了可以管理众多虚机外,其计算服务(Nova)已经支持了对Docker的驱动,此外,还支持通过Stack管理引擎Heat子项目来使用模板管理Docker容器。

例如,下面的Heat模板,定义了使用Docker容器运行一个cirros镜像:


  1. heat_template_version: 2013-05-23
  2. description: Single compute instance running cirros in a Docker container.
  3. resources:
  4. my_instance:
  5. type: OS::Nova::Server
  6. properties:
  7. key_name: ewindisch_key
  8. image: ubuntu-precise
  9. flavor: m1.large
  10. user_data: #include https://get.docker.io
  11. my_docker_container:
  12. type: DockerInc::Docker::Container
  13. docker_endpoint: { get_attr: [my_instance, first_address] }
  14. image: cirros

此外,OpenStack自身的部署也可以基于Docker技术,从而得到极大的简化,甚至更进一步地,可以通过Kubernetes等容器云方案快速启动一套OpenStack环境。

28.9.3 dockerize

一般来说,要将一个应用放到容器里,需要考虑两方面的因素,一是应用依赖的配置信息;二是应用运行时候的输出日志信息。dockerize是一个Go程序,试图简化这两方面的管理成本,目前代码在https://github.com/jwilder/dockerize维护。

它主要可以提供两个功能,一是对于依赖于配置文件的应用,能自动提取环境变量并生成配置文件;另外一个是将应用输出的日志信息重定向到STDOUT和STDERR。

下面给出一个简单的例子,比如要创建一个Nginx镜像,标准的Dockerfile内容为:


  1. FROM ubuntu:14.04
  2. # Install Nginx.
  3. RUN echo "deb http://ppa.launchpad.net/nginx/stable/ubuntu trusty main" >
  4. /etc/apt/sources.list.d/nginx-stable-trusty.list
  5. RUN echo "deb-src http://ppa.launchpad.net/nginx/stable/ubuntu trusty main" >>
  6. /etc/apt/sources.list.d/nginx-stable-trusty.list
  7. RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys C300EE8C
  8. RUN apt-get update
  9. RUN apt-get install -y nginx
  10. RUN echo "daemon off;" >> /etc/nginx/nginx.conf
  11. EXPOSE 80
  12. CMD nginx

使用dockerize,则需要在最后的CMD命令中利用dockerize进行封装,利用模板生成应用配置文件,并重定向日志文件输出到标准输出。

首先,创建配置模板文件为default.tmpl,内容是:


  1. server {
  2. listen 80 default_server;
  3. listen [::]:80 default_server ipv6only=on;
  4. root /usr/share/nginx/html;
  5. index index.html index.htm;
  6. # Make site accessible from http://localhost/
  7. server_name localhost;
  8. location / {
  9. access_log off;
  10. proxy_pass {{ .Env.PROXY_URL }};
  11. proxy_set_header X-Real-IP $remote_addr;
  12. proxy_set_header Host $host;
  13. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  14. }
  15. }

该模板将接收来自环境变量PROXY_URL的值。

编辑新的Dockerfile内容为:


  1. FROM ubuntu:14.04
  2. # Install Nginx.
  3. RUN echo "deb http://ppa.launchpad.net/nginx/stable/ubuntu trusty main" >
  4. /etc/apt/sources.list.d/nginx-stable-trusty.list
  5. RUN echo "deb-src http://ppa.launchpad.net/nginx/stable/ubuntu trusty main" >>
  6. /etc/apt/sources.list.d/nginx-stable-trusty.list
  7. RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys C300EE8C
  8. RUN apt-get update
  9. RUN apt-get install -y wget nginx
  10. RUN echo "daemon off;" >> /etc/nginx/nginx.conf
  11. RUN wget https://github.com/jwilder/dockerize/releases/download/v0.0.1
  12. /dockerize-linux-amd64-v0.0.1.tar.gz
  13. RUN tar -C /usr/local/bin -xvzf dockerize-linux-amd64-v0.0.1.tar.gz
  14. ADD default.tmpl /etc/nginx/sites-available/default.tmpl
  15. EXPOSE 80
  16. CMD dockerize -template /etc/nginx/sites-available/default.tmpl:/etc/nginx
  17. /sites-available/default -stdout /var/log/nginx/access.log -stderr /var/log
  18. /nginx/error.log nginx

最后的CMD命令中利用-template参数指定了配置模板位置,以及生成的配置文件的位置。

创建镜像后,通过如下的方式启动一个容器,整个过程无需手动添加Nginx的配置文件,并且日志重定向到了标准输出。


  1. $ docker run -p 80:80 -e PROXY_URL="http://jasonwilder.com" --name nginx -d nginx

28.9.4 Unikernel

轻量级的精简内核技术,项目地址为http://www.unikernel.org

不同于传统的支持多用户多应用的操作系统内核,Unikernel技术的目的是为运行的应用编译链接进入所需要的操作系统函数,形成一个单独的编译映像,内核只提供单一地址空间。无需其他无关的软件,这个映像就可以运行在虚拟机中。

Unikernel特点包括:单一镜像、安全、超轻量级和快速启动。

不同于容器的共享操作系统内核,Unikernel是精简内核,每个应用实际上仍然运行在各自的超轻量级虚拟机中。

比较流行的Unikernel系统包括:

·ClickOS:NEC提出的专门为网络应用优化的系统,支持C、C++和Python;

·Clive:面向云环境的精简操作系统,基于Golang实现;

·HaLVM:早期Unikernels系统之一,基于Haskell语言实现;

·LING:早期Unikernels系统之一,基于Erlang语言实现;

·MirageOS:早期Unikernels系统之一,基于Ocaml语言实现;

·OSv:基于Java,支持绝大多数JAR文件部署和运行。

·Rumprun:基于NetBSD项目,专注于符合POSIX标准的、不需要Fork的应用程序,方便将现有Linux程序移植到Unikernel上;

·runtime.js:基于Javascript v8引擎的操作系统,支持JavaScript应用。

目前,专注于Unikernel技术的Unikernel Systems公司已被Docker公司收购,作为对容器技术未来方向的探索和补充。

28.9.5 容器化的虚拟机

不少企业应用仍运行在传统的虚拟机中,这些应用希望吸收容器高性能、便捷的优势,也不想放弃虚拟机安全的特点。因此,出现了一些开源项目试图让虚拟机的hypervisor来支持容器格式,代表性的项目有Hyper。Hyper项目的官方网站为https://www.hyper.sh/

Hyper项目试图让容器用户仍然像使用容器一样来操作Hyper容器。只不过Hyper容器不同于传统的容器,它带有精简的操作系统内核。因此,从核心上说它是一个轻量级的虚拟机镜像,可以直接跑在hypervisor上,但是借鉴了来自容器的优秀设计,提供十分快速的体验。