乐趣区

关于java:还在手动部署SpringBoot应用试试这个自动化插件

最近又发现了一款好用的 Maven 插件,fabric8io 出品的docker-maven-plugin,能够把 SpringBoot 利用不便的部署到 Docker 容器中去。该插件能够实现打包镜像、推送到镜像仓库、运行利用等一系列操作,本文将对其用法进行具体介绍,心愿对大家有所帮忙!

SpringBoot 实战电商我的项目 mall(40k+star)地址:https://github.com/macrozheng/mall

装置公有镜像仓库

因为之后咱们须要推送到公有镜像仓库,咱们事后装置好,应用的是 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

插件应用

fabric8io 出品的 docker-maven-plugin 是一款集 Docker 镜像治理和容器治理于一身的插件,动动手指就能够把咱们的 SpringBoot 利用部署到 Docker 容器中了,十分好用,上面来讲讲它的用法。

在 IDEA 中正确应用 Maven 插件

  • 个别咱们如果没有应用 IDEA,都是手敲 Maven 命令来执行,在 IDEA 中咱们只有双击右侧面板中的 Maven 命令即可执行,十分不便。

  • 如果你想应用自定义命令的话,能够应用 Execute Maven Goal 这个性能,这里我应用的是 mvn clean package 命令。

构建镜像

  • 要想应用 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                 IMAGE 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
  • 之后在咱们的公有镜像仓库就能够看到镜像了;

操作容器

  • 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

我的项目源码地址

https://github.com/macrozheng…

本文 GitHub https://github.com/macrozheng/mall-learning 曾经收录,欢送大家 Star!

退出移动版