idea整合docker远程部署springboot项目

简介

docker已经推出来几年了,渐渐已经成为了一种趋势。自动化部署和远程部署,让开发者和团队可以更方便的进行项目的开发和协作,本文记录了笔者入坑docker的过程。通过idea插件打包springboot项目,并推送到云端实现自动化部署,然后在远程服务器上通过docker命令运行.
主要需要:

  • 一台linux服务器(已经搭建好docker)
  • 一个springboot项目

1.docker是什么

Docker是一个开源的应用容器引擎,使用服务器/客户端(C/S)架构模式,通过镜像来创建容器。镜像是有各种只读层构成,但容器是由只读层和可写层构成,docker通过分层来实现物理和虚拟的控制逻辑。

镜像(Image): 一个特殊的文件系统

操作系统分为内核和用户空间。对于Linux而言,内核启动后,会挂载root文件系统为其提供用户空间支持。而Docker镜像(Image),就相当于是一个root文件系统。

Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。 镜像不包含任何动态数据,其内容在构建之后也不会被改变。

Docker设计时,就充分利用Union FS的技术,将其设计为分层存储的架构。 镜像实际是由多层文件系统联合组成。

镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。

分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。

容器(Container)——镜像运行时的实体

镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等 。

容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。前面讲过镜像使用的是分层存储,容器也是如此。

容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。

按照Docker最佳实践的要求,容器不应该向其存储层内写入任何数据 ,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此, 使用数据卷后,容器可以随意删除、重新run,数据却不会丢失。

仓库(Repository)——集中存放镜像文件的地方

镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry就是这样的服务。

一个Docker Registry中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。所以说:镜像仓库是Docker用来集中存放镜像文件的地方类似于我们之前常用的代码仓库。

通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本 。我们可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以latest作为默认标签。

这里补充一下Docker Registry公开服务和私有Docker Registry的概念:

Docker Registry公开服务是开放给用户使用、允许用户管理镜像的Registry服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。

最常使用的Registry公开服务是官方的Docker Hub ,这也是默认的Registry,并拥有大量的高质量的官方镜像,网址为:hub.docker.com/ 。在国内访问Docker Hub可能会比较慢国内也有一些云服务商提供类似于Docker Hub的公开服务。

除了使用公开服务外,用户还可以在本地搭建私有Docker Registry 。Docker官方提供了Docker Registry镜像,可以直接使用做为私有Registry服务。开源的Docker Registry镜像只提供了Docker Registry API的服务端实现,足以支持Docker命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。

(本文主要针对docker,大概讲述原理,详细原理可以移步他人优秀博客)

搭建mysql

有两种方式可选:
1.docker搭建mysql:操作简单,但是配置难,涉及到更改docker的镜像文件
2.服务器搭建mysql:本文主要采用这种,参考链接中的mysql搭建过程
注: jdk不需要安装,从dockerfile中安装。
mysql需要开启远程登陆,并设置好用户和密码。

idea配置

首先安装idea插件,在应用仓库plugins里面搜索docker并安装。安装好了在下图配置服务器的ip。如192.168.1.1:2375.如果左下角出现连接成功,说明配置正确。
idea整合docker远程部署springboot项目_第1张图片
注:如果出现错误,可能是需要添加docker的远程连接端口

vim /lib/systemd/system/docker.service

找到ExecStart,在末尾添加

-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

如下所示:
idea整合docker远程部署springboot项目_第2张图片

配置pom文件

