逐步了解Docker。为初学者准备的教程资源库

2020-06-22 09:34:35

这只是一个简单的演示,让您逐步了解docker在工作时是如何工作的。我就是这样学码头的,为了解决我在学习过程中遇到的一些问题,做了这个回忆录,希望能对其他初学者有所帮助。希望你喜欢学习。如果你喜欢,请在gihub上给它一个⭐,并支持我的工作。

重要提示:-看了自述文件的大小,你可能会有不同的想法,但老实说,如果你从一开始就工作,你就不会遇到任何问题,也不会在这个过程中学到东西。

是一组平台即服务(PaaS)产品,它使用操作系统级虚拟化在称为容器的包中交付软件。容器彼此隔离,并捆绑它们自己的软件、库和配置文件;它们可以通过定义良好的通道相互通信。所有容器都由单个操作系统内核运行,因此使用的资源比虚拟机少。

见鬼,真是夸大其词!!.。在通俗易懂的语言中,Docker帮助您以更简单的方式在沙箱(称为容器)中部署您的应用程序,以便在主机操作系统(即Mac)上运行。docker的主要优点是,它允许您将软件及其所有依赖项打包到单个标准化单元中。

容器是一种解决方案,用于解决如何使软件在从一个计算环境迁移到另一个计算环境时无任何问题地运行。这可能是从过渡环境进入生产环境,也可能是从笔记本电脑到安装了另一个操作系统的不同笔记本电脑。

容器提供了一种逻辑打包机制,在该机制中可以将应用程序从它们实际运行的环境中抽象出来。主要区别在于,不是每个容器都需要自己的成熟操作系统。事实上,单个主机上的所有容器共享单个操作系统。这有助于释放大量的系统资源,如CPU、RAM。

Docker从Docker运行hello-worldHello。此消息表明您的安装似乎工作正常.。

Dockerfile是一个文本文档,其中包含您可以在命令行上调用以生成图像的所有命令。创建文件hello.js并将此代码复制到其中。在这里,我们基本上编写了简单的JS代码来在localhost:8888上显示Hello World。

