内容简介:现在,Docker应用的应该比较广泛了,虽然在项目中已经全面应用了,但我对这个东西理解还停留在很粗浅的层面,所以这周抽晚上的时间看了下这本书《第一本Docker书-修订版》。从书评上,这本书确然是比较初级的,但对我而言,正合适。我的看法是,如果不是真正遇到了非常特殊的问题,需要深入理解Docker内部的原理,止步于会用也并非不可,毕竟Docker完成的功能并非那么复杂。为什么说这本书非常初级,那是因为它连这里的安装都写的非常多——当然,这并非是我的目的。通过安装,我们可以了解到,Docker是一种C/S架构
序
现在,Docker应用的应该比较广泛了,虽然在项目中已经全面应用了,但我对这个东西理解还停留在很粗浅的层面,所以这周抽晚上的时间看了下这本书《第一本 Docker 书-修订版》。从书评上,这本书确然是比较初级的,但对我而言,正合适。我的看法是,如果不是真正遇到了非常特殊的问题,需要深入理解Docker内部的原理,止步于会用也并非不可,毕竟Docker完成的功能并非那么复杂。
笔记
安装
为什么说这本书非常初级,那是因为它连这里的安装都写的非常多——当然,这并非是我的目的。通过安装,我们可以了解到,Docker是一种C/S架构,守护进程通过socket接收来自客户端的命令。
命令行
由于Docker的流行,让大家接纳了容器的概念,但Docker其实只是对系统提供的隔离技术进行封装,抽象成了容器。本质上还是系统提供的虚拟化技术。这些东西,这本书并没有涉及到,有本书叫做 《Docker容器与容器云》 讲的相对深刻。这本书甚至可以教你实现一个极简化容器。
其实刚开始接触Docker的时候,对镜像和容器的关系总会有些迷惑,熟悉了可能并不觉得这是个问题。我的理解是,镜像等价于硬盘上的可执行文件,容器就是这个可执行文件经过加载变成了运行的进程,而Docker根据镜像创建容器的过程可类比OS加载这个可执行文件的过程。
Docker提供了一系列的命令来操作镜像和容器,比如创建、查看、删除等等。这些东西可以查看docker的 命令行文档 。
镜像
在具体使用时,构建自己的镜像应该是必不可少的。Docker使用Dockerfile来指定如何创建一个镜像。Dockerfile在我的理解中类似构建可执行程序的Makefile,同样都是列出来构建步骤。
一个镜像包含了很多层次,每次Dockerfile中的命令提交就会形成一个新的镜像,直至整个构建文件的所有命令提交才会形成最终的镜像,如果在构建的过程中出现异常,得到的是一个部分成功镜像,也可以以此来创建一个容器。
镜像构建成功后,Docker会为其分配一个镜像ID,可以借由这个ID来管理镜像。
所以,构建容器最重要的东西就是写一个Dockerfile,这里面的东西也很多,可以查看docker的 Dockerfile参考文档 。
当我看这一章的时候,对CMD和ENTRYPOINT的使用有点小不解,从作用上它们都是用来指定容器启动时的执行命令。所以两者有共同的地方,如都可以用exec方式(用[]来包含命令)或者 shell 方式(直接跟命令)来执行。但肯定有不同的地方(不然就不会有两个命令了),CMD很容易在容器启动的时候被重载,但ENTRYPOINT就不容易(当然也有方法),所以CMD通常用来指定默认参数,而ENTRYPOINT用来指定具体的命令,这样当ENTRYPOINT没有指定特殊的参数时,Docker会将CMD中的参数的当作默认值传递到ENTRYPOINT中设置的命令。所以,两者可以共存,而且两者必然要有一个,哪怕是空的也可以。但两者都不支持多个,如果有多个,后者会覆盖前者的内容。
当镜像构建完成之后,可以将其push到某个registry中,公共的registry类似Docker Hub,当然也可以构建自己的私有仓库。这里可以类比为代码写完之后将其上传到github。
实例
这本书中用几个例子讲解了如何在现实中使用Docker,分了几种场景,测试用、运行具体的服务。用的比较多应该是后者,而且更多是以容器集群的方式使用。所以Docker容器之间的联网方式就很关键。
Docker提供了多种联网方式,但比较有意义的可能就是Docker Network方式。
在安装Docker时,会在宿主机上创建一个新的网络接口,docker0。每个Docker容器都会在这个接口上分配一个IP地址。它是一个虚拟的以太网桥,用于连接本地宿主网络和容器。Docker每创建一个容器就会在docker0上创建一个虚拟接口,其中一端作为容器的eth0接口,另一端统一命名为vethecxxx一类的名字。所以,这有点类似于网线的两端直连。当所有的Docker容器都连到这个虚拟的docker0接口上时,它们共同形成了一个子网。
至此,容器就可以通过docker0这个外部虚拟网关跟宿主机通信,完成Docker容器的联网问题——内部容器之间的联网以及对外的互联网访问。
使用docker network create xxx可以创建一个类似docker0的虚拟网络,当有了这个网络后,基于Docker容器的集群才能运作。而这才是容器真正的应用之处。书中举了一个Node程序栈的例子,跟很多场景的使用方式已然差不太多了。
我对这里的联网理解还是比较浅薄的,后续如果有更多的需要再进一步研究吧。
编排
一个真实的项目中,容器是非常多的,所以管理这些容器,包括启动、重启、发现容器提供的服务等等是一件很复杂的问题。解决这一类问题的方式称之为容器的编排。
比较常见的可能是,docker compose。所以,这个并不属于Docker容器的基本内容,只是一种辅助工具——简单说,没有它容器也是可以正常运行的。
但是,有了它会更加的方便管理复杂的容器集群及其之间的关系。
docker compose使用docker-compose.yaml文件来管理这些容器。该文件定义了有哪些容器,以及容器的属性。对了,这里还有一点忘了在上面提及,就是容器的卷。这是又一个比较重要的东西,因为镜像一般都是稳定的,类似于程序本身,但数据并不稳定,而且在容器运行过程中,数据会随时的产生或者消费,这就不能将其放到镜像中。所以就有了卷这个概念,用于为容器提供一个可变数据的存储空间。
一般在compose配置文件中,容器的属性类似这样:
container-name: image: xxxxx command: xxxxx ports: - "xxx:xxx" volumes: - x:xxxx
当然不可能这么简单,可以参考这里的 compose参考文档 。
其他
书里面还提及了其他内容,比如Docker API以及其他编排工具,但我觉得对于我目前的状态并没有太大的意义,所以没有细看。现在看书越来越功利了!
总结
我觉得,docker可以看做是虚拟化技术的一次普及,让之前大家少用的虚拟化变得更加的平民化,但本质上并没有太多的新内容。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Linux内核设计与实现(原书第3版)
Robert Love / 陈莉君、康华 / 机械工业出版社华章公司 / 2011-4-30 / 69.00元
《Linux内核设计与实现(原书第3版)》详细描述了Linux内核的设计与实现。内核代码的编写者、开发者以及程序开发人员都可以通过阅读本书受益,他们可以更好理解操作系统原理,并将其应用在自己的编码中以提高效率和生产率。 《Linux内核设计与实现(原书第3版)》详细描述了Linux内核的主要子系统和特点,包括Linux内核的设计、实现和接口。从理论到实践涵盖了Linux内核的方方面面,可以满......一起来看看 《Linux内核设计与实现(原书第3版)》 这本书的介绍吧!