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

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

学习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的B2B服务思考:Docker到底解决了什么问题...
views 2221
我很喜欢Docker,它容易使用并且速度快,它真的很棒,以至于我每天都能看到与它有关的应用。但是话又说回来,Docker究竟解决了什么实际问题?稳定的环境?配置管理?高性价比的虚拟化? 我认为Docker解决了其它的问题。 我之前公司的主营业务是为客户提供B2B( business-to-busi...
阿里云产品博客 » 阿里云ECS拥抱Docker
views 1897
现在我们很高兴地宣布您能使用阿里云ECS部署Docker容器应用了。您能在ECS上把应用打包成Docker镜像、运行Docker容器,从我们提供的镜像库中快速下载官方镜像,或者部署自己的私有镜像库,并和伙伴们分享和协作。 什么是Docker? Docker是一个开源项目,诞生于2013年初,最初是...
改善 Docker 镜像系统安全性的补救措施
views 2224
最近在使用Docker下载一个“官方”容器镜像时我看到这么一行提示:   ubuntu:14.04: The image you are pulling has been verified 我当时以为这和Docker极力推荐的镜像签名系统有关,所以并未深究。后来,在研究Docker镜...
在Docker容器之间拷贝数据:原理与操作示例...
views 2093
ocker容器可以类比成一个目录,它可以将一个应用程序运行时所依赖的所有环境(注:此应用依赖的其他的服务或程序等)打包在一起运行;同时可 以随意的对它进行“启动”、“停止”、“移动”或者“删除”等操作。Docker容器在Linux的命名空间(Namespace)机制下被激活,这样就 可以使得运行在同...
在AWS上运行Docker:一个更好的开发&测试体验...
views 2167
假如你正在为一个跟踪健康和健身的移动应用编写REST API。一开始你在你的笔记本上的开发环境中编写代码,在运行了所有单元测试并成功通过后,你将所有代码提交到Git,并且通知QA工程师测试。然而,当QA工程师认真地将最新版本代码部署到测试环境后却发现,这个新开发的REST程序往往连前几分钟的测试都通...
别慌!Docker容器内不能联网的6种解决方案...
views 3273
注:下面的方法是在容器内能ping通公网IP的解决方案,如果连公网IP都ping不通,那主机可能也上不了网(尝试ping 8.8.8.8) 1.使用--net:host选项 sudo docker run --net:host --name ubuntu_bash -i -t ubunt...
Amazon发布免费的AWS EC2 Container服务,且支持Docker...
views 1857
近日,在AWS re:Invent云计算大会上的第二场主题演讲中,Amazon的CTO Werner Vogels宣布发布AWS EC2 Container服务。目前,AWS EC2 Container服务预览版免费提供于开发者,开发者可以在官网进行注册使用。这是一项高度可扩展、高性能、免费的容器...
云计算之Docker:颠覆者还是昙花一现
views 2091
在云计算产业界,一场由一个技术掀起的革命正在悄悄上演:名不见经传的小公司横插进IT大佬构筑的云生态产业链,各路IT企业纷纷拥抱该技术并接纳该公司,云计算的构建方式和实施方式也即将发生或多或少的改变。这个技术就是Docker,这个公司便是dotCloud。 DotCloud本是家新创业小公司,基本无...

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

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

发表评论


读者排行