SpringBoot 项目构建 Docker 镜像


SpringBoot 项目构建 Docker 镜像

Spring Boot 项目部署有多种方式,这里记录其中一种。借助 maven 插件将 SpringBoot应用打包为 Docker 镜像,并上传到私有镜像仓库 Docker Registry。

安装 Docker Registry

  • 首先为了保证网速建议 Docker 使用阿里云或者国内镜像仓库。修改 /etc/docker/daemon.json 添加镜像。
{
  "registry-mirrors": ["https://hhuovh45.mirror.aliyuncs.com"]
}
  • 下载 Redistry 的 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默认使用HTTPS推送镜像,而我们的镜像仓库没有支持,所以需要添加如下配置,改为使用HTTP推送;
{
  "registry-mirrors": ["https://hhuovh45.mirror.aliyuncs.com"],
  "insecure-registries": ["42.192.99.111:5000"]
}

这里 42.192.99.111 是自己服务器的 IP 地址。

  • Docker 开启远程 API,保证稍后我们的 jar包能上传到该服务器。修改 /usr/lib/systemd/system/docker.service

修改前:

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

修改后:

ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock

0.0.0.0 指的是任何 IP 地址的客户端都能上传镜像到该服务器

  • 重启Docker服务
systemctl daemon-reload && systemctl restart docker
  • 开启防火墙的Docker构建端口(如果开启了防火墙)
firewall-cmd --zone=public --add-port=2375/tcp --permanent 
firewall-cmd --reload

构建镜像

  • 下载示例项目

使用一个项目测试功能。项目地址:demo-code-itzhouq

  • docker-maven-plugin 插件构建 Docker 镜像

  
    
      org.springframework.boot
      spring-boot-maven-plugin
    
    
      com.spotify
      docker-maven-plugin
      1.1.0
      
        
          build-image
          package
          
            build
          
        
      
      
        itzhouq/${project.artifactId}:${project.version}
        http://42.192.99.111:2375
        java:8
        ["java", "-jar","/${project.build.finalName}.jar"]
        
          
            /
            ${project.build.directory}
            ${project.build.finalName}.jar
          
        
      
    
  

  • 相关配置说明:

    • executions.execution.phase:配置执行 maven package 时构建 docker 镜像。
    • imageName:用于指定镜像名称,itzhouq 是仓库名称,${project.artifactId} 是镜像名称,${project.version} 是镜像版本号。
    • dockerHost:打包后上传到的 docker 服务器地址;
    • baseImage:该应用所依赖的基础镜像,此处为 java;
    • entryPoint:docker容器启动时执行的命令;
    • resources.resource.targetPath:将打包后的资源文件复制到该目录;
    • resources.resource.directory:需要复制的文件所在目录,maven 打包的应用 jar 包保存在 target 目录下面;
    • resources.resource.include:需要复制的文件,打包好的应用jar包。
  • 打包后自动上传构建好的镜像到私有仓库

  • 私有仓库

启动 SpringBoot项目

  • 使用 Docker 命令启动项目
docker run -p 8081:8081 --name spring-boot-docker \
-v /etc/localtime:/etc/localtime \
-v /mydata/app/spring-boot-docker/logs:/var/logs \
-d itzhouq/spring-boot-docker:0.0.1-SNAPSHOT
  • 如果报错注意报错信息或者使用 docker logs 容器名 查看日志
  • 测试访问 http://42.192.99.111:8081/docker