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

docker简介

时间:2023-04-03 20:01:05 Node.js

Docker最初是由dotCloud创始人SolomonHykes在法国发起的一个内部项目。是基于dotCloud多年云服务技术的创新,于2013年3月在Apache2.0许可协议下开源,主要项目代码维护在GitHub上。Docker项目后来也加入了Linux基金会,成立了OpenContainerConsortium(OCI)来推动。由于Docker项目的火爆,2013年底,dotCloud决定更名为Docker。Docker最初是在Ubuntu12.04上开发和实现的;RedHat从RHEL6.5开始支持Docker;谷歌还在其PaaS产品中广泛使用Docker。下图比较了Docker与传统虚拟化方法的区别。传统的虚拟机技术是虚拟出一套硬件,在其上运行完整的操作系统,然后在该系统上运行所需的应用进程;而容器中的应用进程直接运行在宿主机的内核上,容器没有自己的内核,没有硬件虚拟化。因此,容器比传统的虚拟机更便携。一、docker的主要概念1、镜像Docker镜像是一种特殊的文件系统。除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含一些为运行时准备的配置参数(如匿名卷、环境变量、用户等)。图像不包含任何动态数据,构建后其内容不会改变。分层存储由于镜像包含了操作系统完整的根文件系统,其体积往往是巨大的,所以在设计Docker时,充分利用了UnionFS2.容器镜像(Image)与容器(Container)的关系),就像面向对象编程设计中的类和实例一样,镜像是静态定义,容器是镜像运行时的??实体。容器可以创建、启动、停止、删除、暂停等。容器的本质是进程,容器进程运行在自己独立的命名空间中。所以一个容器可以有自己的根文件系统、自己的网络配置、自己的进程空间,甚至自己的用户ID空间。容器中的进程运行在一个隔离的环境中,使用时,仿佛是在一个独立于宿主机的系统下运行。这个特性使得容器封装的应用程序比直接在主机上运行更安全。3、仓库镜像搭建完成后,可以方便的在当前宿主机上运行。但是,如果我们需要在其他服务器上使用这个镜像,就需要一个集中存储和分发的镜像服务。DockerRegistry就是这样的服务。一个DockerRegistry可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。DockerRegistry公共服务最常用的Registry公共服务是官方的DockerHub私有DockerRegistry。除了使用公共服务,用户还可以在本地构建私有的DockerRegistry。Docker官方提供了DockerRegistry镜像,可以直接作为私有Registry服务使用。在PrivateRepository部分,将进一步解释构建私有Registry服务。开源的DockerRegistry镜像只提供了DockerRegistryAPI的服务端实现,足以支持docker命令,不影响使用。但是,它不包括图形界面,以及图像维护、用户管理和访问控制等高级功能。除了官方的DockerRegistry之外,还有实现DockerRegistryAPI的第三方软件,甚至提供用户界面和一些高级功能。例如,Harbor和SonatypeNexus。三、使用镜像1、下载镜像dockerpull[option][仓库地址[:端口号]/]仓库名称[:label]option:通过dockerpull--help命令可以看到仓库地址:格式地址的一般是<域名/IP>[:端口号]。默认地址为DockerHub地址:docker.io仓库名:二段名,即<用户名>/<软件名>。对于DockerHub,如果不指定用户名,则默认为library,即官方镜像。$dockerpullnginx$dockerpulldocker.io/library/nginx:latestlatest:从库/nginxDigest拉取:sha256:2275af0f20d71b293916f1958f8497f987b8d8fd8113df54635f2a5915002bf1Status:Imageisup-datefornginx.xlibdoncker2.xrlibdoncker2:latest运行镜像(容器)一旦我们有了镜像,我们就可以启动并运行一个基于镜像的容器。$dockerrun-it--rmubuntu:18.04bashroot@e7009c6ce357:/#cat/etc/os-releaseNAME="Ubuntu"VERSION="18.04.1LTS(BionicBeaver)"ID=ubuntuID_LIKE=debianPRETTY_NAME="Ubuntu18.04.1LTS"VERSION_ID="18.04"HOME_URL="https://www.ubuntu.com/"SUPPORT_URL="https://help.ubuntu.com/"BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"VERSION_CODENAME=bionicUBUNTU_CODENAME=bionic3。列出镜像dockerimagels[OPTIONS][REPOSITORY[:TAG]]4.删除镜像dockerimagerm[OPTIONS]IMAGE[IMAGE...]$dockerimagerm1276Untagged:nginx:latestUntagged:nginx@sha256:2275af0f20d71b293916f1958f8497f987b8d8fd8113df54635f2a5915002bf1Deleted:sha256:12766a6745eea133de9fdcd03ff720fa971fdaf21113d4bc72b417c123b15619Deleted:sha256:3ea962f6f388096ab9798790d363fc6f9c779c924a5eddf5c699d8da080114f7Deleted:sha256:091a2aef7242e42505b69f1ad027d6a442cfce2403e260ac914f0fd6cc2d275fDeleted:sha256:4e72a31f1cd6fd655cc0826c91e886967b6e965e13ac21f31f9f66c27a3b7732Deleted:sha256:e3d1cdf9772a260b3e81a22c1940d63ac45dfe67720f78f00ca73834d9498934Deleted:sha256:af40da71a8618ea9cbcdc333d5e60bd5b6df820f0d07a55f7c9a1c21fd930095Deleted:sha256:608f3a074261105f129d707e4d9ad3d41b5baa94887f092b7c2857f7274a2fce四、操作容器1.启动容器启动容器有两种方式:新建并启动:基于镜像新建一个容器并启动启动已终止容器:将在Theterminated(exited)containerisrestarted1.1Createanewoneandstartdockerrun[OPTIONS]IMAGE[COMMAND][ARG...]$dockerrunubuntuecho'Helloworld'HelloworldThisisthesameasdirectlyexecutingecho'helloworld'locallyThereishardlyanydifference.Thefollowingcommandstartsabashterminal,allowinguserstointeract(infact,thedefaultistoexecutebash)$dockerrun-itubuntu/bin/bashroot@af8bae53bdd3:/#Whenusingdockerruntocreateacontainer,ThestandardoperationsofDockerrunninginthebackgroundinclude:checkwhetherthespecifiedimageexistslocally,downloaditfromtheregistryifitdoesnotexist,usetheimagetocreateandstartacontainer,allocateafilesystem,andmountaread-writelayeroutsidetheread-onlyimagelayerLayerbridgesavirtualinterfacefromthebridgeinterfaceconfiguredonthehosthosttothecontainertoconfigureanipaddressfromtheaddresspoolforthecontainertoexecutetheapplicationspecifiedbytheuser.Afterthecontainerisexecuted,thecontaineristerminatedandthedaemonstateisrunning.ItisnecessarytoletDockerruninthebackgroundinsteadofDirectlyoutputtheresultofexecutingthecommandtothecurrenthost.此时可以加上-d参数实现1.2启动终止容器dockercontainerstart[OPTIONS]CONTAINER[CONTAINER...]-a,--attachAttachSTDOUT/STDERRandforwardsignals--detach-keysstring覆盖用于分离容器的键序列-i,--interactive附加容器的STDIN查看容器日志docker容器日志[OPTIONS]CONTAINER2。终止和重启容器终止容器:dockercontainerstop[OPTIONS]CONTAINER[CONTAINER...]重启容器dockercontainerrestart[OPTIONS]CONTAINER[CONTAINER...]3.进入容器使用-d参数时,容器启动后会进入后台。但有时需要进入容器进行操作。进入容器可以使用dockerattach命令或者dockerexec命令。推荐使用dockerexec命令,下面会解释原因。3.1dockerattachdockerattach[OPTIONS]CONTAINER注意:如果退出这个stdin,会导致容器停止3.2dockerexecdockerexec[OPTIONS]CONTAINERCOMMAND[ARG...]dockerexec-itf2a487528d5ebashroot@f2a487528d5e:/#4.导入和导出4.1导出容器Usage:dockerexport[OPTIONS]CONTAINERExportacontainer'sfilesystemasatararchive$dockerexport8cf0-onginx-bak$dockerexport8cf0>nginx-bak4.2导入容器dockerimport[OPTIONS]file|URL|-[REPOSITORY[:TAG]]从tarball导入内容以创建文件系统映像$dockerimportnginx-baklihaixing/nginx:1$dockerimporthttp://example.com/exampleimage.tgzexample/imagerepo$码头图像ls5。删除容器dockercontainerrm[OPTIONS]CONTAINER[CONTAINER...]-f,--force强制删除正在运行的容器(使用SIGKILL)-l,--link删除指定链接-v,--volumes删除匿名与容器关联的卷清理所有终止的容器dockercontainerprune[OPTIONS]Options:--filterfilterProvidefiltervalues(e.G。'until=')-f,--force不提示确认5.资料库(Repository)是图像集中存放的地方。一个容易混淆的概念是注册服务器(Registry)。注册服务器其实就是一个具体的管理仓库的服务器。每个服务器上可以有多个仓库,每个仓库下有多个镜像。在这方面,存储库可以被认为是一个具体的项目或目录。例如仓库地址docker.io/ubuntu,docker.io为注册服务器地址,ubuntu为仓库名。一、公共仓库DockerHub1.1注册您可以在https://hub.docker.com免费注册一个Docker账号。1.2在命令行界面执行dockerlogin命令并交互输入用户名和密码登录DockerHub即可完成登录。您可以通过dockerlogout注销。1.3拉取镜像搜索镜像:dockersearch[OPTIONS]TERM拉取镜像:dockerpull[OPTIONS]NAME[:TAG|@DIGEST]1.4推送镜像dockerpush[OPTIONS]NAME[:TAG]私有仓库https://yeasy.gitbook.io/dock...六、使用网络1.外部访问容器容器中可以运行一些网络应用。要允许外部访问这些应用程序,您可以通过-P或-p参数指定端口映射。使用-P标志,Docker会随机将端口映射到容器内的开放网络端口。$dockerrun-d-Pnginx$dockercontainerlsCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMESc8c0db6fb216nginx"/docker-entrypoint..."9secondsagoUp8seconds0.0.0.0:55000->80/tcpgracious_ng-elbakyan428cf"入口点。..."12小时前Up12小时80/tcpvibrant_kellercurl0.0.0.0:55000-p可以指定映射的端口,指定端口只能绑定一个容器。支持的格式是ip:hostPort:containerPort|ip::容器端口|主机端口:容器端口。$dockerrun-d-p80:80nginx//指定多端口映射$dockerrun-d\-p80:80\-p443:443\nginx查看端口$dockerportf3d80/tcp->0.0.0.0:80$泊坞窗端口f3d800.0.0.0:802。容器互联如果你之前有过Docker使用经验,你可能会习惯使用--link参数来进行容器互联。随着Docker网络的完善,强烈建议大家将容器添加到自定义的Docker网络中来连接多个容器,而不是使用--link参数2.1创建一个新的网络dockernetworkCOMMAND命令:connect将一个容器连接到一个网络create创建网络断开从网络断开容器inspect显示一个或多个网络的详细信息ls列出网络prune删除所有未使用的网络rm删除一个或多个网络dockernetworkcreate[OPTIONS]NETWORK$dockernetworkcreate-dbridgemy-net-d参数指定Docker网络类型,带网桥overlay2.2连接container$dockerrun-it--rm--namebusybox1--networkmy-netbusybox$dockerrun-it--rm--namebusybox2--networkmy-netbusybox$pingbusybox1