docker之学习笔记
1、 docker的最初是为了解决什么问题的?
Docker的出现是来起源于paas项目dotCloud。pass项目的主要定位就是为软件开发提供相关的配套设施:语言环境,运行环境和存储环境。当dotCloud把基于LXC及GO语言开发的Pass平台做的极致的时候,理论上dotCloud已经不受环境限制了。后台迫于某些方面的压力,dotCloud团队将其核心引擎开源(成为docker),受到广大开发人员的追捧。
有以上可知,由于pass项目的目的就是为软件开发环境提供相关的配套设施:语言环境,运行环境以及存储环境。所以docker的特点也就比较明确了: Docker宣称,开发人员可以将笔记本上的编译,测试,打包其应用及依赖到可移植容器中,然后可以任意发布到任意服务中,并在生产环境部署。Docker是一个开源的引擎,可以为任何应用创建一个轻量级的,可以移植的,自给自足的容器。
而容器是完全沙箱机制,相互之间不会有任何接口,有点类似IOS中独立的APPs.
2、 了解一下docker实现其功能的立足之本?
我们首先理解下什么是容器。理解容器这一基本概念的时候我们首先要理解容器的另一基本概念:命名空间(namespace)(表示标识符(identifier)的上下文(context)。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其它命名空间中)。了解了命名空间之后,我们再详细了解一下容器。容器就是新的进程。类似于Docker和Rkt这样的工具被开发出来以后使得我们能系统化地使用这些特性。 这些工具提供了打包的功能,将一个命名空间打包成一个容器,使得我们可以很方便的将它搬到另一台机器上运行,不出意外的它会跟之前完全一致的方式继续运行,因为它本身的隔离特性。事实上,通常可以很容易的将容器想象为可以完全独立的运行的小计算机. 因为这些新的工具非常易用,它们渐渐成为一种流行的构建软件方式。
容器中的进程。在这里,一个进程仅仅能够与所在同一个容器里面的其他进程和资源交互。
Docker在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。
3、识一下Docker的基本组成概念?
Docker包括三个基本概念
- 镜像(Image)
- 容器(Container)
- 仓库(Repository)
理解了这三个概念,就理解了Docker 的整个生命周期。
a)、镜像(Image)
镜像是一个文件系统,类似于linux中的root文件系统。除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。
b)、容器 (container)
镜像(Image
)和容器(Container
)的关系,就像是面向对象程序设计中的 类
和 实例
一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为容器存储层。如果Docker容器需要写底层Docker镜像中的文件,那么此时就会涉及一个叫Copy-on-Write的机制,即aufs等联合文件系统保证:首先将此文件从Docker镜像层中拷贝至最上层的可读写层,然后容器进程再对读写层中的副本进行写操纵。对于容器进程来讲,它只能看到最上层的文件。
c)、仓库 (DockerRegistry)
镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,DockerRegistry 就是这样的服务。
一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。以 Ubuntu 镜像 为例,ubuntu 是仓库的名字,其内包含有不同的版本标签,如,14.04, 16.04。我们可以通过 ubuntu:14.04,或者 ubuntu:16.04 来具体指定所需哪个版本的镜像。如果忽略了标签,比如 ubuntu,那将视为 ubuntu:latest。
文章参考:
https://github.com/bingohuang/play-docker-images
https://github.com/yeasy/docker_practice/blob/master/SUMMARY.md