文章
问答
冒泡
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中的<dockerCertPath>标签值对应

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

    例如

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

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

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

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

      image-20221215154320041

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

  5. 部署镜像

    image-20221215154744138

  6. 配置信息

    image-20221215155109853

  7. 点击run即可运行

Java项目总结

关于作者

Kirito
获得点赞
文章被阅读