在docker上部署springboot项目
docker中添加maven 和 jdk的镜像,可以直接用这个:
docker pull hub.c.163.com/wuxukun/maven-aliyun:3-jdk-8
在springboot项目的pom文件中添加docker插件,以及在项目中添加Dockerfile,Dockerfile相当于说明书,告诉docker容器应该如何运行项目,规定项目运行的一些规则。
项目结构
在pom文件中添加插件
<properties>
<docker.image.prefix>springboot</docker.image.prefix>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- Docker maven plugin -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<dockerDirectory>src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
在src/main/docker
目录下创建Dockerfile文件 ,Dockerfile:
FROM hub.c.163.com/wuxukun/maven-aliyun:3-jdk-8
EXPOSE 58761
VOLUME /tmp
ADD witnesssign-eureka.jar app.jar
RUN sh -c 'touch /app.jar'
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
- FROM 表示要构建的镜像基于哪个镜像,java:8表示使用jdk8环境为基础镜像
- EXPOSE 告诉Docker这个容器在运行时会监听哪些端口。
- VOLUME 指向了一个/tmp的目录,由于 Spring Boot 使用内置的Tomcat容器,Tomcat 默认使用/tmp作为工作目录。这个命令的效果是:在宿主机的/var/lib/docker目录下创建一个临时文件并把它链接到容器中的/tmp目录
- ADD 表示把文件拷入docker ,并改名成 app.jar
- ENTRYPOINT 表示使用指定命令在镜像运行时执行,启动jar。
ide中通过命令行,cd到项目结构下,构建镜像:mvn clean package docker:build
执行完上面命令后,会在target文件下生成:
执行完成后直接在终端执行命令:docker images,就可以看到刚刚生成的springboot项目的镜像
最后启动镜像,外部通过访问58761端口来访问
docker run -d -p 58761:8761 -t springboot/witnesssign-eureka
查看当前容器启动情况:docker ps -a ,就可以看到刚才的项目已经启动了.
接下来,访问一下地址,就成功啦!
ps: 执行生成镜像的命令时,可能会报这个错误:
Failed to execute goal com.spotify:docker-maven-plugin:0.4.14:build (default-cli) on project witnessSign-gateway: Exception caught: java.util.concurrent.ExecutionException: com.spotify.docker.client.shaded.javax.ws.rs.ProcessingException: org.apache.http.client.ClientProtocolException: Cannot retry request with a non-repeatable request entity: Broken pipe -> [Help 1]
错误原因:
由于docker maven 插件的限制,docker项目的artifactId不能包含有大写字母
解决办法
将maven项目的artifactId改成纯小写(可包含字母和下划线的形式)。