还在手动部署SpringBoot应用?试试这个自动化插件

最近又发现了一款好用的Maven插件,fabric8io出品的docker-maven-plugin,可以把SpringBoot应用方便的部署到Docker容器中去。该插件可以实现打包镜像、推送到镜像仓库、运行应用等一系列操作,本文将对其用法进行详细介绍,希望对大家有所帮助!

安装私有镜像仓库

由于之后我们需要推送到私有镜像仓库,我们预先安装好,使用的是Docker公司开发的私有镜像仓库Registry。

  • 下载Registry的Docker镜像;
docker pull registry:2
  • 使用Docker容器运行Registry服务,需要添加环境变量REGISTRY_STORAGE_DELETE_ENABLED=true开启删除镜像的功能;
docker run -p 5000:5000 --name registry2 \
--restart=always \-e REGISTRY_STORAGE_DELETE_ENABLED="true" \
-d registry:2
  • 修改Docker Daemon的配置文件,文件位置为/etc/docker/daemon.json,由于Docker默认使用HTTPS推送镜像,而我们的镜像仓库没有支持,所以需要添加如下配置,改为使用HTTP推送;
{
  "insecure-registries": ["192.168.3.101:5000"]
}
  • 最后使用如下命令重启Docker服务。
systemctl daemon-reload && systemctl restart docker

镜像仓库可视化

由于私有镜像仓库管理比较麻烦,而docker-registry-ui有专门的页面可以方便地管理镜像,所以我们安装它来管理私有镜像仓库。

  • 下载docker-registry-ui的Docker镜像;
docker pull joxit/docker-registry-ui:static
  • 使用Docker容器运行docker-registry-ui服务;
docker run -p 8280:80 --name registry-ui \
--link registry2:registry2 \-e REGISTRY_URL="http://registry2:5000" \
-e DELETE_IMAGES="true" \
-e REGISTRY_TITLE="Registry2" \
-d joxit/docker-registry-ui:static
  • 我们先来试试私有镜像仓库是否可用,首先下载一个测试用的镜像busybox;
docker pull busybox
  • 给镜像busybox打上私有仓库的标签,并设置版本为v1.0;
docker tag busybox 192.168.3.101:5000/busybox:v1.0
  • 之后推送到私有镜像仓库去;
docker push 192.168.3.101:5000/busybox:v1.0
  • 访问docker-registry-ui管理界面,即可查看到busybox镜像,地址:http://192.168.3.101:8280
还在手动部署SpringBoot应用?试试这个自动化插件

插件使用

fabric8io出品的docker-maven-plugin是一款集Docker镜像管理和容器管理于一身的插件,动动手指就可以把我们的SpringBoot应用部署到Docker容器中了,非常好用,下面来讲讲它的用法。

在IDEA中正确使用Maven插件

  • 一般我们如果没有使用IDEA,都是手敲Maven命令来执行,在IDEA中我们只要双击右侧面板中的Maven命令即可执行,非常方便。
还在手动部署SpringBoot应用?试试这个自动化插件
  • 如果你想使用自定义命令的话,可以使用Execute Maven Goal这个功能,这里我使用的是mvn clean package命令。
还在手动部署SpringBoot应用?试试这个自动化插件

构建镜像

  • 要想使用docker-maven-plugin,需要在pom.xml中添加该插件;
<build>
    <plugins>
        <plugin>
            <groupId>io.fabric8</groupId>
            <artifactId>docker-maven-plugin</artifactId>
            <version>0.33.0</version>
            <configuration>
                <!-- Docker 远程管理地址-->
                <dockerHost>http://192.168.3.101:2375</dockerHost>
                <!-- Docker 推送镜像仓库地址-->
                <pushRegistry>http://192.168.3.101:5000</pushRegistry>
                <images>
                    <image>
                        <!--由于推送到私有镜像仓库,镜像名需要添加仓库地址-->
                        <name>192.168.3.101:5000/mall-tiny/${project.name}:${project.version}</name>
                        <!--定义镜像构建行为-->
                        <build>
                            <!--定义基础镜像-->
                            <from>java:8</from>
                            <args>
                                <JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
                            </args>
                            <!--定义哪些文件拷贝到容器中-->
                            <assembly>
                                <!--定义拷贝到容器的目录-->
                                <targetDir>/</targetDir>
                                <!--只拷贝生成的jar包-->
                                <descriptorRef>artifact</descriptorRef>
                            </assembly>
                            <!--定义容器启动命令-->
                            <entryPoint>["java", "-jar","/${project.build.finalName}.jar"]</entryPoint>
                            <!--定义维护者-->
                            <maintainer>macrozheng</maintainer>
                        </build>
                    </image>
                </images>
            </configuration>
        </plugin>
    </plugins>
