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

Docker开发nodejs

时间:2023-04-03 23:13:54 Node.js

参考https://yeasy.gitbooks.io/doc...Docker介绍Docker是一个开源项目,诞生于2013年初,最初是dotCloud内部的一个业余项目。它是基于谷歌推出的Go语言实现的。该项目后来加入了Linux基金会,遵守Apache2.0协议,项目代码维护在GitHub上。Docker项目的目标是实现一个轻量级的操作系统虚拟化解决方案。Docker基于Linux容器(LXC)等技术。Docker在LXC的基础上进行了进一步的封装,让用户无需关心容器的管理,操作更加简单。用户操作Docker容器就像操作快速、轻量级的虚拟机一样简单。下图比较了Docker与传统虚拟化方式的区别。可以看出,容器在操作系统层面实现虚拟化,直接复用本地主机的操作系统,而传统方式是在硬件层面实现。Docker的优势作为一种新兴的虚拟化方式,Docker与传统的虚拟化方式相比有很多优势。首先,可以实现秒级启动Docker容器,比传统的虚拟机方式要快很多。其次,Docker对系统资源的利用率高,单台主机上可以同时运行上千个Docker容器。除了在容器中运行应用外,基本不消耗额外的系统资源,使得应用的性能非常高,同时系统开销也尽可能小。传统的虚拟机方式需要10台虚拟机来运行10个不同的应用,而Docker只需要启动10个孤立的应用。就我对Docker的了解,目前在使用docker的过程中,基本上都是在本地开发项目,生成dist文件目录,迁移到docker上,相当于只在生产环境开发使用docker。主要原因有以下几点:在开发环境中使用docker还是不太舒服。每次修改都要重建运行,很麻烦。本地开发更舒服;docker其实可以看做是一个封闭的盒子,做一些查看和操作还是有点麻烦。是的,交互性不是很好,感觉更适合生产环境。Dockerhub简介目前,Docker官方维护着一个公共仓库DockerHub,里面已经包含了15000多个镜像。大部分需求可以通过直接从DockerHub下载镜像来实现。登录可以通过执行dockerlogin命令输入用户名、密码和邮箱完成注册登录。注册成功后,用户的认证信息会保存在本地用户目录下的.dockercfg中。dockerlogin--username=username--email=email@gmail.com下载根据是否官方提供,镜像资源可以分为两类。一种是像centos这样的基础镜像,称为基础镜像或根镜像。这些基础镜像由Docker公司创建、验证、支持和提供。此类图像通常使用单字名称。还有一种类型,例如tianon/centosimages,由Docker用户创建和维护,通常带有用户名前缀。您可以使用前缀user_name/指定用户提供的图像,例如tianon用户。dockerpullapline//ordockerpullmhart/alpine-node-auto提交修改当前镜像后,需要提交修改后的镜像。修改镜像包括提交的流程如下:首先使用下载的镜像启动容器。dockerrun-t-itraining/sinatra/bin/bashroot@0b2616b0e5a8:/#注意:记住容器的ID,后面会用到。将json包(一个rubygem)添加到容器中。root@0b2616b0e5a8:/#geminstalljson完成后,我们使用exit退出,现在我们的容器已经被我们更改了,使用dockercommit命令提交更新的副本。dockercommit-m"Addedjsongem"-a"DockerNewbee"0b2616b0e5a8ouruser/sinatra:v24f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c其中-m是用来指定用户提交的同版本控制信息工具;后跟用于创建图像的容器的ID;最后指定目标镜像的仓库名称和标签信息。创建成功后,返回镜像ID信息。使用dockerimages查看新创建的镜像。之后就可以使用新镜像启动容器了$dockerrun-t-iouruser/sinatra:v2/bin/bashroot@78e82f680994:/#Upload用户可以使用dockerpush命令将自己创建的镜像上传到共享仓库。比如用户在DockerHub注册后,可以将自己的镜像推送到仓库。$dockerpushouruser/sinatra推入一个仓库[ouruser/sinatra](len:1)发送镜像列表推送仓库ouruser/sinatra(3tags)修改镜像的tag使用dockertag命令修改镜像的tag.$sudodockertag5db5f8471261ouruser/sinatra:devel$sudodockerimagesouruser/sinatraREPOSITORYTAGIMAGEIDCREATEDVIRTUALSIZEouruser/sinatralatest5db5f847126111hoursago446.7MBouruser/sinatradevel5db5f847126111hoursago446.7MBouruser/sinatrav25db5f847126111hoursago446.7MB使用Dockerfile创建镜像使用dockercommit扩展镜像比较简单,但不方便在团队中共享。我们可以使用dockerbuild创建一个新的镜像。为此,您首先需要创建一个Dockerfile,其中包含一些有关如何创建映像的说明。Dockerfile中的每条指令都会创建一个镜像层,例如:#Dockerfile.alpineFROMmhart/alpine-node:latestMAINTAINERzhanfang"fzhanxd@gmail.com"#如果你有原生依赖,你将需要额外的工具#RUNapkadd--no-cachemakegccg++python#创建应用目录RUNmkdir-p/usr/src/appWORKDIR/usr/src/app#如果你的项目依赖很多包,你可以使用cnpm代替npm#RUNnpminstallcnpm-g--registry=https://registry.npm.taobao.org#安装应用依赖COPYpackage.json/usr/src/app/RUNnpminstall--registry=https://registry.npm.taobao.org#捆绑应用来源复制。/usr/src/app#ExposeportEXPOSE3000CMD["npm","start"]写好Dockerfile后,就可以使用dockerbuild生成镜像了。dockerbuild-talpine-koa2-startkit。-t标志用于添加一个标签来指定新图像的用户信息。“。”是Dockerfile所在的路径(当前目录),也可以换成Dockerfile的具体路径。Dockfile中的指令一条一条执行。每一步都会创建一个新的容器,在容器中执行命令并提交修改(就像前面介绍的dockercommit)。执行完所有指令后,返回最终的图像id。删除并清理中间步骤生成的所有容器。注意一个镜像不能超过127层来完成一个镜像的下载、修改和上传。下载基于alpine-node-auto镜像的基础镜像。dockerpullmhart/alpine-node-auto并写一个dockerfilezhanfang"fzhanxd@gmail.com"#如果你有原生依赖,你需要额外的工具#RUNapkadd--no-cachemakegccg++python#创建应用directoryRUNmkdir-p/usr/src/appWORKDIR/usr/src/app#如果你的项目依赖很多包,你可以使用cnpm而不是npm#RUNnpminstallcnpm-g--registry=https://registry.npm.taobao.org#安装应用程序依赖COPYpackage.json/usr/src/app/RUNnpminstall--registry=https://registry.npm.taobao.org#BundleappsourceCOPY./usr/src/app#ExposeportEXPOSE3000CMD["npm","start"]CreatenewMirrordockerbuild-t=zhanfang/alpine-koa2-startkit:v1"标记alpine-koa2-startkit:v1运行一个容器instancedockerrun-t-i--namealpine-koa2-applicationzhanfang/alpine-koa2-startkit:v2上传镜像(如果没有登录,请登录,使用登录命令)dockerpushzhanfang/alpine-koa2-startkit