Docker基本原理

      Docker 提供了一个可以运行你的应用程序的容器。它原本是 dotCloud 启动的一个业余项目,并在前些时候开源了。它吸引了大量的关注和讨论,导致 dotCloud 把它重命名到 Docker Inc。它最初是用 Go 语言编写的,它就相当于是加在 LXC上的管道,允许开发者在更高层次的概念上工作。

      Docker 扩展了 Linux 容器,或着说 LXC,通过一个高层次的 API 为进程单独提供了一个轻量级的虚拟环境。Docker 利用了 LXC, cgroups 和 Linux 自己的内核。和传统的虚拟机不同的是,一个 Docker 容器并不包含一个单独的操作系统,而是基于已有的基础设施中操作系统提供的功能来运行的。

      Docker 会像一个可移植的容器引擎那样工作。它把应用程序及所有程序的依赖环境打包到一个虚拟容器中,这个虚拟容器可以运行在任何一种 Linux 服务器上。这大大地提高了程序运行的灵活性和可移植性,这是一个lxc VS docker的讨论:lxc vs docker

1  Docker

      docker是一个基于虚拟化框架的容器,它不像传统的虚拟化,docker很快、轻量级且易于使用,docker允许你为一个应用创建一个支持所有依赖关系的容器,每一个容器和其他容器都是隔离的,他们之间并不共享什么信息。

    docker的特色:

    1  容器提供一个沙盒环境,应用可以在里面安全的运行,不需要外部访问

    2  docker的便携性,容器是一个目录,你可以压缩并传输它到其他机器运行

    3  启动迅速,单进程启动一个容器非常快速

    4  docker很容易在系统上运行,不像VMs那么难部署

    5  docker减少了应用程序运行的复杂性。eg:docker run [......]

2   Understanding Docker

      在软件的开发生命周期,创建一个可移植的应用和服务,部署起来不是很容易的。你的代码从开发环境到生产环境迁移总是有各种各样的问题,很难确保这些应用和服务在时间和管理上的一致性。docker就是用来解决这个问题的,docker是轻量级的架构,他在容器里面提供应用的构建和部署。docker提供了一种安全的运行应用的方法,docker允许你同时在你的主机上运行多个容器,它不需要额外的hypervisor,这意味着你可以从硬件上面获取更多的资源。

    docker有三个主要部分:

        1  docker容器

            docker容器像一个目录,一个docker容器包含了一个应用运行所需要的所有依赖,每一个容器都是从docker镜像创建的。docker容器可以运行,启动,停止,迁移,删除等等操作。每一个容器都是安全隔离的。

        2  docker镜像

            docker镜像是一个模板,例如一个ubuntu系统里面安装了apache服务和你的应用程序,这就是一个docker镜像。可以从docker镜像上面创建docker镜像,docker提供了一个简单的方法来创建镜像并更新镜像。

        3  docker注册

            docker注册是保存docker镜像的,你可以上传或者下载你的镜像在公共或者私有的存储上面。这些镜像可以是你自己创建的,也可以使其他人创建的。docker注册可以使你创建简单的或者强大的开发环境、部署工作流。

      docker是一个客户端/服务端工作框架,docker commands和docker daemon。docker daemon利用了一些linux内核和系统的高级功能,例如利用namespaces和cgroups来创建隔离的容器。

      docker的特性:

         1  以用户为中心,并且易于使用

         2  高度的便携性,提供了标准的容器格式

         3  轻量级,docker依赖于操作系统级别的特性来提供隔离盒安全性。

         4  docker可以运行anything,口气真大..........

         5 在多个平台课部署,linux、mac os、win.......

         6 docker的可信性,docker并不仅仅提供一些工具来隔离运行你的应用,还允许你指定容器可以使用哪些资源,mem、cpu......

         7 docker社区,允许你共享你的镜像,你也可以使用别人的镜像

3   Understanding the Technology

      当我们开始了解docker及其技术架构的时候,我们会发现其实docker并没有什么神奇的魔法。一切都是基于linux内核的新功能。docker只是直接使用这些信特性或者基于这些特性提供新功能。除过这些特性外,还有一个主要的特性使得docker非常好,那就是docker自身的架构,docker的主要项目非常轻量级,一些功能尽可能的设计成插件模式。docker的API允许你从你的应用内部访问docker。