</build>
  • 我们构建镜像之前需要先将项目打包,然后再构建,否则会出错,直接使用如下命令即可;
mvn package docker:build
  • 打包完成后就可以在我们的服务器上看到这个镜像了;
[root@linux-local mydata]# docker images
REPOSITORY                                     TAG                 IMAG
E ID            CREATED             SIZE
192.168.3.101:5000/mall-tiny/mall-tiny-fabric   0.0.1-SNAPSHOT      6b8bc6faeb0b        
9 seconds ago       680MB
  • 当然我们也可以设置使用package命令时直接打包镜像,修改pom.xml,在<plugin>节点下添加<executions>配置即可;
<plugin>
    <groupId>io.fabric8</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>0.33.0</version>
    <executions>
        <!--如果想在项目打包时构建镜像添加-->
        <execution>
            <id>build-image</id>
            <phase>package</phase>
            <goals>
                <goal>build</goal>
            </goals>
        </execution>
    </executions>
</plugin>
  • 使用不同的Maven插件构建Docker镜像时方法往往不同,这时候直接使用Dockerfile来构建会比较好,我们先写好Dockerfile文件并放到项目根目录下;
# 该镜像需要依赖的基础镜像
FROM java:8
# 将当前maven目录生成的文件复制到docker容器的/目录下COPY maven /# 声明服务
运行在8080端口
EXPOSE 8080
# 指定docker容器启动时运行jar包ENTRYPOINT ["java", "-jar","/mall-tiny-
fabric-0.0.1-SNAPSHOT.jar"]
# 指定维护者的名字MAINTAINER macrozheng
  • 然后修改pom.xml文件,将<build>节点配置替换为如下内容,仅需配置Dockerfile所在目录即可。
<build>
     <dockerFileDir>${project.basedir}</dockerFileDir>
</build>

推送到镜像仓库

  • 接下来我们使用docker:push命令即可把镜像推送到私有镜像仓库;
mvn docker:push
  • 之后在我们的私有镜像仓库就可以看到镜像了;
还在手动部署SpringBoot应用?试试这个自动化插件

操作容器

  • docker-maven-plugin不仅可以操作镜像,还可以操作容器,比如我们以前需要使用如下Docker命令来运行容器;
docker run -p 8080:8080 --name mall-tiny-fabric \
--link mysql:db \
-v /etc/localtime:/etc/localtime \
-v /mydata/app/mall-tiny-fabric/logs:/var/logs \
-d 192.168.3.101:5000/mall-tiny/mall-tiny-fabric:0.0.1-SNAPSHOT
  • 现在我们只需在插件中配置即可,在<image>节点下添加<run>节点可以定义容器启动的行为:
<!--定义容器启动行为-->
<run>
    <!--设置容器名,可采用通配符-->
    <containerNamePattern>${project.artifactId}</containerNamePattern>
    <!--设置端口映射-->
    <ports>
        <port>8080:8080</port>
    </ports>
    <!--设置容器间连接-->
    <links>
        <link>mysql:db</link>
    </links>
    <!--设置容器和宿主机目录挂载-->
    <volumes>
        <bind>
            <volume>/etc/localtime:/etc/localtime</volume>
            <volume>/mydata/app/${project.artifactId}/logs:/var/logs</volume>
        </bind>
    </volumes>
</run>
  • 之后直接使用docker:start命令即可启动了;
mvn docker:start
[root@linux-local mydata]# docker ps
CONTAINER ID        IMAGE  
           COMMAND                  CREATED             STATUS              
     PORTS                                            NAMES
95ce77c0394b        192.168.3.101:5000/mall-tiny/mall-tiny-
fabric:0.0.1-SNAPSHOT   "java -jar /mall-
tin…"   32 seconds ago      Up 31 seconds       0.0.0.0:8080-
>8080/tcp                           mall-tiny-fabric
  • 停止容器使用docker:stop命令即可;
mvn docker:stop
  • 删除容器使用docker:remove命令,是不是很方便!
mvn docker:remove
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容