分享

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

问题导读
1、你是如何应用docker的?
2、如何停止容器?
3、如何使用Docker卷来持久化数据?





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

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

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


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




前提条件
要完成本教程,你需要:




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


  • 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. COPY jdk-8u25-linux-x64.tar.gz /opt/java/
  10. change dir to Java installation dir
  11. WORKDIR /opt/java/
  12. RUN tar -zxf jdk-8u25-linux-x64.tar.gz
  13. setup environment variables
  14. RUN update-alternatives --install /usr/bin/javac javac /opt/java/jdk1.8.0_25/bin/javac 100
  15. RUN update-alternatives --install /usr/bin/java java /opt/java/jdk1.8.0_25/bin/java 100
  16. RUN update-alternatives --display java
  17. RUN java -version
  18. Expose the ports we're interested in
  19. EXPOSE 8080 9990
  20. Set the default command to run on boot
  21. This will boot WildFly in the standalone mode and bind to all interface
  22. 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的目录。

上述命令的输出如下:
5077f2ff43d04d1ae791be3fb414196c.png


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


启动容器

使用这一命令启动容器:
  1. docker -H tcp://127.0.0.1:2375 run -p 8180:8080 javaee_sample
复制代码


  • -p指定容器端口到主机端口的映射;
  • run是命令本身;
  • javaee_sample是镜像名。

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

运行多个容器

我们可以实例化多个容器,因为它们的端口在宿主上不会发生冲突。我将再启动两个容器并将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
复制代码


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


你可以通过容器的ID或名字来停止容器:
  1. docker -H tcp://127.0.0.1:2375 stop suspicious_lovelace
复制代码


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

#################################
原文链接:http://dockerone.com/article/146

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条