4    The Architecture of Docker

      docker是为开发和SA设计的,它用来帮助你构建应用和服务,然后快速有效的部署该应用或者服务从开发环境到生产环境。

        让我们来看看:

        1  docker是客户端/服务端应用

        2  docker客户端和docker daemon都可运行在同一台机器上

        3  你可以用docker客户端连接一个远程docker daemon

        4  你也可以通过RESTful API或者sockets和doacker通讯

        5  用户可以通过客户端命令和daemon进行交互,例如 create、run、stop

        6  docker daemon接受命令,然后执行这些任务,例如run,stop



5  The components of Docker

    1  docker daemon

        正如上图所示,docker daemon运行在一台机器上,用户不和daemon直接交互,而是通过client和daemon交互

    2  docker client

        docker client是主要的用户接口,它接受用户的命令,和后端的docker daemon进行通讯来管理容器

    3  docker index(docker registry)

        docker index是一个全局的docker容器镜像的归档目录,虽然他当前一般大,但是会迅速的增大的。

    总结:
        1  当你安装docker时,所有的组建都必须安装,daemon,client,image registry(public)
        2  你可以把这些组建运行在同一台机器,也可以分布式的运行
        3  你可以从public registry处收益
        4  你可以创建一个私有的储藏室以供私人专用,参考  https://github.com/dotcloud/docker-registry

6  The underlying technology

    一系列的操作系统层面的功能集中在一起提供了docker的功能和容易使用的用户接口,下面主要看看docker用到了哪些主要的功能:

    1  namespaces

        docker使用一个名为namespaces的高级功能来提供隔离workspace的功能。我们叫它container(容器),当你运行iyge容器的时候,docker会为该容器创建一个namespaces,每个容器都有自己的namespace,并且不会访问到容器外面去。docker用到的namespace主要有:

            pid namespace:进程号使用

            net  namespace:管理网络接口使用

            ipc  namespace:进程间通讯使用

            mnt  namespace:管理挂载点使用

            uts  namespace:隔离内核标示符

      2  control  groups

          docker也会用到一个技术叫做cgroups,隔离每个容器的资源使用,cgroups允许docker公平的分配硬件可用的资源,设置容器使用的内存资源等等。

      3  UnionFS

          union filesystems,在创建层需要操作的一个文件系统,它使docker非常轻量级并且快速。docker使用union filesystems为容器提供块存储。

      4  containers 

          docker联合这些组件构建一个容器格式,我们叫做libcontainer,docker也支持传统的容器,比如LXC。

7    How does everything work

     当创建一个容器时发生了什么?让我们来看看:

     1  How does a container work?

         一个容器由操作系统、用户增加的文件和元数据构成,每一个容器都是从docker镜像构建而来,镜像告诉docker当容器启动时里面都有哪些内容、要运行哪些进程,docker镜像是只读的,当docker从镜像运行一个容器时,它会在镜像上面增加一个read-write层(使用UnionFS技术)运行在容器里面。

     2  What happens when you run a container?

         docker client告诉docker daemon运行一个容器,例如:docker run -i -t ubuntu  /bin/bash

         让我们分解一下这个命令,docker client启动使用一个二进制的docker命令,最小的docker client需要你告诉docker daemon你的容器是从哪个docker镜像构建的,你希望在容器内部运行哪个命令。所以启动过程如下:

            1  Pulling the ubuntu image

                docker检查是否存在ubuntu镜像,如果本地不存在ubuntu镜像,则docker会到docker index下载。

            2  Creates a new container

                利用镜像创建容器

            3  Allocates a filesystem and mounts a read-write layer

                为镜像创建文件系统层和read-write层

            4  Allocates a network / bridge interface

                为容器创建网络接口,使容器和本地机器可以通讯

            5  Sets up an IP address

                在地址池中为容器分配一个可用的IP地址

            6  Executes a process that you specify

                 运行你的应用

            7  Captures and provides application output

                连接log的标准输入、输出、错误,以使你直到你的应用是否正常运行

        3  How does a Docker Image work?

            我们知道docker容器是从只读格式的docker镜像模板上面构建出来的,当你启动一个容器,docker会在镜像上面创建read-write层来运行你的应用程序。docker镜像的构建采用简单的描述性步骤,我们称为instructions,Instructions保存在一个称为Dockerfile的文件中,每一个instructions指令利用UnionFS技术在镜像上写一个新的层,以供应用程序使用。所有的镜像都是从基础镜像衍生出来的。

        4  How does a Docker registry work?

            docker registry是用来存储你的docker镜像的,一旦你构建好了一个docker镜像,你就可以把镜像push到Docker Index或者你的私人仓库上面。使用docker client你可以搜索公共的镜像,然后pull他们到你的docker主机上面来构建容器。Docker index同时提供共有的镜像存储和私有的镜像存储,共有的镜像可以忍任何人搜索和下载,私有仓库只能被你搜索,私有的当然是要收钱滴.....


