Docker入门笔记

栏目: 编程工具 · 发布时间: 5年前

内容简介:现在,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可以看做是虚拟化技术的一次普及,让之前大家少用的虚拟化变得更加的平民化,但本质上并没有太多的新内容。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

家事的撫慰(下冊)

家事的撫慰(下冊)

Cheryl Mendelson / 甘錫安 / 大家出版社 / 2014-1-28 / NT$520

家事界暢銷參考書籍 各大媒體一致盛讚 亞馬遜讀者四星半高度評鑑 誠品、博客來、香港誠品 三選書 家務界經典暢銷書│各大媒體一致盛讚│讀者四星半高度評鑑 「這個世代最重要的家事著作!」──《大西洋月刊》 恢復家務打理者應有的地位,賦予應有的尊嚴和價值。 以生理的勞動、心力的投入,以及正確的持家知識,換得情感上的溫暖與安全。 .家裡空氣有異味,用香味來......一起来看看 《家事的撫慰(下冊)》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具