1.摘要
本文是辉哥Docker入门的一些摘要和资源分享,涉及DOCKER入门,框架原理,镜像制做和资源列表等内容。作为自己学习的备忘docker是什么通俗易懂,也分享给有须要的朋友了。
2.内容2.1Docker的定义和优势
Docker属于Linux容器的一种封装,提供简单易用的容器使用插口。它是目前最流行的Linux容器解决方案。
Docker将应用程序与该程序的依赖,打包在一个文件上面。运行这个文件,都会生成一个虚拟容器。程序在这个虚拟容器里运行,就似乎在真实的化学机上运行一样。有了Docker,就不用担忧环境问题。
总体来说docker是什么通俗易懂,Docker的插口相当简单,用户可以便捷地创建和使用容器,把自己的应用倒入容器。容器还可以进行版本管理、复制、分享、修改linux系统命令,犹如管理普通的代码一样。
下边的图片比较了Docker和传统虚拟化形式的不同之处。传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于寄主的内核,容器内没有自己的内核,但是也没有进行硬件虚拟。因而容器要比传统虚拟机更为轻便。
Docker的优势
Docker相比于传统虚拟化形式具有更多的优势:
DOCKERvs传统虚拟机总结:
特点容器虚拟机
启动
秒级
分钟级
硬碟使用
通常为MB
通常为GB
性能
接近原生
弱于
系统支持量
单机支持上千个容器
通常几十个
2.2Docker入门教程
入门一个技术的最好方式就是把手沾湿,做一个最简的实践。
阮一峰的《Docker入门教程》,Docker微服务教程教学文档浅显易懂,跟随实操一把吧。
2.3Docker的基本概念(Image/Container/Repository)
从上图我们可以看见,Docker中包括三个基本的概念:
Image(镜像)
Container(容器)
Repository(库房)
镜像是Docker运行容器的前提,库房是储存镜像的场所,可见镜像更是Docker的核心。
Image(镜像)
这么镜像究竟是哪些呢?Docker镜像可以看作是一个特殊的文件系统,不仅提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时打算的一些配置参数(如匿名卷、环境变量、用户等)。
镜像不包含任何动态数据,其内容在建立以后也不会被改变。镜像(Image)就是一堆只读层(read-onlylayer)的统一视角,其实这个定义有些无法理解,下边的这张图就能帮助读者理解镜像的定义:
从右边我们看见了多个只读层,它们重叠在一起。不仅最下边一层,其他层就会有一个表针指向下一层。这种层是Docker内部的实现细节,而且还能在主机的文件系统上访问到。
统一文件系统(UnionFileSystem)技术才能将不同的层整合成一个文件系统,为那些层提供了一个统一的视角。
这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。我们可以在图片的左边看见这个视角的方式。
Container(容器)
容器(Container)的定义和镜像(Image)几乎一模一样,也是一堆层的统一视角,惟一区别在于容器的最前面那一层是可读可写的。
因为容器的定义并没有提到是否要运行容器,所以实际上,容器=镜像+读写层。
Repository(库房)
Docker库房是集中储存镜像文件的场所。镜像建立完成后,可以很容易的在当前寄主上运行。
然而,假若须要在其他服务器上使用这个镜像linux makefile,我们就须要一个集中的储存、分发镜像的服务,DockerRegistry(库房注册服务器)就是这样的服务。
有时侯会把库房(Repository)和库房注册服务器(Registry)混为一谈,并不严格分辨。
Docker库房的概念跟Git类似,注册服务器可以理解为GitHub这样的托管服务。
实际上,一个DockerRegistry中可以包含多个库房(Repository),每位库房可以包含多个标签(Tag),每位标签对应着一个镜像。
所以说,镜像库房是Docker拿来集中储存镜像文件的地方,类似于我们之前常用的代码库房。
一般,一个库房会包含同一个软件不同版本的镜像,而标签就常用于对应当软件的各个版本。
我们可以通过:的格式来指定具体是这个软件那个版本的镜像。倘若不给出标签,将以Latest作为默认标签。
库房又可以分为两种方式:
DockerRegistry公有库房是开放给用户使用、允许用户管理镜像的Registry服务。
通常这类公开服务容许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。
不仅使用公开服务外,用户还可以在本地搭建私有DockerRegistry。Docker官方提供了DockerRegistry镜像,可以直接使用做为私有Registry服务。
当用户创建了自己的镜像以后就可以使用Push命令将它上传到公有或则私有库房,这样上次在另外一台机器上使用这个镜像时侯,只须要从库房上Pull出来就可以了。
2.4Docker的构架和原理
Docker使用的是C/S结构,即顾客端/服务器体系结构,Docker顾客端和服务端可以运行在一台机器上,我们可以通过RESTful、Stock或网路插口与远程Docker服务端进行通讯。
Docker的核心组件包括:
DockerClient
DockerDaemon
DockerImage
DockerRegistry
DockerContainer
Docker采用的是Client/Server构架。顾客端向服务器发送恳求,服务器负责建立、运行和分发容器。
顾客端和服务器可以运行在同一个Host上,顾客端也可以通过Socket或RESTAPI与远程的服务器通讯。
DockerClient
DockerClient,俗称Docker顾客端。它虽然就是Docker提供命令行界面(CLI)工具,是许多Docker用户与Docker进行交互的主要方法。
顾客端可以建立,运行和停止应用程序,还可以远程与Docker_Host进行交互。
最常用的Docker顾客端就是Docker命令,我们可以通过Docker命令很便捷地在Host上建立和运行Docker容器。
DockerDaemon
DockerDaemon是服务器组件,以Linux后台服务的形式运行,是Docker最核心的后台进程,我们也把它称为守护进程。
它负责响应来自DockerClient的恳求,之后将这种恳求翻译成系统调用完成容器管理操作。
该进程会在后台启动一个APIServer,负责接收由DockerClient发送的恳求,接收到的恳求将通过DockerDaemon内部的一个路由分发调度,由具体的函数来执行恳求。
我们大致可以将其分为以下三部份:
DockerDaemon的构架如下所示:
DockerDaemon可以觉得是通过DockerServer模块接受DockerClient的恳求,并在Engine中处理恳求,之后按照恳求类型,创建出指定的Job并运行。
DockerDaemon运行在DockerHost上,负责创建、运行、监控容器,建立、存储镜像。
运行过程的作用有以下几种可能:
因为DockerDaemon和DockerClient的启动都是通过可执行文件Docker来完成的,因而三者的启动流程十分相像。
Docker可执行文件运行时,运行代码通过不同的命令行Flag参数,分辨二者,并最终运行三者各自相应的部份。
启动DockerDaemon时,通常可以使用以下命令来完成:
docker --daemon = truedocker –d
docker –d = true
再由Docker的main()函数来解析以上命令的相应Flag参数,并最终完成DockerDaemon的启动。
右图可以很直观地看见DockerDaemon的启动流程:
默认配置下,DockerDaemon只能响应来自本地Host的顾客端恳求。假如要容许远程顾客端恳求,须要在配置文件中打开TCP窃听。
我们可以照着如下步骤进行配置:
1、编辑配置文件/etc/systemd/system/multi-user.target.wants/docker.service,在环境变量ExecStart前面添加-Htcp://0.0.0.0,容许来自任意IP的顾客端联接。
2、重启DockerDaemon:
systemctl daemon-reload
systemctl restart docker.service
3、我们通过以下命令即可实现与远程服务器通讯:
docker -H 服务器IP地址 info
-H是拿来指定服务器主机,info子命令用于查看Docker服务器的信息。
DockerImage
Docker镜像可以看作是一个特殊的文件系统,不仅提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时打算的一些配置参数(如匿名卷、环境变量、用户等)。
镜像不包含任何动态数据,其内容在建立以后也不会被改变。我们可将Docker镜像看成只读模板,通过它可以创建Docker容器。
镜像有多种生成方式:
我们可以将镜像的内容和创建步骤描述在一个文本文件中,这个文件被叫做Dockerfile,通过执行dockerbuild命令可以建立出Docker镜像。
DockerRegistry
DockerRegistry是储存DockerImage的库房,它在Docker生态环境中的位置如右图所示:
运行dockerpush、dockerpull、dockersearch时,实际上是通过DockerDaemon与DockerRegistry通讯。
DockerContainer
Docker容器就是Docker镜像的运行实例,是真正运行项目程序、消耗系统资源、提供服务的地方。
DockerContainer提供了系统硬件环境,我们可以使用DockerImages这种制做好的系统盘,再加上我们所编撰好的项目代码,Run一下就可以提供服务啦。
Docker组件是怎样协作运行容器
见到这儿,我相信诸位读者同学们应当早已对Docker基础构架熟悉的差不多了,我们还记得运行的第一个容器吗?
如今我们再通过hello-world这个事例来感受一下Docker各个组件是怎样协作的。
容器启动过程如下:
Docker顾客端执行dockerrun命令。
DockerDaemon发觉本地没有hello-world镜像。
Daemon从DockerHub下载镜像。
下载完成,镜像hello-world被保存到本地。
DockerDaemon启动容器。
具体过程可以看如下这幅演示图:
我们可以通过DockerImages可以查看到hello-world早已下载到本地:
我们可以通过DockerPs或则DockerContainerls显示正在运行的容器,我们可以看见,hello-world在输出提示信息之后才会停止运行,容器手动中止,所以我们在查看的时侯没有发觉有容器在运行。
我们把Docker容器的工作流程分析的非常清楚了,我们大体可以晓得Docker组件协作运行容器可以分为以下几个过程:
Docker顾客端执行dockerrun命令。
DockerDaemon发觉本地没有我们须要的镜像。
Daemon从DockerHub下载镜像。
下载完成后,镜像被保存到本地。
DockerDaemon启动容器。
2.5Docker常用命令
我们可以通过docker-h去查看命令的详尽的帮助文档。在这儿我只会讲一些日常我们可能会用的比较多的一些命令。
具体的命令解读参考《【知识分享】Docker命令大全》。
2.6Dockerfile和Image镜像制做
镜像的订制实际上就是订制每一层所添加的配置、文件。假如我们可以把每一层更改、安装、构建、操作的命令都写入一个脚本,用这个脚本来建立、定制镜像,这么之前提及的难以重复的问题、镜像建立透明性的问题、体积的问题就就会解决。这个脚本就是Dockerfile。
Dockerfile是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令建立一层,因而每一条指令的内容,就是描述该层应该怎么完善。
我们可以通过下边这幅图来直观地体会下Docker镜像、容器和Dockerfile两者之间的关系:
我们从上图中可以见到,Dockerfile可以自定义镜像,通过Docker命令去运行镜像,进而达到启动容器的目的。Dockerfile是由一行行命令句子组成,而且支持已#开头的注释行。
通常来说,我们可以将Dockerfile分为四个部份:
以订制nginx镜像为例,此次我们使用Dockerfile来定做。
在一个空白目录中,构建一个文本文件,并命名为Dockerfile:
$ mkdir mynginx
$ cd mynginx
$ touch Dockerfile
其内容为:
FROM nginx
RUN echo 'Hello, Docker!
' > /usr/share/nginx/html/index.html
这个Dockerfile很简单,一共就两行。涉及到了两条指令,FROM和RUN。
Dockerfile常用的指令
更多的指令解释参考《Dockerfile指令解读》,上面包含以下指令说明:
3.参考
(1)Docker入门教程-阮一峰
【点评】简单,易懂,包含实践操作,体验好。
(2)Docker微服务教程-阮一峰
【点评】一个docker微服务wordpress案例,使用docker,DockerCompose实践。
(2)Docker—从入门到实践
【点评】全面,质量高,关于Dockerfile的讲的不错。还涉及Kubernetes,DockerCompose的介绍。
(3)这可能是最为详尽的Docker入门总结
【点评】有好多框架图,适宜了解原理。
(4)Docker从入门到实践-W3CSchool
(5)Docker教程|新手教程