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

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

学习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 1552
在云计算产业界,一场由一个技术掀起的革命正在悄悄上演:名不见经传的小公司横插进IT大佬构筑的云生态产业链,各路IT企业纷纷拥抱该技术并接纳该公司,云计算的构建方式和实施方式也即将发生或多或少的改变。这个技术就是Docker,这个公司便是dotCloud。 DotCloud本是家新创业小公司,基本无...
改善 Docker 镜像系统安全性的补救措施
views 1699
最近在使用Docker下载一个“官方”容器镜像时我看到这么一行提示:   ubuntu:14.04: The image you are pulling has been verified 我当时以为这和Docker极力推荐的镜像签名系统有关,所以并未深究。后来,在研究Docker镜...
容器领域趋势分析:多点开花,Docker不再一家独大...
views 1376
就在去年的10月份,大家似乎都钟爱Docker。你要是以为Docker就是容器领域的唯一玩家,那也情有可原。 Docker本身其实只是在2014年下半年才备受关注,Docker 1.0在之前的6月份首次亮相。但在6月份到10月份这短短几个月的时间里,Docker人气一路飙升,红帽在新的RHEL 7...
赞!Docker生态系统常用组件介绍 开启快乐开发之旅...
views 2280
Docker已经为开发者和管理员提供一个简单的平台来创建和部署可扩展的应用。本篇文章是介绍Docker生态系统的系列文章的第一篇在这个系列中,作者将探索Docker如何与其他组件整合在一起,并用它们提供的工具集来便捷地提供高可用性的分布式系统。本篇文章不仅从概念上介绍了容器化、服务发现和全局配置存储...
专访Docker中文社区创始人马全一: Docker正走在成为领域标准的路上 – 51C...
views 1603
凭借其方便的可移植性和开源 Linux 容器引擎,Docker在云计算领域的人气飙升。其实使用 Linux 容器技术并不是什么新鲜事,国内的各大互联网公司内部都有基于 Linux 容器引擎的平台在为业务部门提供服务。一个开源的项目能否在商业上取得成功,很大程度上依赖三件事 —— 成功的 User C...
尽快势头迅猛,但企业拥抱Docker时机未到...
views 1363
2014年Docker容器及其围绕着它的生态系统呈指数级的增长,但是不要期待2015年就会见到企业级的大量采用。 大大小小的公司在2014年试着让自己搭上Docker顺风车,虽然这个开源容器技术和它不断成长的生态系统让业界对其潜能感到晕头转向,但不要期望2015年会成为企业广泛使用Docker...
Docker 传奇之 dotCloud
views 1162
2010年,几个大胡子年轻人在旧金山成立了一家做 PaaS 平台的公司,起名为「dotCloud」,这个名字让我想起了微软的「DotNet」。 dotCloud 主要是基于 PaaS 平台为开发者或开发商提供技术服务。什么是 PaaS 呢?PaaS 的全称是 Platform as ...
在AWS上运行Docker:一个更好的开发&测试体验...
views 1595
假如你正在为一个跟踪健康和健身的移动应用编写REST API。一开始你在你的笔记本上的开发环境中编写代码,在运行了所有单元测试并成功通过后,你将所有代码提交到Git,并且通知QA工程师测试。然而,当QA工程师认真地将最新版本代码部署到测试环境后却发现,这个新开发的REST程序往往连前几分钟的测试都通...

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

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

发表评论


读者排行