IDEA远程部署项目到Docker

莱莱  金牌会员 | 2022-9-23 10:02:49 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 573|帖子 573|积分 1719

前言

最近在写东西部署到服务器,结构是springboot工程配合docker部署。
但是每次部署都3个步骤:

  • 本地构建jar
  • 复制jar到远程服务器
  • 用DockerFile构建镜像
部署次数一多,我就怀疑人生了。就在找有没有IDEA远程部署Docker的方案,于是就有本篇博客。
环境:
本地IP:192.168.1.5
Docker远程主机:192.168.1.199
开启docker remote API

docker远程访问api有两种方式:

  • 普通方式(一般用2375端口)
  • TSL方式(一般用2376端口)
建议使用TSL方式,更安全。
普通方式


  • 修改配置文件/lib/systemd/system/docker.service
    修改ExecStart这一项的内容,在末尾添加参数
    -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2373
    1. # 修改前
    2. # ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
    3. # 修改后
    4. ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
    复制代码
    一般使用2375端口,可以改成自己喜欢的
  • 重新加载配置重启docker服务
    1. # 重新加载配置
    2. systemctl daemon-reload
    3. # 重启docker服务
    4. systemctl restart docker
    复制代码
  • 验证
    浏览器输入http://192.168.1.199:2375/version
    如果显示一串json信息,就证明成功了。注意自己修改成自己的ip
TSL方式


  • 生成CA证书
    编写生成证书的shell脚本,然后直接执行脚本即可。请自行修改前4行中的参数,下面是脚本的内容:
    1. #!/bin/sh
    2. ip=远程服务器的ip
    3. password=校验密码
    4. dir=生成证书的目录
    5. if [ ! -d "$dir" ];then
    6. echo ""
    7. echo "$dir , not dir , will create"
    8. echo ""
    9. mkdir -p $dir
    10. else
    11. echo ""
    12. echo "$dir , dir exist , will delete and create"
    13. echo ""
    14. rm -rf $dir
    15. mkdir -p $dir
    16. fi
    17. cd $dir
    18. # 创建根证书RSA私钥
    19. openssl genrsa -aes256 -passout pass:$password  -out ca-key.pem 4096
    20. # 创建CA证书
    21. openssl req -new -x509 -days 365 -key ca-key.pem -passin pass:$password -sha256 -out ca.pem -subj "/C=NL/ST=./L=./O=./CN=$ip"
    22. # 创建服务端私钥
    23. openssl genrsa -out server-key.pem 4096
    24. # 创建服务端签名请求证书文件
    25. openssl req -subj "/CN=$ip" -sha256 -new -key server-key.pem -out server.csr
    26. echo subjectAltName = IP:$ip,IP:0.0.0.0 >> extfile.cnf
    27. echo extendedKeyUsage = serverAuth >> extfile.cnf
    28. # 创建签名生效的服务端证书文件
    29. openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -passin "pass:$password" -CAcreateserial -out server-cert.pem -extfile extfile.cnf
    30. # 创建客户端私钥
    31. openssl genrsa -out key.pem 4096
    32. # 创建客户端签名请求证书文件
    33. openssl req -subj '/CN=client' -new -key key.pem -out client.csr
    34. echo extendedKeyUsage = clientAuth >> extfile.cnf
    35. echo extendedKeyUsage = clientAuth > extfile-client.cnf
    36. # 创建签名生效的客户端证书文件
    37. openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -passin "pass:$password" -CAcreateserial -out cert.pem -extfile extfile-client.cnf
    38. # 删除多余文件
    39. rm -f -v client.csr server.csr extfile.cnf extfile-client.cnf
    40. chmod -v 0400 ca-key.pem key.pem server-key.pem
    41. chmod -v 0444 ca.pem server-cert.pem cert.pem
    复制代码
  • 修改配置文件/lib/systemd/system/docker.service
    修改ExecStart这一项的内容,/home/docker_ca是我CA证书的目录,请自行替换成自己的
    1. # 修改前
    2. # ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
    3. # 修改后
    4. ExecStart=/usr/bin/dockerd \
    5.         --tlsverify \
    6.         --tlscacert=/home/docker_ca/ca.pem \
    7.         --tlscert=/home/docker_ca/server-cert.pem \
    8.         --tlskey=/home/docker_ca/server-key.pem \
    9.         -H tcp://0.0.0.0:2376 \
    10.         -H unix:///var/run/docker.sock \
    11.         -H fd:// --containerd=/run/containerd/containerd.sock
    复制代码
  • 重新加载配置重启docker服务
    1. # 重新加载配置
    2. systemctl daemon-reload
    3. # 重启docker服务
    4. systemctl restart docker
    复制代码
