Some questions about docker

这里主要记录一下在我学习docker的过程中给我造成困惑的问题以及最后我的理解。所以下面的内容很有可能有错误。

关于docker的学习,我主要参考的是docker官网上的文档。对于初学者来说,已经足够。

最后感叹一句,看英文文档真的很折磨,并且学习的过程当中某一节、某一段都有可能反反复复看好几遍。

Any way,坚持。

Questions 1: Container和image到底是什么关系?

首先,container是个docker之前就已经有的概念。从字面意思上理解,它是“箱子”的意思。那么我们就可以想象,它是放在“computer”里的一个箱子,这个箱子里可以装一些我们需要的东西,并且与箱子外部有一定的隔离作用。同样具有箱子作用的还有virtual machine。Docker官网中也对docker和vm做了比较。所以container就是为开发的程序提供了一个可供运行的环境。它是相对独立的。

Image翻译成中文是“镜像”。官网上对image的解释是:

  • An image is a read-only template with instructions for creating a Docker container

首先我们可以理解的是,image是制作container的模板,没有image就不可能有container。这类似于面向对象编程中的类与对象的关系。可是我还是迷惑,到底image是什么样的结构,它由什么组成呢?既然container“继承”了image的特性,它又有什么样的结构呢?于是我通过网络,得到以下答案:

  • Docker镜像是由多个文件系统(只读层)叠加而成。当我们启动一个容器的时候,Docker会加载只读镜像层并在其上(译者注:镜像栈顶部)添加一个读写层。如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏。当删除Docker容器,并通过该镜像重新启动时,之前的更改将会丢失。在Docker中,只读层及在顶部的读写层的组合被称为Union File System(联合文件系统)。

综上所述,image是一个分层的文件系统,并且每一层都是只读的。但是contain是可以读写的。

Questions 2: Container, image, daemon, service, swarms, stack, docker machine, docker compose之间各自有什么联系?

Container和image的关系第一个问题已经解释了。Daemon就是docker的后端守护程序,是docker的server端。一般来说一台机器都会只安装一个版本的docker,那么这一个docker里面就只有一个daemon。一台机器上所有的container和image都由它控制。

如果一个程序只需要在一个container里面启动就可以运行,那么以上的几个概念了解了就足够了。但是如果开发的是一个分布式的应用程序,它就需要几个独立的运行环境。那么既然是不同的运行环境,一个container是不够的。Services,stacks和swarms就是用来解决开发分布式应用程序的问题的。

在docker里,如果要部署一个分布式的应用程序,也就意味着需要不同的image来创建不同的container,那么就需要用到docker-compose.yml这样的一个文件。这个文件有什么作用呢?在这个文件里,可以定义不同的"service",这些不同的service就代表着分布式系统的每一个独立的部分。一个service对应到docker里面又具体是什么呢?其实它的本质上就是由一个image创建出来的一个或多个container。并且每一个service只能包含一个image,但是这一个image可以运行多个container。在每一个service里除了定义image和container的个数,还可以对端口进行映射。所以综上所述,一个service就是多个container,那么一个stack就是多个service

接下来说swarms。前面都没有提到我们有多少host,也就是我们部署的环境是在一台机器上还是多台机器上。不管是什么样的应用程序,理论上来说应该完全可以部署在一台机器上。可是docker也提供了一种可能,使得应用程序可以部署在多个主机上,这些主机可以是物理上的主机,也可以是虚拟的,或者是在云上的。所以swarms和service,stack,container没有直接的关系,它只是用来管理container在不同的机器上运行的。

前面说的都是docker里的一些概念。Docker machine和docker compose其实是一种工具。只有安装了docker compose,才可以定义docker-compose.yml文件去部署应用。只有安装了docker machine,才可以把应用部署到不同的机器上。如果只安装了docker,是不具备这些功能的。

GOOD LUCK TO EVERYBODY

THANKS

猜你喜欢

转载自blog.csdn.net/isFiyeheart/article/details/81129563