在pom中添加插件,以下代码需要修改指定远程 docker 的ip地址。
指定生成的镜像名推荐: 仓库名/项目名,${project.artifactId}指读取本地项目的artifactId,可以搜索pom文件的artifactId。一般定义在最上面。

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

                <!--将插件绑定在某个phase执行-->
                <executions>
                    <execution>
                        <id>build-image</id>
                        <!--将插件绑定在package这个phase上。也就是说,用户只需执行mvn package ,就会自动执行mvn docker:build-->
                        <phase>package</phase>
                        <goals>
                            <goal>build</goal>
                        </goals>
                    </execution>
                </executions>

                <configuration>
                    <!--指定生成的镜像名-->
                    <imageName>codingzx/${project.artifactId}</imageName>
                    <!--指定标签-->
                    <imageTags>
                        <imageTag>latest</imageTag>
                    </imageTags>

                    <!-- 指定 Dockerfile 路径  ${project.basedir}:项目根路径下-->
                    <dockerDirectory>${project.basedir}</dockerDirectory>

                    <!--指定远程 docker api地址-->
                    <dockerHost>http://119.28.63.XXXXX: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>

                    <!-- 以下两行是为了docker push到DockerHub使用的。 -->
                    <serverId>docker-hub</serverId>
                    <registryUrl>https://index.docker.io/v1</registryUrl>
                </configuration>
            </plugin>

编写dockerfile

上文安装mysql的时候,提到了没有安装jdk。因为我们采用docker来安装jdk,采用dockerfile安装镜像特别方便。在和pom.xml同级目录新建文件Dockerfile,最好大小写一样(首字母大写),符合规范。

FROM java:8
#项目所依赖的镜像
ADD target/*.jar app.jar
#将maven构建好的jar添加到镜像中
EXPOSE 1234
#暴露的端口号
ENTRYPOINT ["java","-jar","/app.jar"]
#镜像所执行的命令

注:docker会依次执行以上命令,先拉取jdk1.8的镜像打包,然后把项目目录下的target目录下的jar后缀文件全部打到app.jar文件中,然后暴露出1234端口,最后是这个镜像运行的命令是java - jar /app.jar。

在idea中运行docfile

按照顺序分为了四步:
1.新建启动方法,dockerfile
2.映射端口,本机1234:容器1234:内网0端口。端口可以自己设置
3.在docker打包之前,需要先执行maven的打包,clean和package。如图中3,4
4.最后点击运行dockerfile,在1所示地方。
idea整合docker远程部署springboot项目_第3张图片
运行截图:

idea整合docker远程部署springboot项目_第4张图片
这里就验证了dockerfile是分部执行的特点。
idea整合docker远程部署springboot项目_第5张图片
出现如下信息说明打包成功

ProgressMessage{id=null, status=null, stream=null, error=null, progress=null, progressDetail=null}
Successfully built 60c0e003e2b7
Successfully tagged codingzx/website:latest
[INFO] Built codingzx/website
[INFO] Tagging codingzx/website with latest
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  01:38 min
[INFO] Finished at: 2020-03-29T14:07:22+08:00
[INFO] ------------------------------------------------------------------------

服务器端操作

然后登陆自己的服务器,用docker命令 ‘‘docker images’’,查看。我的仓库名为codingzx,项目名为emall,所以打包的镜像为codingzx/emall.这个项目680M的原因是其中包含了jdk8,所以这个镜像特别大。可以通过更新时间,得知是我本地idea推送过来的。这样我们以后在本地更改项目后,可以一键推送到云端。
idea整合docker远程部署springboot项目_第6张图片

运行容器有两种方式
1.前台运行,可以直接查看运行日志,缺点是退出,容器就停止。适合调试使用
1234:1234指暴露本机端口1234到容器端口1234,访问的时候通过1234访问即可。

docker run -p 1234:1234 -t codingzx/website

idea整合docker远程部署springboot项目_第7张图片
2.后台运行,只能看到容器id。只要加上-d,就可以后台运行了。

docker run -d -p 1234:1234 -t codingzx/website

最后通过docker我们顺利完成了,idea打包远程发布springboot项目。并且本地修改项目后,可以通过idea的docker插件一键部署到云端。

推荐

欢迎通过一下渠道,交流学习。
github
掘金
Q群959706394

你可能感兴趣的:(Linux服务器项目上线教程,springboot)