在父子Maven中,使用IDEA一键部署至docker

本篇文章主要涉及两方面

  • 如何通过ssl加密方式连接docker
  • 如何在父子maven中,分别对子Maven进行一键打包和部署

一、IDEA远程连接Docker(SSL加密方式)

  1. 新建文件夹,存放证书

    mkdir /data/docker-ca
    cd /data/docker-ca
    
  2. 创建key,设置密码并确认

    openssl genrsa -aes256 -out ca-key.pem 4096
    
  3. 创建一个1000天(随意天数)的CA机构证书,分别填写国家,省份,城市,组织,邮箱等信息(可乱填)

    openssl req -new -x509 -days 1000 -key ca-key.pem -sha256 -out ca.pem
    

    例如

    Country Name (2 letter code) [XX]:CN
    State or Province Name (full name) []:SuZhou
    Locality Name (eg, city) [Default City]:SuZhou
    Organization Name (eg, company) [Default Company Ltd]:xzit
    Organizational Unit Name (eg, section) []:xzit
    Common Name (eg, your name or your server's hostname) []:xxx
    Email Address []:xxx@xx.com
    
  4. 生成server-key.pem

    openssl genrsa -out server-key.pem 4096
    
  5. 生成服务端证书签名,绑定ip或域名

    以下命令中$HOST为外网ip或域名

    openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr
    

    例如(以下方式二选一)

    # 有域名
    openssl req -subj "/CN=www.xxx.com" -sha256 -new -key server-key.pem -out server.csr
    # 有ip
    openssl req -subj "/CN=192.168.0.1" -sha256 -new -key server-key.pem -out server.csr
    
  6. 配置白名单

    IP:0.0.0.0 为白名单ip,因为已经设置了ssl,这里可以设置允许所有人访问。也可以设置指定ip

    echo subjectAltName = DNS:$HOST,IP:0.0.0.0 >> extfile.cnf
    

    例如(以下方式二选一)

    # 有域名
    echo subjectAltName = DNS:www.xxx.com,IP:0.0.0.0 >> extfile.cnf
    # 有ip
    echo subjectAltName = IP:192.168.0.1,IP:0.0.0.0 >> extfile.cnf
    
  7. 生成ca-key

    echo extendedKeyUsage = serverAuth >> extfile.cnf
    
  8. 输入之前的密码,生成ca-key(这里设置过期时间为1000天)

    openssl x509 -req -days 1000 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
    
  9. 生成客户端所需的key.pem

    openssl genrsa -out key.pem 4096
    
  10. 执行命令

    openssl req -subj '/CN=client' -new -key key.pem -out client.csr
    echo extendedKeyUsage = clientAuth >> extfile.cnf
    
  11. 生成cert.pem,需要输入前面设置的密码(这里设置过期时间为1000天)

    openssl x509 -req -days 1000 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \-CAcreateserial -out cert.pem -extfile extfile.cnf
    
  12. 修改docker配置

    • 编辑docker.service

      vim /usr/lib/systemd/system/docker.service
      
    • 将 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock修改为:

      ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/data/docker-ca/ca.pem --tlscert=/data/docker-ca/server-cert.pem --tlskey=/data/docker-ca/server-key.pem -H tcp://0.0.0.0:2376  -H fd:// --containerd=/run/containerd/containerd.sock
      

      注意证书的存放位置,即–tlscacert、–tlscert、–tlskey的值

      这里设置了连接docker的访问端口:2376

  13. 重启docker

    systemctl daemon-reload
    systemctl restart docker
    
  14. 打开服务器的端口:2376

  15. 将ce.pem、cert.pem、key.pem三个文件拷贝到本地

  16. 打开idea,下载docker,并配置

    image-20221215151038114
  17. 查看

    image-20221215151823640

二、配置项目文件

  1. 配置父Maven中的pom.xml文件,增加如下内容

    ...
    <build>
        <plugins>
          <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>2.3.12.RELEASE</version>
            <executions>
              <execution>
                <goals>
                  <goal>repackage</goal>
                </goals>
              </execution>
            </executions>
            <configuration>
              <includeSystemScope>true</includeSystemScope>
            </configuration>
          </plugin>
          <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>
              <!--指定生成的镜像名,choas为项目前缀,可自定义-->
              <imageName>choas/${project.artifactId}</imageName>
              <imageTags>latest</imageTags>
              <!-- 指定 Dockerfile 路径-->
              <dockerDirectory>${project.basedir}</dockerDirectory>
              <!--指定远程 docker api地址-->
              <dockerHost>https://192.168.0.1:2376</dockerHost>
              <!--指定pem证书文件路径地址 -->
              <dockerCertPath>${project.basedir}/pem</dockerCertPath>
            </configuration>
          </plugin>
        </plugins>
      </build>
    
  2. 配置父Maven中的pom.xml文件,增加如下内容

    <build>
    		<!-- 最后打包的项目名 -->
            <finalName>gateway</finalName>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
                <plugin>
                    <groupId>com.spotify</groupId>
                    <artifactId>docker-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
  3. 将存储ce.pem、cert.pem、key.pem三个文件的文件夹,拷贝一份到对应子项目的根目录中,与父Maven中的标签值对应

  4. 在根目录中(不是根目录会报错)创建Dockerfile文件(没有后缀),与父Maven中的标签值对应

    例如

    # 项目所依赖的jdk镜像
    FROM java:8
    # 将maven构建好的jar添加到镜像中(子项目中的finalName标签对应) 第二个参数为别名
    ADD target/gateway.jar gateway.jar
    EXPOSE 8899
    ENTRYPOINT ["java","-jar","gateway.jar"]
    

    大多父子maven项目会有一个公共项目,此时打包子项目会找不到对应公共荐的jar包

    • 将父项目中的标签注释掉

    • 点击maven,选择父maven,然后clear,最后install

      image-20221215154320041

    • 将父项目中的标签取消注释,然后对子项目打包就没有问题了

  5. 部署镜像

    image-20221215154744138

  6. 配置信息

    image-20221215155109853
  7. 点击run即可运行

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值