首先描述我的整个部署工作流:搭建一个springboot项目hello world,然后将项目使用mvn package docker:build将项目打包成docker image,接下来把image上传到docker Hub;最后配置deployment.yaml和svc.yaml文件,实现从浏览器访问到hello world页面。
贴出几个核心的code,
Dockerfile文件如下:
FROM java:8
MAINTAINER docker_user "zhaocgc@cn.ibm.com"
EXPOSE 8080
VOLUME /tmp
ADD springbootdemo-0.0.1-SNAPSHOT.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" ]
application.properties文件如下:(这里仅仅指定了Tomcat的访问端口为8081)
server.port=8081
controller如下:
package com.ibm.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloDockerController {
@RequestMapping(value="")
public String helloDocker() {
return "hello, docker!";
}
}
pom.xml有段docker的文件配置如下,
<properties>
<java.version>1.8</java.version>
<docker.image.prefix>springboot</docker.image.prefix>
</properties>
<!-- 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>
首先,通过mvn package 打包,在target目录中可以得到项目jar包,target目录如下:

然后通过 java -jar target/springbootdemo-0.0.1-SNAPSHOT.jar启动,可在浏览器访问 http://localhost:8081,得到hello,docker! 的响应。
由此证明我们的项目是没有问题的!
接下来就是把项目打包成image
可以选择删除target目录(如果不删除的除的话,接下来的命令执行会覆盖之前的内容),在项目根目录下,执行 mvn package docker:build
在十几秒钟之后会提示image构建完成,你可以通过docker images查看刚刚生成的image,如下图,(springboot/springbootdemo)

测试小插曲:start
这里可以对镜像进行一个测试,测试其是否可访问,通过执行命令,
# 注意,8099是你映射到服务器8081的端口,在浏览器访问的时候应该访问8099.
docker run -d -p 8099:8081 springboot/springbootdemo
此时,在本地会有启动一个container,代表把项目放到了这个container中运行。(但是今天我们不提用docker的方式,将应用部署到container中,而是采用Kubernetes这个容器编排系统)
测试小插曲:end
言归正传,然后需要把image push到docekr Hub,需要首先将image的名字改成docker 账户名/docker 仓库名: tagName
需要执行的修改image name的命令如下:
docker tag imageId cczhao/cczhao-repo:springdemo
然后,image 的name会变成cczhao/cczhao-repo ,TAG显示为springdemo,接下来把image上传,执行
docker push cczhao/cczhao-repo:springdemo
耐心等待上传完成后可在自己的docker仓库中显示刚刚上传的image,我的image上传如下,

最后就是Kubernetes部署
创建dep.yaml和svc.yaml文件分别如下,
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: spdemo
spec:
replicas: 1
template:
metadata:
labels:
app: spdemo
spec:
containers:
- name: container1-spdemo
image: docker.io/cczhao/cczhao-repo:springdemo
ports:
- containerPort: 8081
apiVersion: v1
kind: Service
metadata:
name: spdemo-svc
labels:
app: spdemo
spec:
type: NodePort
ports:
- port: 8081
nodePort: 30010
selector:
app: spdemo
这里需要注意的地方就是service中selector 名字要和Deployment中的labels名字一致;另外Deployment中containerPort要和你的Tomcat服务器开启端口一致,而不是和Dockerfile文件中expose的端口一致。
最后测试在浏览器上访问,http://192.168.99.100:30010 可得到正确的请求响应。
之前在部署过程中一直以为在做端口expose的时候,expose的是Dockerfile中指定的端口,所以最后在浏览器测试访问的时候,一直报错:Connection refused.
在其它人的博客或者在线教程中也没遇到这种问题,因为不知道别人image中是如定义port信息的,但是更多时候在server上部署的时候开放的时候都是8080端口。但是在自己亲自去构建镜像,放到server上打包,然后再在Kubernetes中部署的时候,的确遇到不少坑。。。
网友评论