Docker入门笔记

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

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


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

查看所有标签

猜你喜欢:

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

The Art and Science of CSS

The Art and Science of CSS

Jonathan Snooks、Steve Smith、Jina Bolton、Cameron Adams、David Johnson / SitePoint / March 9, 2007 / $39.95

Want to take your CSS designs to the next level? will show you how to create dozens of CSS-based Website components. You'll discover how to: # Format calendars, menus and table of contents usin......一起来看看 《The Art and Science of CSS》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

MD5 加密
MD5 加密

MD5 加密工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具