Docker应用实践:一个简单的Java EE&Docker示例

时间:15-01-20 栏目:云计算技术, 虚拟化技术 作者:爱说云网 评论:0 点击: 1,879 次

学习Docker的最好办法就是迅速在工作中应用它,本文作者使用Docker部署了一个Java EE应用,非常简单和方便。需要注意的是,由于作者写作时本地网络有问题,所以Dockerfile中很多的资源都没有从网络下载,你再实践时,可以尝试修改。学习快乐 :)

本文中,我们将会把Java EE和Docker结合,具体内容如下:

  • 创建、构建并运行一个Docker镜像;
  • 通过镜像启动一个Wildfly服务器,并部署了一个JavaEE示例应用;
  • 展示一些常用的Docker命令;
  • 启动多个容器,并让同一应用运行于不同端口。

引言

在这里我不再介绍Docker,因为已经有太多的介绍性的文章。写本文之前,我阅读了如下教程:

前提条件

要完成本教程,你需要:

  • 有一个运行于宿主机上的Docker后台进程
  • 安装Docker后,在etc\default\docker文件中添加一行:DOCKER_OPTS="-H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock
  • 此后重启机器并尝试运行这个命令:docker -H tcp://127.0.0.1:2375 –version,输出应该类似这样的:Docker version 1.4.1, build 5bc2ff8
  • 一个Wildfly 8.2.0的安装程序(解压后的);
  • jdk-8u25-linux-x64.tar.gz文件。(http://www.oracle.com/technetwork/java/javase/downloads/index.html)
  • 下载 car-service.war。(https://github.com/rmpestano/javaee-docker-sample/blob/master/java_ee/car-service.war)
  • 下载 Dockerfile。(https://github.com/rmpestano/javaee-docker-sample/blob/master/java_ee/Dockerfile)

创建Docker镜像

Docker镜像展现/描述了容器本身。由于我的网络带宽有限(手机3G),在这里我使用本机资源创建了一个镜像。因此,这个镜像只有在包含如下文件的目录下构建才能使用:

  • wildfly-8.2.0.Final:应用服务器
  • car-service.war:要部署的应用
  • Dockerfile:描述容器的文件
  • jdk-8u25-linux-x64.tar.gz:要在容器里安装的java版本

注意:不推荐在Docker容器中使用本地资源,因为只有当所有文件都存在时镜像才可以正常构建。最好的办法是从头安装所有东西并下载必要的文件。

这是Dockerfile的内容:

  1. FROM ubuntu 
  2. MAINTAINER Rafael Pestano <rmpestano@gmail.com> 
  3. setup WildFly 
  4. COPY wildfly-8.2.0.Final /opt/wildfly 
  5. install example app on wildfy 
  6. COPY car-service.war /opt/wildfly/standalone/deployments/ 
  7. setup Java 
  8. RUN mkdir /opt/java 
  9.  
  10. COPY jdk-8u25-linux-x64.tar.gz /opt/java/ 
  11. change dir to Java installation dir 
  12. WORKDIR /opt/java/ 
  13.  
  14. RUN tar -zxf jdk-8u25-linux-x64.tar.gz 
  15. setup environment variables 
  16. RUN update-alternatives --install /usr/bin/javac javac /opt/java/jdk1.8.0_25/bin/javac 100 
  17.  
  18. RUN update-alternatives --install /usr/bin/java java /opt/java/jdk1.8.0_25/bin/java 100 
  19.  
  20. RUN update-alternatives --display java 
  21.  
  22. RUN java -version 
  23. Expose the ports we're interested in 
  24. EXPOSE 8080 9990 
  25. Set the default command to run on boot 
  26. This will boot WildFly in the standalone mode and bind to all interface 
  27. CMD ["/opt/wildfly/bin/standalone.sh""-c""standalone-full.xml""-b""0.0.0.0"

镜像继承自Ubuntu——一个安装了Ubuntu操作系统的镜像。Docker安装教程中就安装了Ubuntu镜像。

接着,我们将服务器复制到容器的/opt/wildfly目录。COPY是Dockerfile的一个指令。我们可以在这里找到所有命令。

我们随后将应用的war包复制到服务器中:

  1. COPY car-service.war /opt/wildfly/standalone/deployments/。 

然后,我们将Java解压安装到容器的/opt/java目录并设置一些环境变量。最好的办法是使用apt-get,不过这要求有互联网接入,而我写作时不具备这个条件。我使用RUN命令来执行java -version,(如果Java正确安装的话)它将在镜像构建时打印版本号。

之后,我使用EXPOSE 8080 9990来告诉Docker容器要暴露的端口号。容器其实是镜像的实例,运行镜像(docker run)时,我们可以指定允许宿主访问的端口。

最后,我们指定了默认命令:CMD ["/opt/wildfly/bin/standalone.sh", "-c", "standalone-full.xml", "-b", "0.0.0.0"]。每次容器启动时都会运行这个命令。

构建镜像

在描述完镜像之后,我们需要构建它。在包含Dockerfile的父目录运行以下命令:

  1. docker -H tcp://127.0.0.1:2375 build -t javaee_sample java_ee/ 
  • -H参数指定了Docker后台地址(使用TCP与后台通讯);
  • build是命令本身;
  • -t指定了用于识别镜像的标签名称(这里是javaee_sample);
  • java_ee/是包含用于描述镜像的Dockerfile的目录。

上述命令的输出如下:

然后我们可以通过列出镜像命令(译者注:docker images命令)来确认刚创建的镜像:docker -H tcp://127.0.0.1:2375 images:

启动容器

使用这一命令启动容器:

  1. docker -H tcp://127.0.0.1:2375 run -p 8180:8080 javaee_sample 
  • -p指定容器端口到主机端口的映射;
  • run是命令本身;
  • javaee_sample是镜像名。

容器启动过程中会输出Wildfly启动日志,这是因为我们将其设置为初始命令(CMD Dockerfile命令):

运行多个容器

我们可以实例化多个容器,因为它们的端口在宿主上不会发生冲突。我将再启动两个容器并将8080端口分别暴露为8280和8380:

  1. docker -H tcp://127.0.0.1:2375 run -p 8280:8080 javaee_sample 
  2. docker -H tcp://127.0.0.1:2375 run -p 8380:8080 javaee_sample 

要列出启动的容器,我们可以使用命令:docker -H tcp://127.0.0.1:2375 ps,这是输出结果:

  1. rmpestano@rmpestano-ubuntu:~/docker /images$ docker -H tcp://127.0.0.1:2375 ps 
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 
  3. 7b9079806e69 javaee_sample:latest "/opt/wildfly/bin/st 27 seconds ago Up 27 seconds 9990/tcp, 0.0.0.0:8280->8080/tcp suspicious_lovelace 
  4. d4975e825751 javaee_sample:latest "/opt/wildfly/bin/st 28 seconds ago Up 28 seconds 9990/tcp, 0.0.0.0:8380->8080/tcp loving_hopper 
  5. 96e58eb65126 javaee_sample:latest "/opt/wildfly/bin/st 42 seconds ago Up 42 seconds 9990/tcp, 0.0.0.0:8180->8080/tcp clever_cori 

现在我们可以在浏览器中同时访问这三个应用:

你可以通过容器的ID或名字来停止容器:

  1. docker -H tcp://127.0.0.1:2375 stop suspicious_lovelace 

记住,在容器删除时所有数据将消失。请使用Docker卷来持久化数据。

相关文章

容器领域趋势分析:多点开花,Docker不再一家独大...
views 1273
就在去年的10月份,大家似乎都钟爱Docker。你要是以为Docker就是容器领域的唯一玩家,那也情有可原。 Docker本身其实只是在2014年下半年才备受关注,Docker 1.0在之前的6月份首次亮相。但在6月份到10月份这短短几个月的时间里,Docker人气一路飙升,红帽在新的RHEL 7...
尽快势头迅猛,但企业拥抱Docker时机未到...
views 1250
2014年Docker容器及其围绕着它的生态系统呈指数级的增长,但是不要期待2015年就会见到企业级的大量采用。 大大小小的公司在2014年试着让自己搭上Docker顺风车,虽然这个开源容器技术和它不断成长的生态系统让业界对其潜能感到晕头转向,但不要期望2015年会成为企业广泛使用Docker...
别慌!Docker容器内不能联网的6种解决方案...
views 2484
注:下面的方法是在容器内能ping通公网IP的解决方案,如果连公网IP都ping不通,那主机可能也上不了网(尝试ping 8.8.8.8) 1.使用--net:host选项 sudo docker run --net:host --name ubuntu_bash -i -t ubunt...
改善 Docker 镜像系统安全性的补救措施
views 1610
最近在使用Docker下载一个“官方”容器镜像时我看到这么一行提示:   ubuntu:14.04: The image you are pulling has been verified 我当时以为这和Docker极力推荐的镜像签名系统有关,所以并未深究。后来,在研究Docker镜...
Amazon发布免费的AWS EC2 Container服务,且支持Docker...
views 1254
近日,在AWS re:Invent云计算大会上的第二场主题演讲中,Amazon的CTO Werner Vogels宣布发布AWS EC2 Container服务。目前,AWS EC2 Container服务预览版免费提供于开发者,开发者可以在官网进行注册使用。这是一项高度可扩展、高性能、免费的容器...
专访Docker中文社区创始人马全一: Docker正走在成为领域标准的路上 – 51C...
views 1560
凭借其方便的可移植性和开源 Linux 容器引擎,Docker在云计算领域的人气飙升。其实使用 Linux 容器技术并不是什么新鲜事,国内的各大互联网公司内部都有基于 Linux 容器引擎的平台在为业务部门提供服务。一个开源的项目能否在商业上取得成功,很大程度上依赖三件事 —— 成功的 User C...
阿里云产品博客 » 阿里云ECS拥抱Docker
views 1235
现在我们很高兴地宣布您能使用阿里云ECS部署Docker容器应用了。您能在ECS上把应用打包成Docker镜像、运行Docker容器,从我们提供的镜像库中快速下载官方镜像,或者部署自己的私有镜像库,并和伙伴们分享和协作。 什么是Docker? Docker是一个开源项目,诞生于2013年初,最初是...
在Docker容器之间拷贝数据:原理与操作示例...
views 1392
ocker容器可以类比成一个目录,它可以将一个应用程序运行时所依赖的所有环境(注:此应用依赖的其他的服务或程序等)打包在一起运行;同时可 以随意的对它进行“启动”、“停止”、“移动”或者“删除”等操作。Docker容器在Linux的命名空间(Namespace)机制下被激活,这样就 可以使得运行在同...

声明: 本文由( 爱说云网 )原创编译,转载请保留链接: Docker应用实践:一个简单的Java EE&Docker示例

Docker应用实践:一个简单的Java EE&Docker示例:等您坐沙发呢!

发表评论


读者排行