当前位置: 首页 > 科技观察

前端工程师入门Docker

时间:2023-03-19 22:13:42 科技观察

我们为什么要用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('applisteningonport8081!')})然后我们创建一个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--fromdockerhub拉取node.jsdocker镜像,你可以在这里找到节点镜像:https://hub.docker.com/_/node/WORKDIR/app--在镜像中设置工作目录,你可以使用它以下命令:COPY、RUN和CMDCOPYpackage.json/app--将package.json从主机的my-node-app目录复制到镜像的/app目录RUNnpminstall--在镜像中运行此命令以安装节点packageCOPY./app--将my-node-app目录下的所有文件复制到镜像中的/app目录下EXPOSE8081--这个命令告诉容器暴露一个端口号,这就是我们在index中的端口号.js写的那个。默认情况下,容器会忽略对它的所有请求。构建Docker镜像,注意~打开控制台,进入my-node-app目录,执行如下命令:#Buildaimagedockerbuild-tdockerbuild-你好世界。此命令在我们的主机上创建一个hello-world图像-t用于为我们的图像指定名称,这里是hello-world。用来表示docker文件的路径,因为我们已经在my-node-app里面了,所以路径就ok了。在控制台可以看到类似如下的输出:SendingbuildcontexttoDockerdaemon4.096kBStep1/7:FROMnode:8--->4f01e5319662Step2/7:WORKDIR/app--->Usingcache--->5c173b2c7b76Step3/7:COPYpackage.json/app--->Usingcache--->ceb27a57f18eStep4/7:RUNnpminstall--->Usingcache--->c1baaf16812aStep5/7:COPY./app--->4a770927e8e8Step6/7:EXPOSE8081--->Runningin2b3f11daff5eRemovingintermediatecontaineraff17-Step5/7-Step5/7->4a770927e8e8Step6/7:EXPOSE8081/7:cmdnodeindex.js-----runningin3791dd7f5149removingintermediatecontainer3791dd7f5149------------------------------>c80301fa07b2successouldb2successoulb2sucuccesulbuiltbuiltc80301fa07b2successuccessuccessuccessuccessuctedhelloesthellothellohelly可以第一次运行可能需要一些时间,下次使用缓存加速。现在让我们看一下刚刚构建的镜像:#Getalistofimagesonyourhostdockerimages这个命令将显示您计算机上存在的docker镜像。其中之一是:REPOSITORYTAGIMAGEIDCREATEDSIZEhello-worldlatestc80301fa07b222minutesago896MB运行Docker容器现在我们已经创建了镜像,让我们从这个镜像运行一个docker容器:#Defaultcommandforthisisdockercontainerrundockercontainerrun-p4000:8081hello-world此命令用于创建和runadockercontainer-p4000:8081--是发布(publish)标识,将机器的4000端口映射到容器中的8081端口。现在所有对本机4000端口的访问都会被容器中的8081端口监听。hello-world--这个名字就是刚才使用dockerbuild命令时指定的镜像名。您将获得以下输出:applisteningonport8081!如果需要进入容器并挂载一个bash终端,可以运行:#Enterthecontainerdockerexec-ti/bin/bash来检查我们的容器是否运行,再打开一个命令行,输入:dockerps可以看到如下内容output:CONTAINERIDIMAGECOMMANDCREATED``hello-world"/bin/sh-c'nodein..."11secondsagoSTATUSPORTSNAMESUp11seconds0.0.0.0:4000->8081/tcpsome-random-name这里我们可以看到从hello创建的容器-world图像及其正在运行并侦听端口8081。我们简单的Node.js应用程序现在已完全容器化。您可以在浏览器中访问http://localhost:4000,您应该会看到以下屏幕: