zl程序教程

您现在的位置是:首页 >  其他

当前栏目

SpringBoot微服务项目打包成Docker镜像详解

2023-03-15 22:05:34 时间


SpringBott打包成Docker镜像的两种方式

  • 将springboot项目打成一个jar包,上传linux服务器指定目录下,然后再对应的目录下编写一个Dockefile文件,然后进行打包
  • IDEA集成Docker插件,通过maven的docker插件,远程打包成镜像弄到linux上,并且可以在本机的IDEA中操作容器和镜像

下面介绍的是第二种方式,而不是第一种


第一步: 配置Docker的远程访问

1.修改 /usr/lib/systemd/system/docker.service

vim /usr/lib/systemd/system/docker.service

2.替换ExecStart

将
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock 
替换为
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

3.重启Docker服务

systemctl daemon-reload
systemctl restart docker

4.查看2375端口是否被监听

netstat -nlpt

5.服务器防火墙开启2375端口

firewall-cmd --add-port=2375/top --permanent
firewall-cmd --reload
firewall-cmd --zone=public --list-ports

6.检查是否配置好

linux主机ip加2375端口号/version,如果出来了东西,表示配置成功


IDEA配置

Docker插件安装,并设置远程docker的地址


pom.xml添加maven-docker插件,自动生成镜像,并推送到仓库

如果使用maven-docker插件,可以选择在configuration标签中指定dockerfile的文件位置,也可以在configuration中自己配置替代dockerfile文件

下面第一种是指定dockfile文件的位置:

 <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.0.0</version>
<!--进行相关配置-->
                <configuration>
                    <!-- 指定 Dockerfile 路径  ${project.basedir}:项目根路径下-->
                    <dockerDirectory>${project.basedir}</dockerDirectory>
                    <!--指定生成的镜像名: 前缀/项目名称-->
                    <imageName>xfx/${project.artifactId}</imageName>
                    <!--指定标签-->
                    <imageTags>
                        <imageTag>latest</imageTag>
                    </imageTags>
                    <!-- 远程docker的地址-->
                    <dockerHost>Http://192.168.112.128:2375</dockerHost>
                    <!-- 这里是复制 jar 包到 docker 容器指定目录配置 -->
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <!--jar 包所在的路径  此处配置的 即对应 target 目录-->
                            <directory>${project.build.directory}</directory>
                            <!-- 需要包含的 jar包 ,这里对应的是 Dockerfile 中添加的文件名 -->
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>

                </configuration>
            </plugin>

对应的Dockerfile文件

#基础镜像通过java8来的
FROM java:8
#挂载卷是临时目录
VOLUME /tmp
#将Demo1-520.finnally.jar.jar  拷贝到容器内的的Demo1-520.finnally.jar.jar中(这个Demo1-520.finnally.jar.jar是自己生成的)
COPY target/Demo1-520.finnally.jar /xfx.jar
#暴露端口
EXPOSE 80
#执行命令java  -jar
ENTRYPOINT ["java","-jar","/xfx.jar"]

这里COPY的相对路径,是从当前Dockerfile所在目录开始

COPY target/Demo1-520.finnally.jar /xfx.jar

完全替代dockerfile文件

   <properties>
        <java.version>1.8</java.version>
        <docker.image.prefix>xfx</docker.image.prefix>
    </properties>

    <build>
        <plugins>
            <plugin>
<!--                springboot用来生成jar包的插件-->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>

            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.0.0</version>

<!--   configuration替代编写的Dockerfile文件             -->
                <configuration>
<!--                 指定基础镜像-->
                    <baseImage>java</baseImage>
<!--                    创作者本人的信息-->
                    <maintainer>dhy dhy@qq.com</maintainer>
<!--                    切换到root目录-->
                    <workdir>/ROOT</workdir>
<!--                    执行的命令-->
                    <cmd>["java","-version"]</cmd>
                    <entryPoint>["java","-jar","${project.build.finalName}.jar"]</entryPoint>
                    
<!--                    指定Dcokerfile路径,${project.basedir}:项目根路径-->
<!--                    <dockerDirectory>${project.basedir}</dockerDirectory>-->
                  
                    
                    <!--指定生成的镜像名: 镜像名前缀/项目名称-->
                    <imageName>${docker.image.prefix}/${project.artifactId}</imageName>
                    
                    <!--指定标签-->
                    <imageTags>
<!--                        可替换为当前项目的版本号-->
                        <imageTag>${project.version}</imageTag>
                    </imageTags>
                    
                    <!-- 远程docker api 地址-->
                    <dockerHost>Http://192.168.112.128:2375</dockerHost>
                    
                    <!-- 这里是复制 jar 包到 docker 容器指定目录配置 -->
                    <resources>
                        <resource>
<!--                            放到容器哪个目录下面-->
                            <targetPath>/ROOT</targetPath>
<!--                            用于指定需要复制的根目录-->
                            <!--jar 包所在的路径  此处配置的 即对应 target 目录-->
                            <directory>${project.build.directory}</directory>
<!--                            用于指定需要复制的文件-->
                            <!-- 需要包含的 jar包 ,这里对应的是 Dockerfile 中添加的文件名 -->
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>

                </configuration>
            </plugin>

        </plugins>
    </build>

如上用docker-maven插件,自动生成如下文件:

FROM java
MAINTAINER dhy dhy@qq.com
WORKDIR /ROOT
ADD /ROOT/Demo1.jar /ROOT/
ENTREPOINT ["java","-jar","Demo1.jar"]
CMD ["java","-version"]

执行mvn命令

mvn clean package docke:build
清理,打包,构建

执行mvn命令,有点繁琐,可以绑定插件的运行时间到maven执行打包的生命周期阶段

将Docker命令绑定到maven各个阶段

我们可以把Docker分为build,tag,push,然后分别绑定到Maven的package,deploy阶段

我们只需要执行mvn deploy就可以完成build,tag,push操作,当我们执行mvn build就只完成build,tag操作

                <executions>
      <!--当执行mvn package时,执行 mvn clean package docker:build-->
                    <execution>
                        <id>build-image</id>
                        <!--用户只需执行mvn package ,就会自动执行mvn docker:build-->
                        <phase>package</phase>
                        <goals>
                            <goal>build</goal>
                        </goals>
                    </execution>
          <!--当执行mvn package时,会对镜像进行标签设定-->  
                       <execution>
                        <id>tag-image</id>
                        <!--用户只需执行mvn package ,就会自动执行mvn docker:tag-->
                        <phase>package</phase>
                        <goals>
                            <goal>tag</goal>
                        </goals>
                        <configuration>
                        <image>${docker.image.prefix}/${project.artifactId}:latest</image>
                        <newName>docker.io/${docker.image.prefix}/${project.artifactId}:${project.version}</newName>
                        </configuration>
                    </execution>
           <!--当执行mvn deploy 时,执行 mvn deploy docker:push-->
                    <execution>
                        <id>push-image</id>
                        <!--用户只需执行mvn package ,就会自动执行mvn docker:push-->
                        <phase>deploy</phase>
                        <goals>
                            <goal>push</goal>
                        </goals>
                    </execution>
                </executions>

参考文章

一键部署 Spring Boot 到远程 Docker 容器,就是这么秀!

idea整合docker远程部署springboot项目

springboot 整合 docker, 进行自动化部署,其实没你想象的那么难

(十七)SpringBoot微服务项目打包成Docker镜像详解

idea使用插件远程linux打包docker镜像(点两下直接打包启动好)