docker 开发者
Docker作为DevOps的瑞士军刀的作用已得到充分证明。 但是,由Docker管理的应用程序容器比在云中部署服务器有用。 在许多常见的开发场景中,Docker容器还可以帮助开发并显着提高生产率。 本教程侧重于从开发人员的角度来看如何使用Docker。 我将介绍Docker,解释基本概念和术语,并提供一系列动手开发示例。
您会看到:
- Docker可以促进Node.js Web应用程序编码。
- 您可以使用Docker在Apache Tomcat服务器上快速创建和测试Java™Enterprise Edition(Java EE)应用程序。
- Docker可以通过Bottle框架加快Python Web应用程序的编码,测试和部署。
- 您可以使用Docker容器在几分钟内创建和测试带有NoSQL数据库后端的整个三层Node.js应用程序。
您可以在单个Linux系统上获得所有这些好处,而无需打扰任何预设配置。 看完示例之后,您会感觉在家中运行各种Docker容器,以提高日常开发工作流程的工作效率。
Docker基础
Docker是一个容器管理器。 容器将应用程序及其依赖项捆绑在一起。 您可以从存储在存储库中的映像实例化每个容器,并在主机OS内隔离的虚拟化环境中运行容器。 因为虚拟化技术是(通常)轻量级的,所以您可以同时运行多个容器:
您可以使用Docker容器管理器执行以下操作:
- 从图像运行容器
- 检查和操作正在运行的容器的属性
- 停止运行容器
- 在正在运行的容器中执行其他任务
- 启动或重新启动正在运行的容器
- 执行许多其他管理任务
容器化的应用程序几乎可以在任何地方运行:在台式机,服务器,公共云或什至在某些手机上。
到目前为止,Linux是最广泛使用和支持的Docker平台。 Docker管理的容器化(轻量级虚拟化)技术在Linux平台上最成熟,使用了诸如控制组和名称空间之类的最新Linux功能。
如何运行Docker
您运行通过的泊坞容器管理器docker
命令行客户端,其中有许多可用开关和选项。 这是运行容器化的应用程序映像的简化命令(在这种情况下,适用于MySQL数据库):
docker run -d mysql:5.5
Docker项目运营着可公开访问的Docker Hub 。 用户可以注册并创建自己的容器化应用程序图像存储库,然后推送图像以共享给公众使用。 例如,您可以找到Tomcat服务器,Node.js和最受欢迎的开源数据库的图像。 Docker Hub与GitHub秉承同样的精神,即由全球DevOps和开发人员社区共享和协作创建应用程序映像。
例如,当您运行docker run -d mysql:5.5
命令时,如果尚未将mysql
(5.5版)容器化的应用程序映像存储在本地,则会自动从Docker Hub中提取(下载)该映像。
构建容器化的应用程序图像
您还可以使用docker
命令行客户端来构建容器化的应用程序映像。 一种方法是从Dockerfile
映像,该文本文件包含有关如何安装,设置和配置应用程序及其依赖项的说明。
使用docker
命令行客户端构建容器化映像的另一种方法是交互式地手工制作它们。 您可以在正在运行的容器中手动安装和配置应用程序及其依赖项,然后提交并将其保存为映像。
Docker映像由一组层组成,每个层大致等同于在安装一组应用程序期间写入磁盘的更改。 Docker管理这些层,并在添加或删除映像时实现有效的存储和重用。 例如, mysql
映像中的层可以由Linux OS,Perl,共享库,MySQL安装和基本的MySQL配置组成:
无论是从Dockerfile
构建容器化映像还是手工定制容器,通常都不会从头开始。 相反,您的工作基于现有的Dockerfile
或Docker Hub中的映像。 这样,开发人员和操作人员可以在彼此的工作基础上相互协作,并协作创建和管理一组有用的图像。
将映像发送到映像存储库(例如Docker Hub)的命令是docker push
。 下载映像以供本地使用的命令是docker pull
。
在你开始之前
“即使您将使用Java,Tomcat,Node.js,Python和CouchDB进行开发,也不需要安装它们。 这就是在开发工作流程中使用Docker的美妙之处。 ”
在开始之前,您需要安装并运行Docker的Linux系统。 要安装Docker,请遵循Linux发行版的安装说明 。
如果您无法直接访问Linux系统,则可以转向云。 大多数云主机都提供可立即运行的虚拟专用服务器或虚拟机,您可以在Linux上对其进行配置,并在几分钟之内连接(通过SSH或基于Web的终端)。 这些主机通常与Docker兼容。
本教程中的示例假定您在Linux系统上运行Docker。 如果您已经在Mac OS X或其他非Linux系统上运行Docker,则您的容器可能会在附加的虚拟机管理程序虚拟化的虚拟机(通常是VirtualBox )中运行。 在这种情况下,您需要相应地修改示例中的命令以进行后续操作。
检查您的Docker版本
通过运行以下命令检查您的Docker版本:
docker --version
如果您正在运行1.8.3或更高版本,则系统现在已全部设置。 即使您将使用Java,Tomcat,Node.js,Python和Apache CouchDB进行开发,也不需要安装或卸载其中的任何一个。 这就是在开发工作流程中使用Docker的美妙之处。
拉图像
第一次从Docker Hub中pull
映像时,必须将其下载到本地PC的存储库中。 根据您的Internet访问速度,下载可能很耗时,但是随后使用该图像将很快。
运行以下命令以下拉出您将在示例中使用的所有图像:
docker pull node:0.10.40
docker pull java
docker pull tomcat:8
docker pull webratio/ant
docker pull python:3.5
docker pull frodenas/couchdb
有关每个映像的更多信息,请访问Docker Hub页面上的node
, java
, tomcat
, webratio/ant
, python
和frodenas/couchdb
。
设置完成后,您就可以探索使用Docker与Node.js应用程序一起工作了。
快速设置和开发服务器端JavaScript代码
代码分发中的javascript目录(请参阅下载 )包含用Node.js编写的网络商店示例应用程序的源代码。 该应用程序(最初由Lauren Schaefer设计和编写)使用Express Web框架和Jade Node模板引擎。 (有关此应用程序的更多信息,请参阅“ Bluemix基础:将示例Node.js应用程序部署到云中 。”)通过使用Docker,您可以在计算机上使用此应用程序而无需安装Node.js或其任何依赖项-或需要解决软件包安装冲突。
主程序在app.js中。 CSS和相关JavaScript文件位于javascript / public / static中。 Jade模板位于javascript / view中。
通过运行以下命令安装此应用程序的Node.js依赖项:
docker run -it --rm --name lllnode -v "$PWD":/usr/src/myapp -w /usr/src/myapp node:0.10.40 npm install
此命令启动Node容器,在容器中挂载当前应用目录,然后在该应用上运行npm install
:
- 基本命令是
docker run node:0.10.40
,它将创建一个容器实例并运行您之前拉出的node:0.10.40
映像。 -
-it
开关指定您需要前台交互式终端。 (替代模式是分离的后台进程,由-d
指定。) -
--rm
开关指定清理,这意味着一旦退出容器,Docker就会将其删除。 如果未指定此开关,则容器将以停止状态持久保存到磁盘,并且可以从中断点重新启动它。 但是,对于忘记删除容器实例的用户,重新启动容器是磁盘耗尽的常见原因。 如果您不使用--rm
,则可以通过运行以下命令随时查看有多少个停下来的--rm
容器(该数目可能会让您感到惊讶):docker ps -a
-
--name lllnode
选项显式地命名容器,这对于在其他Docker命令中引用容器很有用。 如果您未明确命名容器,则Docker将为其分配一个生成的文本名称-通常意义不大。 您也可以通过容器的内部ID(不友好的十六进制数字长字符串)引用容器。 -
-v "$PWD":/usr/src/myapp
选项创建卷安装,将当前工作目录($PWD
)作为/ usr / src / myapp挂载在容器中。 然后可以在容器内部访问应用程序的Node.js源代码(或您在当前工作目录中可能拥有的任何其他Node.js源代码)。 -
-w /usr/src/myapp
选项设置正在运行的命令的工作目录。 在这种情况下,工作目录将更改为已安装的卷。 -
npm install
docker run
命令末尾的npm install
命令在工作目录中的容器内运行。 最终结果是您正在通过容器在当前目录上运行npm install
,而无需安装Node.js或其任何先决条件。
在命令输出中,您可以看到npm
正在安装的所有依赖项:
安装依赖项后,您可以通过容器运行应用程序。 使用此命令(将其键入为一行):
docker run -it --rm --name lllnode --env PORT=8011 --net="host" -v
"$PWD":/usr/src/myapp -w /usr/src/myapp node:0.10.40 node app.js
此命令类似于您先前运行的命令。 但是请注意,现在在容器中运行的命令是node app.js
,它将启动应用程序。
看一下app.js的内容。 您会发现以下几行:
var appEnv = cfenv.getAppEnv();
app.listen(appEnv.port, appEnv.bind, function() {
console.log("server starting on " + appEnv.url);
});
这些行使Express Web服务器侦听PORT
环境变量指定的PORT
。 要在容器中设置此环境变量,在docker
命令你只是跑用途--env PORT=8011
选项。
另外,命令的--net="host"
选项使容器在内部使用主机操作系统的网络堆栈(纯粹出于开发目的)。 然后,该应用程序正在侦听主机上的端口8011。
将浏览器指向http:// localhost:8011 /,在这里您可以看到Lauren的Lovely Landscapes打印商店,这是由运行中的容器提供的:
您可以随时退出该容器以修改代码或修复错误,然后在几秒钟内再次运行该容器,而不会造成开发环境的混乱。
从Node.js到Java EE只需几秒钟
现在,您已经确信Docker在短短几秒钟内即可启动并运行Node.js应用程序,您可能会想知道它如何处理更重量级的任务-例如Java EE开发。 我很高兴你问。
假设您已经阅读了我的“ Vaadin的Java全面开发Web ”教程,并且渴望尝试一下我的Java EE Vaadin示例。 但是您没有安装JDK,也不想只是为了修补整个下午而安装JDK,从而破坏了系统。 Docker营救!
代码下载的java目录中的ArticleViewer.war文件是一个应用,其中包含Vaadin教程中的多个Vaadin UI组件。 您可以通过Docker在Tomcat 8服务器上运行ArticleViewer.war。 第一步是从您先前拉出的映像启动Tomcat 8容器的实例:
docker run -it --rm -p 8888:8080 --name=tomcat_server -v $PWD:/mnt tomcat:8
现在,您可能已经熟悉了该命令。 将该容器命名为tomcat_server
,以便于参考。 并且您当前的工作目录在容器内安装为/ mnt。
-p 8888:8080
选项告诉Docker将主机系统的端口8888映射到容器的(内部)端口8080。在tomcat
映像的Dockerfile
中,您可以看到Tomcat正在侦听容器内的端口8080。
将浏览器指向http:// localhost:8888 /,您可以在其中看到熟悉的Tomcat 8服务器问候页面:
请注意,您可以使容器以交互方式运行(通过-it
开关)。 在这种模式下,日志将以标准输出连续显示,这对开发很方便。
附加到正在运行的Docker容器
现在,容器中已安装的目录/ mnt是您当前的工作目录,而ActiveViewer.war在该目录中。
将ActiveViewer.war从/ mnt复制到Tomcat 8的webapps目录,该目录将自动部署在该目录中:
docker exec tomcat_server cp /mnt/ArticleViewer.war /usr/local/tomcat/webapps
这次您不使用docker run
命令,因为tomcat_server
容器已经在运行。 而是,您附加到正在运行的容器并运行命令。 因此,您使用cp /mnt/ArticleViewer.war /usr/local/tomcat/webapps
docker exec
,将cp /mnt/ArticleViewer.war /usr/local/tomcat/webapps
命令提供为整个命令的最后一部分。
在tomcat_server
窗口中查看日志,以查看ArticleViewer
应用程序部署中的日志记录。
现在,将浏览器指向该应用程序的URL-http:// localhost:8888 / ArticleViewer /-以打开正在运行的应用程序。 单击左侧列表中的文章以查看右侧的文章内容:
停下来思考片刻,然后继续。 您没有在系统上下载或安装JDK或Tomcat 8。 但是,借助Docker,您可以在几秒钟内在成熟的Tomcat 8服务器上运行Vaadin应用程序的代码。
为Tomcat 8开发和构建Java Web应用程序
如您所见,您可以使用Docker轻松部署Web应用程序以进行测试。 同样,您可以再次通过Docker从Java源代码编译和构建Web应用程序-无需弄乱您的开发系统或花费很长时间安装必备组件。
从代码分发目录更改为java / LaurenLandscapesJava。 在此目录中,您可以在Node.js示例中看到Lauren的Lovely Landscapes应用程序的Java版本。 (如果您对代码的更详细描述感兴趣,请阅读“ Bluemix基础:将示例Java应用程序部署到云中 ”。)
build.xml文件是标准的Apache Ant构建文件,其中包含有关编译代码和构建WAR文件的说明。 通过使用webratio Apache Ant映像 ,您可以在代码更改后(或任何其他时间)快速编译并构建WAR:
docker run -it --rm -v "$PWD":/mnt webratio/ant bash -c 'cd /mnt; ant'
到目前为止,此docker run
命令中没有什么不熟悉。 该命令在容器内以/ mnt挂载的当前工作目录中运行Ant构建工具。 Ant会编译src子目录中的所有Java源代码,然后构建并捆绑WAR文件,并将其作为lauren.war放置在dist子目录中。
将lauren.war从java / LaurenLandscapesJava / dist目录复制到java目录:
cp dist/lauren.war ..
您可以使用以下命令将lauren.war应用程序部署到Tomcat 8:
docker exec tomcat_server cp /mnt/lauren.war /usr/local/tomcat/webapps
此命令附加到正在运行的tomcat_server
容器,并将lauren.war文件复制到Tomcat 8的webapps子目录中以进行自动部署。
现在将浏览器指向http:// localhost:8888 / lauren /,在这里您可以看到Laurenized Lovely Landscape的Java版本在Docker化Tomcat 8上运行。
从Java切换到Python
假设作为一名多种语言的开发人员,您想休息一下Java编码,以探索Python Bottle Web Framework提供的可能性。 为了帮助您快速探索Python Web应用程序开发而无安装麻烦和依赖关系,Docker再次节省了时间。
转到代码分发的python / Laurens.Lovely.Landscapes目录。 在该目录中是Lauren的Lovely Landscape应用程序的Python版本-是为Bottle Web框架编写的。 模板(.tpl文件)位于views子目录中。 (有关代码的更多信息,请阅读“ IBM Bluemix DevOps Services简介,第1部分:部署和更新简单的应用程序 。”)您还可以在关联的Bluemix DevOps Services 存储库中找到此代码的版本 。
通过以下Docker命令运行此Python应用程序(无需在系统上安装Python)(将其键入为一行):
docker run -it --rm --name lllpython -p 8000:8000 -v "$PWD":/usr/src/myapp -w
/usr/src/myapp python:3.5 python wsgi.py
现在将浏览器指向http:// localhost:8000 /,在这里您可以看到Lauren的Lovely Landscapes应用程序的运行Python版本。
使用Python开发时,您只需更改代码并重新运行前面的命令进行测试。 运行Docker容器的速度与运行本机安装的开发工具的速度一样快。
添加和启动分离的数据库
大多数现代Web应用程序涉及三层:浏览器作为客户端; 中间层应用程序服务器,例如Express,Tomcat 8或Bottle; 和一个后端数据库。 通过使用Docker,您可以快速添加数据库而无需在开发系统上安装它。
在最后一个示例中,您将向开发环境中添加一个Apache CouchDB数据库服务器。 您可以使用与IBM Cloudant NoSQL数据库100%兼容的CouchDB API在本地测试CouchDB或Cloudant代码。
切换到源分发中的数据库目录。 此目录中是Lauren的Lovely Landscapes应用程序的高级Node.js版本。 此版本从CouchDB(或Cloudant)获取有关打印商店库存的信息。 网上商店会根据可用打印清单来动态更改外观。 (您可以在“ Bluemix基础:在您的Node.js应用程序中添加Cloudant NoSQL数据库 ”中找到有关代码的更多信息。)
要启动Apache CouchDB的实例,请使用以下Docker命令(将其键入为一行):
docker run -d --name couchdb -p 5984:5984 -e COUCHDB_USERNAME=user -e
COUCHDB_PASSWORD=abc123 -e COUCHDB_DBNAME=prints -v $PWD/data:/data frodenas/couchdb
该命令使用COUCHDB_USERNAME
, COUCHDB_PASSWORD
和COUCHDB_DBNAME
环境变量来配置实例以匹配代码中使用的值。 当前工作目录在容器中作为/ data挂载。 CouchDB会将数据写入此目录,从而可以在不丢失数据的情况下重新启动容器。
请注意,在此示例中,您使用-d
选项而不是-it --rm
选项运行容器。 -d
选项启动分离的CouchDB实例。 您可以使用docker ps
命令查看所有正在运行的分离的Docker容器。
接下来,安装应用程序的Node.js依赖项:
docker run -it --rm --name llldepends -v "$PWD":/usr/src/myapp -w /usr/src/myapp node:0.10.40 npm install
Apache CouchDB实例尚未保存任何数据。 使用以下命令(将其键入为一行)运行dataseeder.js代码,该代码在Apache CouchDB实例中创建一个文档,以使用库存填充商店:
docker run -it --rm --name dataseeder --net="host" -v "$PWD":/usr/src/myapp -w
/usr/src/myapp node:0.10.40 node dataseeder.js
在端口8011上运行lllnode
应用程序:
docker run -it --rm --name lllnode --env PORT=8011 --net="host" -v "$PWD":/usr/src/myapp
-w /usr/src/myapp node:0.10.40 node app.js
将浏览器指向http:// localhost:8011 /以打开Lauren's Lovely Landscapes商店:
您会看到澳大利亚的印刷品缺货。 该产品类别以红色突出显示,因此无法选择。
为了模拟澳大利亚的打印品进货,您将访问Apache CouchDB文档并直接修改库存水平。
Apache CouchDB提供了一个简单的GUI,名为Futon,用于访问存储的文档。 将浏览器指向http://127.0.0.1:5984/_utils/以打开Futon GUI:
在被褥中,选择prints
。 打开文档并展开库存商品编号3.双击澳大利亚打印以打开文档进行编辑。 将quan
字段从0
更改为3
。 单击右侧的绿色小选中标记图标,然后单击左上方的“ 保存文档 ”:
随着数据库中数量的更新,请在http:// localhost:8011 /重新加载浏览器页面。 您会看到商店现在存货充足。 澳大利亚打印不再标记为红色,可以选择。
当您使用三层Web应用程序时,Docker简化了中间层应用程序编码的开发工作流程,并促进了后端数据库的即时本地部署以进行测试。
结论
在这个竞争激烈的时代,如果不将Docker纳入开发工作流程,您将无法承受生活。 通过消除重复安装和卸载复杂的相互依赖的开发人员软件包和工具的需求,Docker可以缩短您的开发和探索时间。 利用Docker来提高您的多语言开发智商并大大提高您的开发效率。
翻译自: https://www.ibm.com/developerworks/web/library/wa-docker-polyglot-programmers/index.html
docker 开发者