docker
- 容器
- docker简介
- docker、虚拟环境与虚拟机
- docker 的核心概念
- Docker 镜像
- Docker 仓库
- Docker容器
- 镜像、容器、仓库,三者之间的联系
容器
容器一词的英文是container,其实container还有集装箱的意思,集装箱绝对是商业史上了不起的一项发明,大大降低了海洋贸易运输成本。让我们来看看集装箱的好处:
- 集装箱之间相互隔离
- 长期反复使用
- 快速装载和卸载
- 规格标准,在港口和船上都可以摆放
回到软件中的容器,其实容器和集装箱在概念上是很相似的。
现代软件开发的一大目的就是隔离,应用程序在运行时相互独立互不干扰,这种隔离实现起来是很不容易的,其中一种解决方案就是上面提到的虚拟机技术,通过将应用程序部署在不同的虚拟机中从而实现隔离。
docker简介
先谈谈运输时我们用到的集装箱是如何产生的。当时,各种各样的散货通过海运进行运输,而困扰托运人和承运人的问题是由于大小、样式以及质量不同的商品放在一起容易出现挤压、破损等不良现象,例如将一批钢材和一把香蕉压在一起等。此外,不同运输方式之间的转运也相当麻烦。不同商品和不同运输手段的结合组成了一个巨大的二维矩阵,最终在美国海陆运输公司的推动下,海运界制定了国际标准集装箱来解决这个棘手的问题,如图10.2所示。
同样的问题也出现在互联网行业,在软件应用开发过程中,需要有一种东西能够像集装箱一样方便地打包应用程序,隔离它们之间的不良影响,使应用能够在各种运行环境下运行并且在平台之间易于移植。如图10.3所示, Docker的初衷就是将各种应用程序和它们所依赖的运行环境打包成标准的容器,进而发布到不同的平台上运行。
Docker是一个开源项目,诞生于2013年初,最初是dotCloud公司内部的一个业余项目。它基于Google公司推出的Go语言实现。
Docker的基础是Linux容器(Linux Containers,LXC)技术, Docker是一种实现轻量级的操作系统虚拟化解决方案。在LXC的基础上Docker进行了进一步的封装,让用户不需要去关心容器的原理,使得操作更为简便。使得用户操作Docker容器就想操作一个快速轻量级别的虚拟机一样简单。
docker、虚拟环境与虚拟机
- 首先虚拟环境特指的是Python 的虚拟环境是方便与在Python下的环境的配置问题,方便不同Python环境下项目的执行。类似于专门化的一个docker的一个容器。
- 虚拟机:传统的虚拟机需要模拟整台机器包括硬件,每台虚拟机都需要有⾃⼰的操作系统,虚拟机⼀旦被开启,预分配给他的资源将全部被占⽤。每⼀个虚拟机包括应⽤,必要的⼆进制和库,以及⼀个完整的⽤户操作系统。像我平常用的VMware就属于虚拟机操作软件。
- Docker是一种容器技术。
容器技术是和我们的宿主机共享硬件资源及操作系统可以实现资源的动态分配。容器包含应⽤和其所有的依赖包,但是与其他容器共享内核。容器在宿主机操作系统中,在⽤户空间以分离的进程运⾏。 - 容器与虚拟机的对比
docker 的核心概念
Docker是一个C/S类型的架构。一般来说,用户通过client端进行相应操作,然后对应操作指令会传递到server端,然后交由server端的Docker daemon处理。
Docker包括三个核心组件:镜像、容器和仓库。
Docker 镜像
- Docker镜像是Docker容器运行时的只读模板,它保存着容器需要的环境和应用的执行代码,可以把镜像看成容器的代码,当代码运行起来后就变成了容器。
每一个镜像都是由一系列的层(layers)组成。docker的镜像机制是有层次感的,一个镜像可以放到另一个镜像的顶部。位于下端的为父镜像,以此类推;最底部的镜像可称为基础镜像。最后从一个镜像启动容器时,docker会在镜像的最顶层加载一个读写的文件系统,我们想在docker上运行的程序就是在这个读写层中执行的。如下图:
当我们启动容器之后,我们接触的是最顶层的可写容器,最顶层的镜像以处于他下发层的镜像迭代构建而成。接下来引出docker镜像的另一个特性,写时复制:
- 写时复制
还是看上边的图,刚开始运行的时候可写容器与顶层的镜像内容是完全一致的;当我对内容进行修改的时候,文件会从下一层的镜像(只读层)复制到顶层的可写容器(读写层),只读层的文件依然存在,但是会被读写层的文件所隐藏;在容器中所做的所有操作,都不会影响底层的原有数据,除非你把他打包成一个新的镜像。(但是在虚拟机上,如果改变了一个docker镜像,那么需要替换原先的整个镜像或者重新建立镜像)
Docker 仓库
Docker仓库用来保存镜像,可以理解为代码控制中的代码仓库,是Docker集中存放镜像文件的场所。
通常,一个用户可以建立多个仓库来保存自己的镜像。从这里可以看出仓库是注册服务器(Registry)的一部分,一个个的仓库组成了一个注册服务器。简单来说, Docker仓库的概念跟Git类似,注册服务器可以理解为GitHub这样的托管服务。
Docker仓库有公有和私有的概念。其中公共的仓库如Docker官方的Docker Hub。Docker Hub提供了庞大的镜像集合供使用,这些镜像可以是自己创建的,还可以是在别人的镜像基础上创建国内的公开仓库(包括Docker Pool等),能提供稳定的国内访问。如果用户不希望公开分享自己的镜像文件, Docker也支持用户在本地网络内创建一个只能自己访问的私有仓库。
在用户创建了自己的镜像之后就可以使用push命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上pull下来就可以了。
Docker容器
Docker容器和文件夹类似,一个Docker容器包含了某个应用运行所需要的所有环境。相对于静态的镜像而言,容器是镜像执行的动态表现。每一个Docker容器都是从Docker镜像创建的。Docker容器可以运行、开始、停止、移动和删除。每一个Docker容器都是独立和安全的应用平台, Docker容器是Docker的运行部分。
容器易于交互、便于传输、易移植、易扩展,非常适合进行软件开发、软件测试以及软件产品的部署。