Docker是供开发人员和系统管理员使用容器构建,运行和共享应用程序的平台。 使用容器部署应用程序称为容器化。 容器并非新事物,但用于轻松部署应用程序的容器倒是新事物。 容器化愈来愈受欢迎,由于容器是:node
根本上讲,一个容器不过是一个正在运行的进程,并对其应用了一些附加的封装功能,以使其与主机和其余容器隔离 容器隔离的最重要方面之一是每一个容器都与本身的专用文件系统进行交互。 该文件系统由Docker映像提供。 映像包括运行应用程序所需的一切-代码或二进制文件,运行时,依赖项以及所需的任何其余文件系统对象。git
容器在Linux上本地运行,并与其余容器共享主机的内核。 它运行一个独立进程,不占用任何其余可执行文件更多的内存,从而使其轻巧。github
相比之下,虚拟机(VM)运行具备“虚拟机管理程序”对主机资源的虚拟访问权的成熟“来宾”操做系统。 一般,VM会产生大量开销,超出了应用程序逻辑所消耗的开销。docker
Docker Desktop是适用于Mac或Windows环境的易于安装的应用程序,可以让您在几分钟内开始编码和容器化。 Docker Desktop包含直接从您的机器构建,运行和共享容器化应用程序所需的一切。 具体环境能够去官网上下载相应的安装包npm
$ docker --version
json
一般,开发工做流程以下所示:浏览器
在本教程的这个阶段,让咱们关注这个工做流的第1步:建立镜像。记住,Docker镜像捕获咱们的容器化进程将在其中运行的私有文件系统;咱们须要建立一个包含应用程序所需运行内容的镜像。 让咱们看一个实例:安全
git clone https://github.com/dockersamples/node-bulletin-board
cd node-bulletin-board/bulletin-board-app
复制代码
node-bulletin-board项目是一个简单的公告板应用程序,使用Node.js编写。 在此示例中,假设您编写了此应用,如今正尝试对其进行容器化.bash
在公告栏应用程序中查看名为Dockerfile的文件。Dockerfiles描述如何为容器装配专用文件系统,还能够包含一些元数据,这些元数据描述如何基于此映像运行容器。公告板上的应用程序Dockerfile是这样的:网络
FROM node:current-slim
WORKDIR /usr/src/app
COPY package.json .
RUN npm install
EXPOSE 8080
CMD [ "npm", "start" ]
COPY . .
复制代码
编写Dockerfile是容器化应用程序的第一步。 您能够将这些Dockerfile命令视为有关如何构建映像的逐步指南。 此步骤采起如下步骤:
From
先前存在的镜像node:current-slim
开始.这是一个官方镜像, 这是一个官方镜像,由node.js供应商构建,并通过Docker验证,是一个高质量的图像,包含node.js长期支持(LTS)解释器和基本依赖。WORKDIR
指定全部的后续操做都是基于镜像文件系统中目录/usr/src/app
,而不是主机文件系统。COPY
指令从你的主机的当前路径.
拷贝 package.json
到镜像中。因此在这种状况下,镜像中文件的目录为/usr/src/app/package.json
RUN
指令在镜像文件系统中运行命令npm install
,该命令将读取package.json
文件来决定你的应用程序的node依赖,并安装他们。COPY
指令从主机将应用的其他源代码复制到镜像文件系统中。您会看到,这些步骤与在主机上设置和安装应用程序所采起的步骤几乎相同。 可是,将它们捕获为Dockerfile容许咱们在可移植的隔离Docker映像内执行相同的操做。
上面的步骤构建了映像的文件系统,可是Dockerfile中还有其余行。
实例中CMD
指令指定了镜像中的一些描述如何基于咱们镜像运行容器的元数据。在这个例子中,就是说,此镜像旨在支持的容器化进程是npm start
。
EXPOSE 8080
通知Docker该容器在运行时正在侦听端口8000。
上面您看到的是组织一个简单的Dockerfile的好方法。 老是以FROM
命令开头,按照它的步骤构建专用文件系统,并以任何元数据规范做为结束。Dockerfile指令比上面看到的要多。 有关完整列表。请参阅Dockerfile参考
如今咱们已经有了一些源代码和一个Dockerfile,是时候构建咱们的第一个映像了,并确保从其中启动的容器按预期工做。确保如今在node-bulletin-board/bulletin-board-app
目录下。而后开始构建镜像 docker image build -t bulletinboard:1.0 .
您将看到Docker一步一步地遍历Dockerfile中的每一个指令,在此过程当中构建映像。若是成功,构建过程应该以一条消息结束Successfully tagged bulletinboard:1.0
.
➜ bulletin-board-app git:(master) docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
bulletinboard 1.0 13adcd31251b 40 seconds ago 152MB
复制代码
docker container run --publish 8000:8080 --detach --name bb bulletinboard:1.0
复制代码
咱们在这里使用了几个常见的选项:
--publish
要求Docker转发主机端口8000上传入的流量,到容器的端口8080(容器具备本身的专用端口集,所以,若是咱们要从网络访问一个端口,则必须以这种方式将流量转发到该端口;不然,防火墙规则将阻止全部网络流量到达您的容器 ,做为默认的安全状态)。--detach
要求Docker在后台运行此容器。--name
让咱们指定一个名称,在后续命令中可使用该名称来引用咱们的容器,实例中咱们命名为bb.另请注意,咱们没有指定咱们要运行容器的进程。 咱们没有必要,由于在构建Dockerfile时使用了CMD指令; 所以,Docker知道在启动时会自动在容器内运行npm start进程。
在浏览器中的localhost:8000上访问您的应用程序。 您应该看到公告板应用程序已启动并正在运行。 在这一步,咱们一般会竭尽所能,以确保咱们的容器按预期的方式工做; 例如,如今是运行单元测试的时候了。
对电子公告板容器正常工做感到满意后,能够将其删除:
docker container rm --force bb
复制代码
--force
选项删除正在运行的容器。
至此,咱们已经成功构建了图像,对应用程序进行了简单的容器化,并确认咱们的应用程序已在其容器中成功运行。 下一步将是在Docker Hub上共享您的映像,以即可以轻松下载它们并在任何目标计算机上运行它们。
如今,您的映像已在Docker Hub上可用,您将能够在任何地方运行它。 若是您尝试在还没有安装的新机器上使用它,则Docker会自动尝试从Docker Hub下载。 经过以这种方式移动映像,您再也不须要在要运行咱们的软件的计算机上安装除Docker之外的任何依赖项。 容器化应用程序的依赖关系已彻底封装并隔离在您的映像中,如上所述,咱们可使用Docker Hub进行共享。
须要记住的另外一件事:目前,咱们仅将您的映像推送到Docker Hub; 那你的Dockerfile呢? 一个关键的最佳实践是将它们保留在版本控制中,或者与应用程序的源代码一块儿保留。 您能够在Docker Hub存储库描述中添加连接或注释,以指示能够在何处找到这些文件,不只保留有关图像构建方式以及做为完整应用程序运行的方式的记录。