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。