本篇以 jdk8+tomcat7+springmvc 的项目为例,讲解从项目代码,发布成docker镜像的过程。
(springmvc是因为本人最近正好要把公司的旧项目docker化)
docker安装:https://www.runoob.com/docker/centos-docker-install.html (我的服务器使用的是centos)
docker入门教程:https://www.runoob.com/docker/docker-tutorial.html
本Dockerfile脚本的作用:
(当然还可以直接用yum apt 等命令进行软件的安装,网上也有很多教程,这里主要是因为旧项目的缘故,对于jdk,tomcat需要使用指定的稳定低版本,并且本地包比较方便进行参数设置,比如xmx xms ,tomcat线程池 等,改好配置后直接覆盖到压缩包即可)
(实际映射是在docker的run命令中指定,比如docker run -it -p 8888:8080 42de6733ade4,即将容器的8080端口映射到宿主机器的8888端口)
#使用的基础镜像
FROM centos
#不指定版本tag,则默认pull最新的
#创建者信息
MAINTAINER
#安装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"]
docker-maven-plugin的官方github: https://github.com/spotify/docker‐maven‐plugin
放到web项目的pom.xml 文件的
com.spotify
docker-maven-plugin
0.4.13
${project.artifactId}:${project.version}
${project.basedir}/docker
/
${project.build.directory}
${project.build.finalName}.war
http://ip:2375
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的服务器。(如果还没有,额... 先去安装吧,拜拜)
这里以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镜像的过程吧
我的老祖宗工程是一个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内)