微服务实战(十九)Docker篇 从代码工程发布到Docker镜像的详细过程

本篇以 jdk8+tomcat7+springmvc 的项目为例,讲解从项目代码,发布成docker镜像的过程。

(springmvc是因为本人最近正好要把公司的旧项目docker化)

主要流程

  1. 编写Dockerfile脚本 并 验证生成的镜像是否正确  (jdk+tomcat+项目war包)
  2. 集成Maven-Docker插件  (将本地工程结合Dockerfile脚本 打包镜像至Docker仓库)
  3. 完善:打包命令区分环境(生产/测试),直接用maven命令制作不同环境的包
  4. 测试拉取镜像并运行   (在 生产/测试服务器 拉取做好的 生产/测试镜像 )

实现效果

  1. 使用maven的package 命令,直接生成docker镜像,发布到指定的docker仓库。
  2. 应用服务器用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内)

猜你喜欢

转载自blog.csdn.net/u011177064/article/details/107576154