当前位置: 首页 > 后端技术 > Node.js

【翻译】前端工程师入门Docker

时间:2023-04-03 13:53:22 Node.js

我们为什么要用docker?以往,当业务开发需要部署新的应用时,DevOps伙伴通常会购买一台服务器,但他们并不知道这个新应用对配置的要求有多高,往往会造成资源的浪费。当虚拟机出来的时候,它允许我们在一台服务器上运行多个应用程序,但是它有一个缺陷。每个VM都需要运行整个操作系统。每个OS都需要CPU、RAM等,需要打补丁,安装证书,进而增加成本和弹性。Google很早就开始使用容器模型来解决VM模型的弊端。简单的说,容器模型可以让我们在同一台主机上运行多个容器,共享主机的CPU、RAM等资源。那么这对开发人员意味着什么?它确保我们的工作环境在所有开发人员和服务器之间保持一致。例如:生产环境、模拟环境、测试环境。任何人都可以在几分钟内配置项目,而无需搞乱配置、安装库和设置依赖项。简单的说,docker就是一个让我们可以使用容器来开发、部署和运行应用程序的平台。让我们退后一步,看看容器系统在物理上是什么样子,以及它与VM有何不同。可以看出,宿主机的资源在容器化之后是共享的,但是在VM中是划分的。接下来,让我们再深入一点。如何使用泊坞窗?为此,我们需要先熟悉一些术语。Docker镜像:它是一个可执行文件,包含操作系统配置和运行应用程序的所有库。它有多层叠加在一起并表示为单个对象。dockerimage是通过dockerfile创建的,后面会讲到。Docker容器:它是docker镜像的运行实例。同一个docker镜像可以有多个正在运行的容器。容器化的Node.js应用程序让我们尝试容器化一个简单的node.js应用程序,然后创建一个图像:您的Node.js应用程序首先创建一个my-node-app文件夹,mkdirmy-node-appcdmy-node-app然后创建一个index.js来启动一个nodeserver://我们使用require导入expressvarexpress=require('express')varapp=express()//对根URL做出响应app.get('/',function(req,res){res.send('HelloWorld!')})//让服务器监听8081端口app.listen(8081,function(){console.log('app监听8081端口!')})然后我们创建一个package.json文件,可以通过npminit-y快速生成:{"name":"helloworld","version":"1.0.0","description":"Dockerizednode.jsapp","main":"index.js","author":"","license":"ISC","dependencies":{"express":"^4.16.4"}}此时我们甚至不需要在自己的机器上安装Express或npm,因为dockerfile可以为我们配置和安装这些依赖项。DockerFile让我们创建一个dockerfile并将其保存到my-node-app文件夹。这个文件没有扩展名,名字叫做Dockerfile,里面的内容是:#DockerfileFROMnode:8WORKDIR/appCOPYpackage.json/appRUNnpminstallCOPY。/appEXPOSE8081CMDnodeindex.js让我解释一下里面的命令:FROMnode:8--从dockerhub中拉取node.jsdocker镜像,你可以在这里找到节点镜像:https://hub.docker.com/_/node/WORKDIR/app--设置镜像中的工作目录,可与以下命令一起使用:COPY、RUN和CMDCOPYpackage.json/app--从主机的my-node-app目录复制package.json到图像中的/app目录RUNnpminstall--在图像中运行此命令以安装节点包COPY。/app--将my-node-app目录下的所有文件复制到镜像中的/app目录下EXPOSE8081--这个命令告诉容器暴露一个端口号,也就是我们在index.js中写的.默认情况下,容器会忽略对它的所有请求。构建Docker镜像并观看~打开控制台,进入my-node-app目录,执行以下命令:#构建镜像dockerbuild-tdockerbuild-t你好世界.此命令在我们的主机上创建一个hello-world图像。-t用来给我们的镜像指定一个名字,这里是hello-world。用来指定docker文件的路径,因为我们在my-node-app中,所以路径是.您可以在控制台中看到类似于以下内容的输出:SendingbuildcontexttoDockerdaemon4.096kBStep1/7:FROMnode:8--->4f01e5319662Step2/7:WORKDIR/app--->Usingcache--->5c173b2c7b76第3/7步:复制package.json/app--->使用缓存--->ceb27a57f18e第4/7步:运行npminstall--->使用缓存--->c1baaf16812a第5/7步:复制。/app--->4a770927e8e8Step6/7:EXPOSE8081--->Runningin2b3f11daff5eRemovingintermediatecontainer2b3f11daff5e--->81a7ce14340aStep7:CMDnodeindex.js--->Runningin3791dd7f5149移除中间容器3791dd-7f5149-->c80301fa07b2成功构建c80301fa07b2成功标记hello-world:latest可以看到,它按照docker文件中的命令顺序运行,然后输出一个docker镜像。第一次运行可能需要一些时间,下次可以使用缓存来提速。加快速度。现在让我们看看刚刚构建的镜像:#获取主机上的镜像列表dockerimages该命令将显示计算机上存在的docker镜像。其中之一是:REPOSITORYTAGIMAGEIDCREATEDSIZEhello-worldlatestc80301fa07b222minutesago896MBRunningaDockercontainer现在我们已经创建了镜像,让我们从这个镜像运行一个docker容器:#Defaultcommandforthisisdockercontainerrundockercontainerrun-p4000:8081hello-world这条命令用来创建并运行一个docker容器-p4000:8081--是一个发布(publish)标识,它映射了4000端口机器到容器中的8081端口。现在所有对本机4000端口的访问都会被容器中的8081端口监听。hello-world--这个名字就是刚才使用dockerbuild命令时指定的镜像名。您将获得以下输出:applisteningonport8081!如果需要进入容器并挂载bash终端,可以运行:#enterthecontainerdockerexec-ti/bin/bash查看我们的容器是否运行,打开另一个命令行,输入:dockerps查看以下输出:CONTAINERIDIMAGECOMMANDCREATED``hello-world"/bin/sh-c'nodein..."11secondsagoSTATUSPORTSNAMESUp11seconds0.0.0.0:4000->8081/tcpsome-random-name在这里您可以看到我们从hello-world图像创建的容器及其??,它正在运行并侦听端口号8081。我们简单的Node.js应用程序现在已完全容器化。你可以在浏览器中访问http://localhost:4000,应该会看到如下画面:看,是不是很简单?哈哈~原文链接欢迎关注我的公众号:codingonfire