var http=Required(";http";);http.createServer(function(request,response){response.writeHead(200,{';Content-Type';:';Text/Plain';});response.end(';Hello World\n';;}).listen(8888);//控制台将打印messageconsole.log(';在http://127.0.0.1:8888/';上运行的服务器);

即使这是您见过的第一个Dockerfile,我也要说您可以很好地猜测这里发生了什么。Dockerfile指令是from、env、label、run、add、expose和entrypoint;它们是大写的,但这是惯例,而不是要求。

从高层次上讲,此Dockerfile提供如下指令:从节点映像开始,添加“[email protected]”作为维护程序,运行npm install以安装依赖项,复制应用程序代码中的文件,记录应用程序的网络端口,并将hello.js设置为要运行的默认应用程序。

现在,我们将在本地计算机中创建停靠站映像。在当前项目的文件夹中打开您的终端并运行。

在这里,您将告诉Docker基于当前目录的内容构建一个名为HelloWorld的映像(请注意点(.)。在构建命令的末尾)。Docker将在目录中查找Dockerfile,并根据文件中的说明构建镜像。

构建停靠机映像后,下一步将运行该映像,并查看它是否实际工作:

我们刚刚运行的命令将端口8888用于容器内的服务器,并在端口8888上向外部公开了这一点。转到端口为8888的URL:

Docker镜像类似于虚拟机模板,用于启动容器。在引擎盖下,它们由一个或多个只读层组成,当它们堆叠在一起时,就构成了整个图像。Docker负责堆叠这些层,并将它们表示为单个统一对象。注意:Docker镜像是不可变的,即Docker镜像永远不能更改。一旦创建了一个,您可以将其删除,但不能对其进行修改。

Docker映像包含您打包的所有文件,这些文件将成为容器的文件系统-它还包含大量关于映像本身的元数据。这包括映像是如何构建的简短历史。您可以使用它来查看图像的每一层,以及构建该层的命令。您可以使用以下命令查看HelloWorld映像的历史记录:

Docker映像历史HelloWorld映像由COMMENTcb84eb33ca20在58秒前创建/bin/sh-c#(Nop)入口点[";node";";hello…。7d652a817a9f 58秒前/bin/sh-c#(Nop)expos8888 334575e947c9 59秒前/bin/sh-c#(Nop)添加文件:b9606ef53b832e66e…。

创建者命令是Dockerfile指令-存在一对一的关系,因此Dockerfile中的每一行都创建一个图像层。

现在您已登录,可以将映像推送到您自己的帐户或您有权访问的任何组织。如果您不是任何组织的成员,则只能将映像推送到您自己帐户中的存储库。

我们构建了一个名为HelloWorld的Docker映像。该映像引用没有帐户名,因此我们不能将其推送到任何注册表。我们不需要重新构建映像来给它一个新的引用,但是,映像可以有多个引用。按如下方式标记您的图像:

现在,我们的帐户名称中有一个带有Docker ID的图像引用,并且我们登录到了Docker Hub,因此我们准备好共享我们的图像了!docker image ush命令是Pull命令的对应命令,它将我们的本地图像层上传到注册表:

我们可以将任何字符串放入Docker图像标记中,正如我们已经看到的,同一图像可以有多个标记。我们将利用这一点在我们的映像中对软件进行版本控制,让用户在知情的情况下选择他们想要使用的内容,并在我们使用其他人的映像时做出我们自己的明智选择。

许多软件项目使用带有小数点的数字版本控制方案来指示版本之间的变化有多大,您可以使用图像标记来遵循这一点。基本思想类似于[主要].[次要].[补丁],它有一些隐含的保证。仅增加补丁程序编号的版本可能有错误修复,但应具有与上一版本相同的功能;增加次要版本的版本可能会添加功能,但不应删除任何功能;主要版本可能具有完全不同的功能。

大多数应用程序不能在单个组件中运行。即使是大型的旧应用程序通常也构建为前端和后端组件,这是在物理分布的组件中运行的独立逻辑层。Docker非常适合运行分布式应用程序-从n层单块到现代微服务。每个组件都运行在自己的轻量级容器中,Docker使用标准网络协议将它们连接在一起。您可以使用Docker Compose定义和管理这样的多容器应用程序。Docker Compose是一个定义和运行多容器Docker应用程序的工具。使用Compose,您可以使用YAML文件来配置应用程序的服务。然后,只需使用一个命令,我们就可以从您的配置中创建并启动所有服务。

Docker合成文件描述了您的应用程序的所需状态-当一切都在运行时,它应该是什么样子。它是一种简单的文件格式,您可以在其中捕获要放入坞站容器中的所有选项,并将命令运行到合成文件中。然后使用Docker Compose工具运行该应用程序。它计算出它需要哪些Docker资源-可以是容器、网络或卷-并向Docker API发送创建它们的请求。组成的YAML文件的默认名称是docker-compose.yml。但是,我们可以使用-f标志指定自定义文件名。

下面的代码显示了一个非常简单的Docker合成文件,该文件定义了一个带有两个服务(web-front和redis)的小Flask应用程序。这个应用程序是一个简单的网络服务器,可以统计访问量并将值存储在Redis中。

版本:";3.5";服务:Web-前端:Build:。命令:Python app.py端口:-target:8888发布:8888网络:-Counter-Net Volumes:-type:卷源:Counter-VOL目标:/code redis:image:";redis:alpine&34;Networks:Counter-Net:Networks:Counter-Net:Volumes:Counter-VOL:

版本密钥是必需的,它应该始终位于文件的第一行。这解释了合成文件格式的版本(基本上是API)。

顶级服务键是我们定义不同应用程序服务的地方。我们使用的示例定义了两个服务;一个称为web前端的web前端,以及一个称为redis的内存数据库。Compose将把这些服务中的每一个部署为自己的容器。

顶级网络密钥告诉Docker创建新网络。默认情况下,Compose将创建网桥网络。这些是单主机网络,只能连接同一主机上的容器。

构建:。这会告诉Docker使用当前目录(.)下的Dockerfile中的指令构建新镜像。新构建的映像将用于创建此服务的容器。

命令:Python app.py这告诉Docker运行一个名为app.py的Python应用程序作为容器中的主应用程序。图像中必须存在app.py文件,并且图像必须包含Python。Dockerfile可以满足这两个要求。

ports:告诉Docker将容器内的端口5000(-target)映射到宿主机上的端口5000(已发布)。这意味着在端口5000上发送到Docker主机的流量将定向到容器上的端口5000。容器内的应用程序侦听端口5000。

网络:告诉Docker将服务的容器附加到哪个网络。网络应该已经存在,或者在网络顶级密钥中定义。如果它是一个覆盖网络,它将需要有Attachable标志,以便可以附加独立容器(Compose部署独立容器,而不是Docker Services)。

卷:告诉Docker将计数器卷(source:)挂载到容器内的/code(‘target:’)。计数器VOL卷需要已经存在,或在文件底部的卷顶级密钥中定义。

我们将部署上一节合成文件中定义的应用程序。为此,您需要来自https://github.com/championshuttler/counter-app:的以下4个文件。

让我们使用Compose来打开应用程序。您必须从Counter-app目录中运行以下所有命令:

应用程序需要几秒钟才能启动,并且输出可能非常冗长。

成功部署应用程序后,您可以将Web浏览器指向端口5000上的Docker主机,然后查看该应用程序的全部功能。

你是觉得教程一团糟,还是觉得好玩,学到了什么?把你的想法直接发给我,或者只是制造一个问题。也可以在推特上找我,有什么疑问可以随时问我。

我非常想听听您使用本教程的经验。希望你喜欢学习。如果你喜欢,请在gihub上给它一个⭐,并支持我的工作。