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 镜像
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.1.0</version>
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<imageName>itzhouq/${project.artifactId}:${project.version}</imageName>
<dockerHost>http://42.192.99.111:2375</dockerHost>
<baseImage>java:8</baseImage>
<entryPoint>["java", "-jar","/${project.build.finalName}.jar"]</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
-
相关配置说明:
- 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