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同时提供共有的镜像存储和私有的镜像存储,共有的镜像可以忍任何人搜索和下载,私有仓库只能被你搜索,私有的当然是要收钱滴.....
先简单的安装一下,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下的安装方法。下一篇讲解初步使用。