Docker系列(三):Idea使用docker打包和发布springboot项目

Docker系列:

        Docker系列(一): docker介绍&&安装(含离线安装)

        Docker系列(二): 搭建docker镜像仓库-Nexus、Harbor

        Docker系列(三):Idea使用docker打包和发布springboot项目

目录

一、配置Docker Remote Api

        (一)、设置hostname

        (二)、生成TLS证书

①创建生成证书脚本

②执行脚本生成整数

        (三)、配置docker启用TLS

        (四)、测试docker remote api

①不指定证书访问

②指定证书访问

二、Idea集成docker

        (一)、下载证书

        (二)、idea连接docker配置

①修改windows的hosts文件

②修改idea配置

三、打包和发布springboot项目

        (一)、打包springboot项目

①定义一个简单的springboot项目

②添加打包插件

③编写Dockerfile

④打包

        (二)、发布springboot项目


一、配置Docker Remote Api

Docker Remote Api允许使用者远程调用docker服务,所以想要idea集成docker环境,必须首先配置 Docker Remote Api

        (一)、设置hostname

hostnamectl set-hostname dockerremoteapi

        (二)、生成TLS证书

①创建生成证书脚本

mkdir -p /script /data/cert/docker && vi /script/cert.sh

其中cert.sh脚本文件的内容为

#!/bin/bash
set -e
if [ -z $1 ];then
        echo "请输入Docker服务器主机名"
        exit 0
fi
HOST=$1
mkdir -p /data/cert/docker
cd /data/cert/docker
openssl genrsa -aes256 -out ca-key.pem 4096
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
openssl genrsa -out server-key.pem 4096
openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr
# 配置白名单,推荐配置0.0.0.0,允许所有IP连接但只有证书才可以连接成功
echo subjectAltName = DNS:$HOST,IP:0.0.0.0 > extfile.cnf
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
openssl genrsa -out key.pem 4096
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
echo extendedKeyUsage = clientAuth > extfile.cnf
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
rm -v client.csr server.csr
chmod -v 0400 ca-key.pem key.pem server-key.pem
chmod -v 0444 ca.pem server-cert.pem cert.pem

②执行脚本生成整数

# dockerremoteapi是主机的hostname
sh /script/cert.sh dockerremoteapi

如下图所示几处红框中都填写同样的密码即可,其他可不填

        (三)、配置docker启用TLS

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

下图中红色框部分为修改后的最后效果,其他地方不用改

红色框中的配置为

ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock \
          --tlsverify --tlscacert=/data/cert/docker/ca.pem \
          --tlscert=/data/cert/docker/server-cert.pem \
          --tlskey=/data/cert/docker/server-key.pem

 重启docker服务

systemctl daemon-reload && systemctl restart docker

        (四)、测试docker remote api

①不指定证书访问

# dockerremoteapi为主机hostname
curl https://dockerremoteapi:2375/info

②指定证书访问

# dockerremoteapi为主机hostname
curl https://dockerremoteapi:2375/info --cert /data/cert/docker/cert.pem --key /data/cert/docker/key.pem --cacert /data/cert/docker/ca.pem

 可以看到可以调用docker remote api了

二、Idea集成docker

        (一)、下载证书

将客户端所需的ca.pem、cert.pem、key.pem  这3个密钥文件从服务器下载到本地

        (二)、idea连接docker配置

①修改windows的hosts文件

位于C:\Windows\System32\drivers\etc目录下的hosts文件

        追加一条: 192.168.1.119 dockerremoteapi

②修改idea配置

成功之后即可在service栏中看到刚添加docker remote api服务

三、打包和发布springboot项目

        (一)、打包springboot项目

①定义一个简单的springboot项目

添加了swagger页面,测试调用没有问题 

②添加打包插件

springboot的pom文件添加打包插件

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <!--加入下面两项配置 否则jar包提示无主属性清单-->
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <includeSystemScope>true</includeSystemScope>
                </configuration>
            </plugin>
            <!--docker-->
            <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>
                    <!--当执行mvn deploy的时候自动执行 mvn docker:push-image,也就是docker 推动镜像操作,注意这里前提是已经docker已经打好tag,参考上面注释部分-->
                    <execution>
                        <id>push-image</id>
                        <phase>install</phase>
                        <goals>
                            <goal>push</goal>
                        </goals>
                        <configuration>
                            <imageName>192.168.1.119:8082/${project.artifactId}:${project.version}</imageName>
                        </configuration>
                    </execution>
                </executions>
                <configuration>
                    <!--指定生成的镜像名-->
                    <imageName>192.168.1.119:8082/${project.artifactId}</imageName>
                    <!--指定标签-->
                    <imageTags>
                        <imageTag>${project.version}</imageTag>
                    </imageTags>
                    <!--指定 Dockerfile 路径-->
                    <dockerDirectory>${project.basedir}/src/main/resources/docker</dockerDirectory>
                    <!--指定远程 docker api地址-->
                    <dockerHost>https://dockerremoteapi:2375</dockerHost>
                    <!-- 指定tls证书的目录 -->
                    <dockerCertPath>D:\data\cert\docker</dockerCertPath>
                    <!--这里是复制 jar 包到 docker 容器指定目录配置 -->
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <!--jar 包所在的路径  此处配置的 即对应 target 目录-->
                            <directory>${project.build.directory}</directory>
                            <!--需要包含的 jar包 ,这里对应的是 Dockerfile中添加的文件名 -->
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                    <!--docker登录nexus秘钥配置(在maven的配置文件中的server标签内)-->
                    <serverId>nexus-docker</serverId>
                </configuration>
            </plugin>
        </plugins>
    </build>

上面配置中注意不要写错仓库的地址,以及还需要在maven中配置登录到仓库的秘钥

<!-- docker push nexus认证 -->
<server>
  <id>nexus-docker</id>
  <username>admin</username>
  <password>qq245700</password>
</server>

③编写Dockerfile

在编写Dockerfile之前,先给idea装上docker插件,必须要装

在springboot的resources目录下新建docker目录,并新建Dockerfile文件,文件内容为

FROM java:8
VOLUME /tmp
# simple-test-1.0.0.jar为项目打包为jar包的名字,simple-test.jar为别名
ADD simple-test-1.0.0.jar simple-test.jar
#运行的时候对外提供的端口默认是8081
EXPOSE 8080
ENTRYPOINT ["java","-jar","/simple-test.jar"]

 关于Dockerfile可以参考:Docker Dockerfile|菜鸟教程​​​​​​​

④打包

根据pom文件中的配置,只要执行mvn install命令即可自动打包成镜像并上传nexus仓库中

        (二)、发布springboot项目

我们的springboot项目打包的镜像已经打包并上传到了nexus,同时docker remote api所在主机上也已经有了我们的springboot镜像,这里我们就在此主机上运行我们的镜像

打开service栏,并打开docker remote api所在主机

 可以看到我们的springboot项目镜像在存在上面

要运行镜像我们需要一个容器,所以先创建一个容器

 详细参数按照下图中填写即可

 配置完成之后我们点击Run按钮即可开始运行容器并启动springboot服务

容器build日志

springboot服务启动日志

 访问测试

 写在最后:

        这里我们的应用打包好了,也上传到仓库了,那么以后我们就可以在任意docker环境下启动,甚至是在部署了Kubernetes(k8s)环境后,通过k8s来分布式部署我们的应用服务,这个我们后面再讲

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值