8    Working with Docker and the Dockerfile


      先简单的安装一下,ubuntu14.04:

            ***Note: Docker is still under heavy development! We don’t recommend using it in production yet, but we’re getting closer with each release. 
     安装环境:

        1 docker目前支持ubuntu12.04/13.04/13.10/14/04

        2 docker最好在3.8以上的内核版本运行。因为LXC的BUG,12.04要升级内核,安装AUFS,13.04不用升级内核,AUFS虽然已经支持,但是不是所有的系统都默认开启的。为了确保AUFS已经安装,执行  apt-get install linux-image-extra-`uname -r`

        3 14.04中已经有docker的安装包了,名称为docker.io,版本为0.9.1,建议不要使用ubuntu14.04发行版自带的docker.io,我们使用docker官翻的源,从而可以选择更多的docker版本

echo deb http://get.docker.io/ubuntu docker main  >> /etc/apt/sources.list.d/docker.list
apt-get update
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys D8576A8BA88D21E9
apt-get install lxc-docker
          执行apt-cache search docker试试看:

lxc-docker - Linux container runtime 
lxc-docker-0.10.0 - Linux container runtime
lxc-docker-0.5.3 - lxc-docker is a Linux container runtime
lxc-docker-0.6.0 - lxc-docker is a Linux container runtime
lxc-docker-0.6.1 - lxc-docker is a Linux container runtime
lxc-docker-0.6.2 - lxc-docker is a Linux container runtime
lxc-docker-0.6.3 - lxc-docker is a Linux container runtime
lxc-docker-0.6.4 - lxc-docker is a Linux container runtime
lxc-docker-0.6.5 - lxc-docker is a Linux container runtime
lxc-docker-0.6.6 - lxc-docker is a Linux container runtime
lxc-docker-0.6.7 - Linux container runtime
lxc-docker-0.7.0 - Linux container runtime
lxc-docker-0.7.1 - Linux container runtime
lxc-docker-0.7.2 - Linux container runtime
lxc-docker-0.7.3 - Linux container runtime
lxc-docker-0.7.4 - Linux container runtime
lxc-docker-0.7.5 - Linux container runtime
lxc-docker-0.7.6 - Linux container runtime
lxc-docker-0.8.0 - Linux container runtime
lxc-docker-0.8.1 - Linux container runtime
lxc-docker-0.9.0 - Linux container runtime
lxc-docker-0.9.1 - Linux container runtime

     直接安装最新版:

apt-get install lxc-docker
      开启内存和swap统计

apt-get install cgroup-lite
vi /etc/default/grub
   GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
update-grub
reboot

       docker默认使用网桥管理容器的网络,但是ufw默认阻止了所有的包转发,所以

vi /etc/default/ufw
   DEFAULT_FORWARD_POLICY="DROP" -> DEFAULT_FORWARD_POLICY="ACCEPT"
ufw reload


这篇文章主要学习docker的工作原理和在ubuntu14.04下的安装方法。下一篇讲解初步使用。

转载于:https://my.oschina.net/guol/blog/263736

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值