跳转至

Dockerfile示例

为了更好的理解如何通过 Dockerfile 打包成 Image 镜像,这里给出两个示例演示下如何一步步从源码打包成 Docker 镜像。

maven打包并生成Docker image

1、整体步骤

1
2
3
4
yum -y install java-1.8.0-openjdk.x86_64 maven
git clone [email protected]:361way/java.git
mvn package -Dmaven.test.skip=true -U -e -X -B
docker build -t javaweb-demo:v1 .

2、maven参数说明

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 功能:  打包
# 参数说明:
#               -Dmaven.test.skip=true:跳过单元测试
#               -U:每次构建检查依赖更新,可避免缓存中快照版本依赖不更新问题,但会牺牲部分性能
#               -e -X :打印调试信息,定位疑难构建问题时建议使用此参数构建
#               -B:以batch模式运行,可避免日志打印时出现ArrayIndexOutOfBoundsException异常
# 使用场景: 打包项目且不需要执行单元测试时使用
mvn package -Dmaven.test.skip=true -U -e -X -B

#功能:打包;执行单元测试,但忽略单元测试用例失败,每次构建检查依赖更新
#使用场景: 需要执行单元测试,且使用构建提供的单元测试报告服务统计执行情况
# 使用条件:在”单元测试“中选择处理单元测试结果,并正确填写测试结果文件路径
#mvn package -Dmaven.test.failure.ignore=true -U -e -X -B

#功能:打包并发布依赖包到私有依赖库
#使用场景: 需要将当前项目构建结果发布到私有依赖仓库以供其他maven项目引用时使用
#注意事项: 此处上传的目标仓库为Devcloud私有依赖仓库,注意与软件发布仓库区分
#mvn deploy -Dmaven.test.skip=true -U -e -X -B
参数区别如下:

1
2
3
4
5
6
7
8
mvn clean package依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)等7个阶段。
mvn clean install依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install等8个阶段。
mvn clean deploy依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install、deploy等9个阶段。

# 由上面的分析可知主要区别如下,
package命令完成了项目编译、单元测试、打包功能,但没有把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库
install命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库,但没有布署到远程maven私服仓库
deploy命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库

3、Dockerfile文件编写

这里dockerfile文件是我自己写的,demo代码参考的devcloud里的最简单的hello-world代码(比较简单,自己也可以写一个):

1
2
3
4
FROM openjdk:8-jdk-alpine
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
这部分可以参考: Spring Boot with Docker

4.编译与打包一体

1
2
3
4
5
6
7
8
FROM  maven:3.3-jdk-8
ADD .  /usr/src/mymaven
RUN  cd /usr/src/mymaven && \
     mvn clean install

FROM openjdk:8-jdk-alpine
COPY --from=0 /usr/src/mymaven/target/*.jar  app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

先用maven包编译打包,再将打包好的结果编译成新的容器。

maven docker项

Tomcat 应用容器化

这里使用的测试使用的是一个Snoop Servlet编写的java程序,该程序可以获取请求的头信息,这里通过简单的示例展示如何将其容器化。

Dockerfile内容

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
[root@ecs-82f5 example]# cat Dockerfile
FROM centos:7

MAINTAINER [email protected]

RUN mkdir /opt/tomcat/

WORKDIR /opt/tomcat
RUN curl -O https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.79/bin/apache-tomcat-8.5.79.tar.gz
RUN tar xvfz apache*.tar.gz
RUN mv apache-tomcat-*/* /opt/tomcat/.
RUN yum -y install java
RUN java -version

WORKDIR /opt/tomcat/webapps
RUN curl -O -L https://github.com/AKSarav/SampleWebApp/raw/master/dist/SampleWebApp.war

EXPOSE 8080

CMD ["/opt/tomcat/bin/catalina.sh", "run"]
当然,这里也可以直接使用tomcat的基础镜像,这样就省去后面装tomcat、java的步骤,不过这里为了演示应用打包的过程,就选择了步骤更多的操作。

运行测试

1
2
docker build -t saravak/tomcat8 .
docker container run -it -d --name tomcatcontainer1 -p 8081:8080 saravak/tomcat8
这里省略了上传docker registry的操作,因为这里仅仅只是测试。如果是生产环境,像上面docker镜像制作时还得把manager页面删除。

运行完后,可以通过http://主机IP:8081/SampleWebApp/SnoopServlet去访问。 tomcat-docker

简单示例

在标例1里有提到可以省去tomcat、java的安装步骤,这里再搞一个简单的示例:

1
2
3
4
5
FROM tomcat:8.0-alpine
LABEL maintainer="[email protected]"
ADD sample.war /usr/local/tomcat/webapps/
EXPOSE 8080
CMD ["catalina.sh", "run"]
编译运行:
1
2
3
4
docker build -t myapp .
docker run -it -d -p 8888:8080 myapp:latest

# 访问 http://ip:8888/sample/访问
具体示例,参看 https://github.com/361way/docker/tree/master/tomcat 页面。

捐赠本站(Donate)

weixin_pay
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))