Docker是2014年最火的技术之一,几乎所有的程序员都听说过。Docker是一种“轻量级”的容器技术,几乎撼动了传统虚拟化技术的地位。现在国内外越来越多的公司开始逐步使用Docker来替代现有的虚拟化平台。作为一名Java程序员,是时候让我们一起学习Docker了!本文将对虚拟化技术和Docker容器技术进行比较,然后介绍一些Docker术语,如:容器、镜像等,然后使用Docker搭建JavaWeb运行环境,***会做一个总结这篇文章的。我们先回顾一下传统虚拟化技术的架构:可以看出,我们可以在宿主操作系统上安装多个虚拟机,在每个虚拟机中,通过虚拟化技术实现一次虚拟化操作。系统,然后,您可以在虚拟操作系统上安装所需的应用程序。这一切看似很简单,但其中的技术细节却相当高深莫测,就算是大神级人物也未必能够解释清楚。用过虚拟机的人应该都知道,启动虚拟机就像启动一台电脑一样。初始化过程比较慢,需要等待很长时间才能看到登录界面。虚拟机一旦启动,就可以与宿主机建立网络连接,保证虚拟机与宿主机互联互通。不同的虚拟机之间是相互隔离的,也就是说彼此不知道对方的存在,但是每个虚拟机都占用宿主机的硬件和网络资源。我们再对比一下Docker技术的架构:可以看出在宿主机的操作系统上运行着一个Docker服务(或者说“Docker引擎”)。在这个服务上,我们可以打开多个Docker容器。每个Docker容器都可以运行自己需要的应用程序,Docker容器之间也是相互隔离的。同样,它们都占用宿主机的硬件和网络资源。与虚拟机相比,Docker容器在技术实现上完全不同,启动速度与虚拟机相比有本质的飞跃。启动一个容器只是一眨眼的功夫。无论是虚拟机还是Docker容器,都是用来隔离应用程序的运行环境,节省我们的硬件资源,为我们的开发者提供收益。我们再看一下Docker的logo:分明就是一头鲸鱼托着很多容器。我们可以把宿主想象成鲸鱼,把孤立的容器想象成容器,每个容器都包含自己的应用。这个Logo简直太形象了!需要强调的是,作者并不是否定虚拟化技术,而是想通过这篇文章让更多的读者了解如何使用Docker技术,让大家知道除了虚拟化技术,还有另一种替代技术也可以做应用隔离起来。下面,我们将结合一个JavaWeb应用的部署过程,来讲述如何“烹制”出Docker这道美味佳肴。你准备好了吗?让我们现在开始吧!原材料前提首先需要准备一个CentOS操作系统,一个虚拟机也行。总之,你可以通过Linux客户端工具访问CentOS操作系统。需要注意的是,Ubuntu或者其他Linux操作系统也可以玩Docker,不过本文选择以CentOS为例,仅此而已。CentOS的具体要求如下:必须是64位操作系统。建议内核3.8以上。通过以下命令检查您的CentOS内核:1uname-r如果执行上述命令后输出的内核版本号低于3.8,请参考以下方法升级您的Linux内核。对于CentOS6.5,默认内核版本为2.6。首先,使用以下命令安装***内核:123rpm--importhttps://www.elrepo.org/RPM-GPG-KEY-elrepo.orgrpm-ivhhttp://www.elrepo。org/elrepo-release-6-5.el6.elrepo.noarch.rpmyum-y--enablerepo=elrepo-kernelinstallkernel-lt然后,编辑以下配置文件:1vi/etc/grub.conf更改default=1默认为0。***、通过reboot命令重启操作系统。如果重启后没有意外,再次检查内核,你的CentOS内核会显示为3.10。如果你到了这里,你和我们预期的结果是一样的。恭喜!让我们一起安装Docker。要安装Docker,只需使用以下命令安装Docker软件:12rpm-Uvhhttp://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpmyum-yinstalldocker-io可以使用如下命令查看Docker是否安装成功:1dockerversion如果输出了Docker的版本号,说明安装成功,下面我们就可以开始使用Docker了。Docker服务可以通过以下命令启动:1ervicedockerstart和安装软件一样,我们首先需要一张刻录了软件的光盘,如果你使用的是虚拟光驱,则需要运行一个名为“image”文件,通过它来安装软件。在Docker的世界里,还有一个叫做“镜像”的东西,里面安装了我们需要的操作系统,我们一般称之为“Docker镜像”,简称为本文中的“镜像”。那么问题来了,我们从哪里下载镜像呢?Docker官网确实提供了所有的镜像下载地址,可惜国内无法访问。幸好国内好心人提供了一个Docker中文网站,我们可以在这里下载我们需要的Docker镜像。下载镜像我们不妨以CentOS为例,通过以下步骤下载一个CentOS镜像。首先访问Docker中文网,在首页搜索名为“centos”的镜像。在搜索结果中,有一个“官方镜像”,这就是我们所需要的。然后,进入CentOS官方镜像页面,在“Pullthisrepository”输入框中,有一个命令,复制它,在你自己的命令行运行命令,然后镜像会立即下载下来。***,使用以下命令查看所有本地镜像:1dockerimages下载完成后,你应该看到:12REPOSITORYTAGIMAGEIDCREATEDVIRTUALSIZEdocker.cn/docker/centoscentos625c5298b1a367weeksago215.8MB如果看到上面的输出,说明可以使用镜像“docker.cn/docker/centos”,或者称它为仓库(Repository),镜像有一??个标签(Tag),名称为“centos6”,另外还有是一个名为“25c5298b1a36”的镜像ID(可能你看到的镜像ID和这里的不一样,这很正常,因为这个数字是随机生成的)。另外我们可以看到镜像只有215.8MB,非常小,没有虚拟机的镜像文件那么大。现在镜像已经可用,我们需要使用这个镜像来启动容器。启动容器容器运行在镜像的基础上。容器启动后,我们就可以登录容器,安装我们需要的软件或应用程序。既然镜像已经下载到本地了,那么我们如何启动容器呢?使用如下命令启动容器即可:1dockerrun-i-t-v/root/software/:/mnt/software/25c5298b1a36/bin/bash这条命令比较长,我们分解一下,其实包括以下三个部分:1dockerrun<相关参数><镜像ID><初始命令>其中,相关参数包括:-i:表示以“交互模式”运行容器-t:表示输入其命令容器启动后一行-v:表示需要挂载到容器中的本地目录,格式:-v<宿主机目录>:<容器目录>假设我们所有的安装程序都放在宿主机的/root/software/目录下,现在我们需要将它挂载到容器的/mnt/software/目录下。需要注意的是,不一定要用“镜像ID”,也可以用“仓库名:标签名”,例如:docker.cn/docker/centos:centos6。初始命令表示容器启动后需要运行的命令。这时候用“/bin/bash”表示什么都不要做,直接输入命令行即可。安装相关软件为了搭建JavaWeb运行环境,我们需要安装JDK和Tomcat。以下过程均在容器内部进行。我们不妨选择/opt/目录作为安装目录。首先,我们需要通过cd/opt/命令进入目录。安装JDK首先,解压JDK包:1tar-zxf/mnt/software/jdk-7u67-linux-x64.tar.gz-C。然后,重命名JDK目录:1mvjdk1.7.0_67/jdk/安装Tomcat首先,解压Tomcat包:1tar-zxf/mnt/software/apache-tomcat-7.0.55.tar.gz-C。然后,重命名Tomcat目录:1mvapache-tomcat-7.0.55/tomcat/设置环境变量首先,编辑.bashrc文件1vi~/.bashrc然后,在文件末尾添加如下配置:12exportJAVA_HOME=/opt/jdkexportPATH=$PATH:$JAVA_HOME***,需要使用source命令让环境变量生效:1source~/.bashrc写一个运行脚本我们需要写一个运行脚本。启动容器时,运行脚本启动Tomcat。具体过程如下:首先创建一个运行脚本:1vi/root/run.sh然后编辑脚本内容如下:123#!/bin/bashsource~/.bashrcsh/opt/tomcat/bin/catalina.shrun注意:这里必须先加载环境变量,然后使用Tomcat运行脚本启动Tomcat服务***、给运行脚本添加执行权限:1chmodu+x/root/run.sh退出容器当以上所有步骤完成后,就可以使用exit命令退出容器了。然后,可以使用如下命令查看正在运行的容器:1dockerps此时应该看不到任何正在运行的程序,因为刚才用exit命令退出的容器处于停止状态,而你可以使用如下命令查看所有容器:1dockerps-a输出结果如下:12CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES57c312bbaad1docker.cn/docker/centos:centos6"/bin/bash"27分钟前退出(0)19秒前naughty_goldstine记住上面的CONTAINERID(容器ID),接下来我们就用这个容器创建一个可以运行JavaWeb的镜像。创建JavaWeb镜像使用以下命令根据一个“容器ID”创建一个新的“镜像”:1dockercommit57c312bbaad1huangyong/javaweb:0.1容器的ID为“57c312bbaad1”,创建的镜像名称是“huangyong/javaweb:0.1”,这个镜像就可以用来启动JavaWeb容器了。启动JavaWeb容器,需要使用dockerimages命令查看当前所有镜像:123REPOSITORYTAGIMAGEIDCREATEDVIRTUALSIZEhuangyong/javaweb0.1fc826a4706af38秒前562.8MBdocker.cn/docker/centoscentos625c5298b1a367周前215.8MB可见,现在你看到了***创建的镜像“huangyong/javaweb:0.1”,镜像ID为“fc826a4706af”。如上所述,我们可以通过“镜像名称”或“镜像ID”来启动容器。和上次启动容器不同,我们不再进入容器的命令行,而是直接启动容器内部的TomcatServe。此时需要使用如下命令:1dockerrun-d-p58080:8080--namejavawebhuangyong/javaweb:0.1/root/run.sh稍微解释一下:-d:表示执行/root/run.sh脚本,此时Tomcat控制台不会出现在输出终端上。-p:表示宿主机和容器之间的端口映射。此时容器内部的8080端口映射到宿主机的58080端口,这样58080端口就暴露在外面了,容器内部的8080端口就可以通过Docker桥访问了。--name:表示容器名称,取一个有意义的名字即可。关于Dockerbridge的内容,我们需要补充说明一下。实际上,Docker已经为宿主机和容器之间的网络通信搭建了一座桥梁。我们可以通过宿主机IP地址和端口号来映射容器内部的IP地址和端口号。一连串的参数后面就是“镜像名称”或者“镜像ID”,哪个方便。***是“初始命令”,也就是上面写的运行脚本,里面封装了加载环境变量的命令和启动Tomcat服务,运行上面的命令后,马上会输出一长串“容器ID”,我们可以使用dockerps命令查看当前运行的容器。12CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES82f47923f926huangyong/javaweb:0.1"/root/run.sh"4secondsagoUp3seconds0.0.0.0:58080->8080/tcpjavaweb在浏览器中输入以下地址,可以访问Tomcat主页:1http://192.168.65.132:58080/注意:这里使用的是宿主机的IP地址,对外暴露的端口号58080,里面映射的是8080端口号容器。小结通过这篇文章,我们了解了什么是Docker?它和虚拟机有什么区别?以及如何安装Docker?如何下载Docker镜像?如何运行Docker容器?如何在容器中安装应用程序?如何在容器上创建镜像?如何启动容器即服务?这一切看似简单,操作起来却相当繁琐,但熟能生巧,需要我们不断地练习。除了这种手动生成Docker镜像的方式,还有一种更像写代码的方式来自动创建Docker镜像。我们只需要写一个Dockerfile文件,然后使用dockerbuild命令就可以完成上面所有的手动操作。不要太惊讶,一切都在黑暗中……
