本篇以 jdk8+tomcat7+springmvc 的项目为例,讲解从项目代码,发布成docker镜像的过程。
(springmvc是因为本人最近正好要把公司的旧项目docker化)
主要流程
- 编写Dockerfile脚本 并 验证生成的镜像是否正确 (jdk+tomcat+项目war包)
- 集成Maven-Docker插件 (将本地工程结合Dockerfile脚本 打包镜像至Docker仓库)
- 完善:打包命令区分环境(生产/测试),直接用maven命令制作不同环境的包
- 测试拉取镜像并运行 (在 生产/测试服务器 拉取做好的 生产/测试镜像 )
实现效果
- 使用maven的package 命令,直接生成docker镜像,发布到指定的docker仓库。
- 应用服务器用docker命令拉取镜像,运行,完成 应用全量更新/新节点部署
docker的安装
docker安装:https://www.runoob.com/docker/centos-docker-install.html (我的服务器使用的是centos)
docker入门教程:https://www.runoob.com/docker/docker-tutorial.html
编写Dockerfile
本Dockerfile脚本的作用:
- 创建centos操作系统
- 将本地的jdk,tomcat压缩包复制到docker镜像内
(当然还可以直接用yum apt 等命令进行软件的安装,网上也有很多教程,这里主要是因为旧项目的缘故,对于jdk,tomcat需要使用指定的稳定低版本,并且本地包比较方便进行参数设置,比如xmx xms ,tomcat线程池 等,改好配置后直接覆盖到压缩包即可)
- 复制打包好的项目war包到docker镜像内
- 对外声明开放的容器端口 8080
(实际映射是在docker的run命令中指定,比如docker run -it -p 8888:8080 42de6733ade4,即将容器的8080端口映射到宿主机器的8888端口)
#使用的基础镜像
FROM centos
#不指定版本tag,则默认pull最新的
#创建者信息
MAINTAINER <zhaojunfu> <[email protected]>
#安装wget
RUN yum install -y wget
#复制本地jdk tomcat
COPY jdk-7u71-linux-x64.tar.gz /var/tmp/jdk-7u71-linux-x64.tar.gz
COPY apache-tomcat-7.0.76.tar.gz /var/tmp/apache-tomcat-7.0.76.tar.gz
#安装JDK
RUN mkdir -p /usr/java/jdk \
&& tar -zxf /var/tmp/jdk-7u71-linux-x64.tar.gz -C /usr/java/jdk \
&& rm -rf /var/tmp/jdk-7u71-linux-x64.tar.gz \
#安装Tomcat
&& mkdir -p /usr/java/tomcat \
&& tar -xzf /var/tmp/apache-tomcat-7.0.76.tar.gz -C /usr/java/tomcat \
&& rm -rf /var/tmp/apache-tomcat-7.0.76.tar.gz
#配置JDK环境变量
ENV JAVA_HOME /usr/java/jdk/jdk1.7.0_71
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH .:$JAVA_HOME/lib:$JRE_HOME/lib
ENV PATH $PATH:$JAVA_HOME/bin
#配置Tomcat环境变量
ENV CATALINA_HOME /usr/java/tomcat/apache-tomcat-7.0.76
#指定容器暴露端口
EXPOSE 8080
#添加项目
COPY house-web.war /usr/java/tomcat/apache-tomcat-7.0.76/webapps/
#创建容器时默认启动tomcat
CMD ["/usr/java/tomcat/apache-tomcat-7.0.76/bin/catalina.sh", "run"]
集成Maven的docker插件
docker-maven-plugin的官方github: https://github.com/spotify/docker‐maven‐plugin
放到web项目的pom.xml 文件的 <build><plugins>中
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<!-- 镜像名称 -->
<imageName>${project.artifactId}:${project.version}</imageName>
<!-- 指定Dockerfile的目录 -->
<dockerDirectory>${project.basedir}/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.war</include>
</resource>
</resources>
<!-- 远程 docker 宿主机地址 -->
<dockerHost>http://ip:2375</dockerHost>
</configuration>
</plugin>
imageName: 要构建的镜像名称,我这里是使用了项目名+版本号
dockerDirectory:填写Dockerfile文件地址,我这里是放在了 工程根目录/docker
resources: 资源文件,maven的package命令会把项目文件打包好放在 工程根目录/target 下面,而此处的配置就是把<targetPath>下的<directory>/<include>文件复制到/docker中,因为docker在build时如果需要ADD/COPY文件到镜像内,只认Dockerfile同级目录的文件,所以需要把target生成的项目文件复制到docker目录中
加入docker的maven插件后,运行 docker:build 的maven命令,插件会将在远程的docker宿主机中根据Dockerfile进行镜像构建。
通常结合 package使用,比如:clean package docker:build
先别着急运行,因为远程docker宿主机还没配置呢!
远程Docker宿主机配置
镜像的构建最终还是需要在装有docker的宿主机中进行运行的,假设现在我们已经有了一台装有docker的服务器。(如果还没有,额... 先去安装吧,拜拜)
这里以centos7的服务器为例:
修改docker的配置文件
vim /usr/lib/systemd/system/docker.service
找到 ExecStart= , 在后面添加 -H tcp://0.0.0.0:2375
0.0.0.0 为不限制IP, 这里可以改为具体IP , 2375 是默认的docker对外API的端口号, 这里建议最好是在服务器防火墙限定此端口只针对固定IP开放
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375
改完之后需要让配置生效,并且重启docker服务
systemctl daemon-reload
systemctl restart docker
配置完成后,我们把pom.xml中的dockerHoust 改为我们配置好的docker服务地址
<!-- 远程 docker 宿主机地址 -->
<dockerHost>http://ip:2375</dockerHost>
项目打包发布
说了这么多,我们正式进入到项目从开发工程发布成Docker镜像的过程吧
我的老祖宗工程是一个maven的web项目,现在我在工程根目录创建了docker文件夹,并放置了 jdk和tomcat压缩包。
最重要的是我们之前编写好的 Dockerfile
1、运行命令 clean package docker:build
2、去docker宿主机器查看镜像是否创建
3、运行镜像
docker run -it -p 8888:8080 house-web:0.0.2 --交互式运行,退出容器则停止运行
docker run -e -p 8888:8080 house-web:0.0.2 --后台模式运行
可以看到web项目可以访问了(数据库是独立部署的,没有放入docker内)