构建

创建测试工程


  • 创建测试的maven工程
    https://start.spring.io/创建测试工程,我的工程命名为testdocker,只添加了web模块用来测试

  • 添加测试接口
    打开测试工程,在TestdockerApplication中添加测试接口
    1. @SpringBootApplication
    2. public class TestdockerApplication {
    3.         public static void main(String[] args) {
    4.                 SpringApplication.run(TestdockerApplication.class, args);
    5.         }
    6.         @RestController
    7.         class HelloController {
    8.                 @GetMapping("/hello")
    9.                 public String hello() {
    10.                         return "hello world";
    11.                 }
    12.         }
    13. }
    复制代码
  • 测试
    启动工程,浏览器输入 http://localhost:8080/hello
部署到Docker

部署到Docker我这里提供两种方式:

  • IDEA的Docker插件 + DockerFile
  • Maven插件docker-maven-plugin + DockerFile
因为两种方式都需要用到DockerFile,所以先创建DockerFile
在项目根目录添加DockerFile
  1. # 基础镜像使用java
  2. FROM openjdk:8-jdk-alpine
  3. # 暴露端口
  4. EXPOSE 8080 5005
  5. # 将jar包添加到容器中并更名为app.jar
  6. ADD ./target/testdocker-0.0.1-SNAPSHOT.jar app.jar
  7. # 运行jar包
  8. ENTRYPOINT ["java","-Dfile.encoding=utf-8","-jar","app.jar"]
复制代码
因为我的DockerFile在项目根目录,而maven构建的jar在target目录,项目目录结构如下
  1. testdocker
  2. ├─src
  3. ├─target
  4. │   └─testdocker-0.0.1-SNAPSHOT.jar
  5. ├─DockerFile
  6. └─pom.xml
复制代码
IDEA的Docker插件 + DockerFile


  • IDEA安装Docker插件

  • 连接Docker
    菜单 File → Settings → Build,Execution → Docker
    下图的配置的是用TSL方式的Docker Remote API。如果是普通方式,这不需要配置CA证书目录,Engine API URL改成:tcp://192.158.1.199:2375
    ps:记得替换成自己的ip

  • 添加运行配置


  • maven构建项目jar包
    控制台执行
    1. mvn clean package
    复制代码
    不进行这一步,target目录就没有jar包,DockerFile会提示构建失败
  • 启动并测试

    启动工程,浏览器输入 http://192.168.1.199:8080/hello
    注意修改成自己Docker服务所在服务器的ip
Maven插件docker-maven-plugin + DockerFile

这种方式,可以完全脱离IDEA来操作

  • 添加Maven插件
    在pom.xml文件的plugins节点中添加如下内容
    1. <plugin>
    2.     <groupId>io.fabric8</groupId>
    3.     <artifactId>docker-maven-plugin</artifactId>
    4.     <version>0.40.2</version>
    5.    
    6.     <configuration>
    7.         
    8.         
    9.         <dockerHost>https://192.168.1.199:2376</dockerHost>
    10.         
    11.         <certPath>F:\docker_ca</certPath>
    12.         
    13.         <images>
    14.             
    15.             <image>
    16.                
    17.                 <name>testdocker</name>
    18.                
    19.                 <alias>${project.name}</alias>
    20.                
    21.                 <build>
    22.                     
    23.                     <dockerFile>${project.basedir}/Dockerfile</dockerFile>
    24.                 </build>
    25.                
    26.                 <run>
    27.                     
    28.                     <containerNamePattern>%a</containerNamePattern>
    29.                     <ports>
    30.                         <port>8080:8080</port>
    31.                         <port>5005:5005</port>
    32.                     </ports>
    33.                 </run>
    34.             </image>
    35.         </images>
    36.     </configuration>
    37. </plugin>
    复制代码
  • 构建并启动容器
    控制台执行如下命令:
    1. mvn clean package docker:stop docker:remove docker:build docker:run
    复制代码

    • docker:stop 停止并删除docker容器
    • docker:remove 删除镜像
    • docker:build 构建镜像
    • docker:run 创建并启动docker容器

  • 测试
浏览器输入 http://192.168.1.199:8080/hello
注意修改成自己Docker服务所在服务器的ip
总结

本文介绍了两种远程部署Docker的方法,一种需要用到IDEA,一种只需要用到Maven。
参考资料
fabric8io/docker-maven-plugin官方文档
docker开启TLS远程访问 2376_写码的猿是攻城狮的博客
Docker部署IDEA项目_路言汐的博客

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莱莱

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表