Run java project in Docker - downgoon/hello-world GitHub Wiki

在Docker中运行你的Java程序

下载JAVA项目

git clone https://github.com/giantswarm/sparkexample

运行其中的Dockerfile

docker build -t downgoon/sparkexample .

说明:

  • docker build 是构建docker 镜像。没有指定Dockerfile文件名,默认就是指定目录下的名叫Dockerfile的文件。
  • 参数t是tag的意思,表示对这个待构建好的镜像起一个名字。通常是两级结构downgoon/spackexample,其中downgoon是namespace,如果我们的镜像最终发布到一个公网,比如dockerhub,那么downgoon通常就是你在dockerhub的用户名。如果你随意写别人的名字,到时候没有权限发布。当然如果你只在本地运行,不发布到远程,那无所谓。
  • 目录.表示当前目录。

附录:查看其中Dockerfile

FROM java:8 

# Install maven
RUN apt-get update  
RUN apt-get install -y maven

WORKDIR /code

# Prepare by downloading dependencies
ADD pom.xml /code/pom.xml  
RUN ["mvn", "dependency:resolve"]  
RUN ["mvn", "verify"]

# Adding source, compile and package into a fat jar
ADD src /code/src  
RUN ["mvn", "package"]

EXPOSE 4567  
CMD ["/usr/lib/jvm/java-8-openjdk-amd64/bin/java", "-jar", "target/sparkexample-jar-with-dependencies.jar"]  

这个Dockerfile大概描述的东西:

  • 依赖Java 8: FROM java:8 表示一个基础镜像,本镜像是在基础镜像的基础上,增加后续东西。

  • 安装Maven: Docker本身是基于Linux内核的,所以在内核上运行apt-get命令来安装Maven。

  • 创建工作目录: 创建一个工作目录叫/code,并把本地的pom.xml拷贝到容器的/code/pom.xml。本地的pom.xml在哪里?就在Java Project的根目录下,根目录下除了有pom.xml,还有Dockerfile。同时把本地的源代码src目录,拷贝到容器的/code/src。

    提醒

以上三步,相当于传统方式的RD预先通知OP安装环境,包括JDK8、Maven,然后上传代码。

  • 编译打包:代码“上传”完后,就是运行mvn pacakge来编译打包。
  • 开通网络端口: 程序里面需要启动一个端口是4567。类似传统方式下部署的时候,需要跟OP说防火墙开通4567口子。当然最终对外的时候,OP可以用其他端口映射过来。
  • 运行程序: 一切环境搞定后,自然是 java -jar target/sparkexample-jar-with-dependencies.jar运行。容器内监听的是4567端口。

启动应用程序

docker run -d -p 8080:4567 downgoon/sparkexample

测试

curl http://localhost:8080
hello from sparkjava.com

回顾小结

在Docker容器中运行你的Java程序,仅仅需要在你原来的Java程序中,增加一个Dockerfile脚本文件。 这个脚本文件就是一种规约,这个规约描述了请运维人员如何运行你的程序。

之所以用“规约”这个词,是因为在Docker出现之前,如果你让运维运行你的程序,你可以有两种方式:

  • 写个文档: 文档里面一步步描述了改如何运行这个程序。比如需要安装Java8,需要Maven,然后需要开启4567端口等等。
  • 写个bash脚本: 文档描述沟通效率低下,如果想自动化,我们可以写一个bash脚本,让bash脚本把这个事情都做了。但是bash需要依赖外部很多资源,缺乏一个集中管理的机制。

Docker的出现,有一个非常厉害的地方,就是把这些都标准化了,制定成了一种规约。RD与OP之间的交流,仅限一个Dockerfile。

参考资料