对于现代开发人员来说,必须知道如何在应用程序开发中使用Container(容器)。近期对Container的需求的一个原因是Docker的出现。Docker不仅增加了Container(容器)的使用,而且对我们进行应用程序开发的方式产生了巨大影响。
如果你还没有阅读到相关的介绍Container(容器)的文章,那么你来对地方了。在本文中,我们将向你介绍Docker的概念,并通过Docker化一个简单的应用程序获得动手学习Docker的方法。首先,让我们说明一下Docker是什么以及为什么它会变得如此重要。
1、什么是Docker?
Docker是开发人员用来通过Container(容器)在隔离环境中创建、部署和运行应用程序的工具。尽管本文已多次使用该术语,但你可能不知道什么是Container(容器)。为了完全理解上述陈述,我们必须首先了解什么是Container(容器)。
2、什么是Container(容器),我们为什么需要它?
Container(容器)是将应用程序代码和应用程序中使用的所有依赖项打包到一个程序包中的软件单元。打包让Container(容器)可以将应用程序与其运行所在的主机环境隔离。应用程序将Container(容器)视为其环境,而不是主机设备。这种抽象保证了在开发环境中运行的应用程序能够在生产环境中运行而无需进行重大更改。即使主机设备上正在运行多个应用程序,Container(容器)也可以将容器化的应用程序与其他应用程序的操作相互干扰并共享其资源。
在使用Container(容器)之前,使用虚拟机将应用程序与主机环境隔离。在虚拟机中,每台计算机使用单独的操作系统来运行应用程序。尽管此方法也达到了隔离应用程序的目的,但它的缺点是在应用程序顶部增加了过多资源。另一方面,Container(容器)共享主机设备的OS内核,而不使用自己的OS,这消除了虚拟机增加的资源。与虚拟机相比,这使Container(容器)更轻便,资源效率更高。
尽管Container在使用Docker之前就已经使用很久了,但是可以肯定地说Docker是Container在现代编程世界中极度普及的最大原因。除了开源之外,Docker的易用性,可靠性和效率使编程世界立即爱上了该技术。
3、什么是Dockerfile,Docker映像和DockerEngine?
Docker带有其特殊的语言。Dockerfile,Docker映像和DockerEngine是Docker用户中常用的三个词。这些也是构建Docker容器时使用的3个最重要的组件。
(1)Docker文件:Dockerfile包含一组构建Docker映像的指令。创建Docker映像时,这些说明将一个接一个地运行。Dockerfile中的指令包含诸如主机设备的OS,应用程序的编程语言,应用程序目录位置,网络端口和环境变量之类的信息。
(2)Docker镜像:Docker映像是用于为应用程序创建最终DockerContainer的模板。我们可以通过以Dockerfile作为参数运行dockerbuild命令来生成应用程序的Docker映像。创建DockerContainer,我们需使用dockerrun命令和Docker映像。
(3)DockerEngine:DockerEngine是运行所有Docker容器的地方。基于Windows和Linux的应用程序都可以在DockerEngine上运行。
4、如何对应用程序简单地进行Docker化
现在,我们进入了本教程最有趣的部分。我们将对一个简单的应用程序进行docker化。首先,我们将创建一个简单的Node.js应用程序,然后创建Dockerfile,Docker映像,最后创建该应用程序的Docker容器。但是,在此之前,请确保已在设备上安装了Docker。你可以按照官方文档在Windows或UbuntuOS上安装Docker。
(1)创建一个简单的Node.js应用程序:我们将创建一个简单的Node应用程序,该应用程序在访问根路由时会发送“HelloWorld”消息。请按照以下步骤设置你的应用程序:
在目录内,app.js文件包含我们的主要应用程序代码
(2)为应用程序创建Dockerfile:现在,我们可以使用创建Docker映像所需的信息来创建Dockerfile。要为我们的应用程序创建Docker映像,Dockerfile应该包含这样的一组命令。
现在,我将帮你理解这些命令的含义。
①FROM-此命令设置基本映像,并在此基础上构建应用程序的新映像。在本例中,我们使用的图像包含npm和最新的Node.js版本。该映像是从DockerHub(它是Docker映像的公共存储库)中提取的。
②WORKDIR-此命令为将在容器内运行的应用程序设置工作目录。
③COPY-此命令将应用程序目录中的文件复制到我们使用上一个命令设置的工作目录中。你可以将路径传递给特定的文件名,或者执行上述操作以将应用程序目录中的所有文件复制到Docker映像。在后一种情况下,请确保在运行dockerbuild命令时已导航至命令行上的应用程序目录。
④ENV-在Node应用程序中,请注意我们如何将环境变量PORT(process.env.PORT)传递给app.listen函数,而不是直接传递应用程序应侦听的端口号。因此,我们必须在应用程序环境中设置PORT环境变量。对于我们的应用程序,它将转到Docker容器。因此,我们使用ENV命令在Docker容器内传递要设置为环境变量的变量。
⑤RUN-此命令运行npminstall来安装应用程序中使用的依赖项,这些依赖项已保存到package.json文件中。
⑥EXPOSE-此命令公开应用程序以侦听给定的端口。由于我们已经将端口号设置为环境变量,因此我们传递变量名称$PORT代替实际的端口号。但是,请记住,应用程序暴露在容器环境而不是主机设备环境内部的端口上。
⑦ENTRYPOINT-此命令设置如何输入或启动我们的应用程序。Docker加入我们传递的数组,以创建一个用于启动应用程序的命令,即节点app.js。
(3)构建Docker映像:我们使用dockerbuild命令从Dockerfile构建Docker映像。下面是它的工作原理:
在运行命令之前,请确保已经导航到命令行上的应用程序目录。你可以在(。)处代替Dockerfile位置,以指示Dockerfile位于当前目录中。对于我们的示例,我将运行:
输出结果:
一旦你运行了dockerbuild命令,Docker将连续执行Dockerfile中的每个命令。执行FROM命令时,如果之前尚未将Node映像拉到你的设备,则Docker将从DockerHub提取该映像。你可以使用命令dockerimages来查看设备中当前的所有图像:
(4)创建Docker容器:我们使用以下命令使用已构建的Docker映像创建并运行Docker容器。
结果:
在此,-d标志用于在守护程序模式下运行容器。-p标志用于将容器打开到外部的端口映射到应用程序正在侦听的端口。以前,在Dockerfile中,我们将内部端口或应用程序端口设置为。因此,在这里,我们将容器打开到主机设备的端口映射到端口。这docker-tutorial是Docker的名称-图片。
至此,我们完成了对Node应用程序简单的进行docker化的过程。你可以在浏览器上访问URL