Docker 简要介绍

Docker现在并不是什么新技术了,我两年前就听说过Docker,后来陆陆续续总能听到有关Docker的信息。那么Docker到底是什么呢?

Docker一开始只是一个叫doCloud的公司的内部项目,2013年年初它被开源了,之后就成为了一个非常火热的技术名词。目前Docker的定义是:一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

不管定义如何,任何技术能够广泛进入大家的视野,它肯定解决了一个大家都关心的问题,Docker也不例外,那么Docker解决了什么问题呢?总结起来就是解决了软件部署交付与持续集成的问题。开发软件的同学都知道,软件在开发时与实际部署时环境往往是不同的。开发时所依赖软硬件环境一般是公司提供的,实际部署时所依赖软硬件环境通常是客户提供的。因此我们经常能够看到这样的场景,程序在我这边跑的好好的,怎么到了客户那边就出问题了。其中的原因多种多样,可能是客户那边缺少某个依赖项,如某个动态链接库等,可能是配置文件忘记写了......

再举两个更明显的我们经常能够碰得到的例子,如果你安装了一个用java编写的游戏程序,那么肯定要安装一个java虚拟机,才能正常运行这个游戏。或者你安装了某个基于.net开发的客户端,那么安装时肯定会提醒你先安装.net库。单机软件尚且如此,那么网上运行的复杂的服务软件更加可想而知了。

虚拟机也能解决上述的软件部署时的环境依赖问题。因此Docker经常会被拿来与虚拟机做对比。经常能够听到的虚拟机有VMware、Virtualbox、Parallels。但虚拟机有一个缺点,就是启动非常的慢,也很占用物理主机的内存。而Docker启动速度非常快,并且内存占用率很低。同样是虚拟技术,为什么Docker就快?因为Docker与传统虚拟机的架构不同,它不用虚拟Hypervisor层,我简单的理解就是虚拟硬件层,以及不用虚拟出整个操作系统即GuestOS。

blog_图片1.pngblog_图片2.png

相信用过虚拟机的同学看过上图应该能明白它们之间的区别。

Docker的另外一个优势是对层级镜像的创新应用,即不同的容器可以共享底层的只读镜像,通过写入自己特有的内容后添加新的镜像层,新增的镜像层和下层的镜像一起又可以作为基础镜像被更上层的镜像使用。因此Docker非常的省磁盘空间。

这个怎么理解呢,Docker是基于容器技术的虚拟化技术。在创建容器时首先要拉取相应的镜像文件,通过镜像我们可以创建相应的容器。然后在容器中运行一些我们需要的程序。我们假设现在拉取了一个 CentOS的镜像文件image1。通过这个镜像我们创一个容器container1,当然同一个镜像可以创建多个容器。现在container1中只是操作系统CentOS,如果我们需要安装一个服务器nginx,那么只需要进入container1执行命令yum install nginx,再通过这个container1生成新的镜像image2。image1:CentOS,image2:CentOS+nginx。比较imag1和image2,只是2中多了nginx应用程序。那么一般我们会认为Docker中有两份CentOS吧。实际上Docker中只有一份CentOS,多的nginx会以层级镜像的方式保存。这非常像git的diff。

总之,在软件的可持续集成方面,Docker有很多优点。感兴趣的同学可以通过官网多了解一下。

下面我来演示一下Docker的基本用法,Docker的安装和使用有一些前提条件,主要体现在体系架构和内核的支持上。Docker刚开始出来时是不支持Windows系统的,现在也支持了。因此在安装Docker时可以到官网上看一下最新的支持情况。一般Linux的主流发行版肯定是支持的。我们来看一下Ubuntu系统上Docker的使用方法。

1.安装Docker

   $ sudo apt-get install docker.io

2.查找镜像

   $ docker search 镜像名

 如:docker search centos

docker-search.png

3.拉取镜像到本地

  $ docker pull  name:tag

  其中的name就是镜像名,tag是给这个拉取到本地的镜像加标签(tag可以不写,默认是latest,那么命令就可以简化为 docker pull name)

  我拉取了一个centos的镜像  $ docker pull centos

4.查看镜像

  $ docker images

docker-images.png

centos的tag默认的就是latest,4周前拉取的

5.查看容器

  查看所有的容器

  $ docker ps -a  

  查看正在运行的容器

  $  docker ps -s 或者  $ docker ps 

docker-ps-a.png

这里有3个容器,只有最后一个叫mona的是运行中的,其它两个的状态都是Exited的

6.创建一个容器

  $ docker run -i -t 镜像名字  bash

  如docker run  -i -t centos  bash,创建了一个名为distracted_wilson的容器

docker-run.png

其中的mona是以前就存在的容器,容器名distracted_wilson与mona一样是自动生成的。

7. 启动原来已经存在的容器

$ docker start 容器名

如docker start mona

docker-start-1.png

8. 进入一个启动的容器

$ docker attach 容器名

如docker attach mona

docker-attach.png