版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35001776/article/details/83479388
Docker
下面以SpringBoot工程为例
- 首先建立一个SpringBoot工程,工程目录结构如下:
> mt-myservice
> .idea
> .mvn
> src
> main
> docker
Dockerfile // Dockerfile(名字是固定的)为工程docker的配置
> java
> com.my
> controller // web应用入口,controller控制器
> service // 业务逻辑类
MyserviceApplication // springBoot应用启动类
> resources
application.properties // springBoot配置类,tomcat默认端口号可在这里修改
- 上述添加docker配置文件Dockerfile,目录结构设置为src/main/docker,内容如下
#基础镜像环境
FROM java:8
VOLUME /tmp
#把工程生成的jar包添加到容器并改名为app.jar
ADD myservice-0.0.1-SNAPSHOT.jar app.jar
#命令入口,其中-Djava.security.egd=file:/dev/./urando是生成随机数,urandom节约构建熵池时间
#设置应用最大内存为1000M
ENTRYPOINT ["java","-Xmx1000m","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
- pom中配置maven插件,配置如下
<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>0.2.3</version>
<configuration>
<imageName>demo/${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>
- 指定tomcat端口号,以springboot为例,在classpath路径下修改application.properties文件,内容:
server.port=<要修改的端口号>
- 启动docker(不启动下面构建会失败)
- 执行maven命令:package docker:build(执行成功后会生成docker镜像在本地仓库)
- 在docker命令行执行命令
- docker images(查看本地镜像)
- docker login(登录自己的docker账号,没有可以注册下)
- docker tag [ImageId] demo/myservice:[镜像版本号] //修改版本号
- docker push <username>/<tag>(推送镜像到远程仓库)
常见问题:
- docker启动失败,可能是计算机没有设置允许装VM选项,可到bios进行更改
- 创建VM失败,可能是VirtualBox版本问题,可以卸载VirtualBox重新装
k8s部署service,yaml文件配置:
配置service信息:
api:/api/v1/namespaces/{mynamespace}/services/
请求方式:post
{
"metadata":{
"name":"myservice",
"namespace":"mynamespace",
"labels":{
"app":"myservice"
}
},
"apiVersion":"v1",
"kind":"Service",
"spec":{
"selector":{
"app":"myservice"
},
"ports":[
{
"protocol":"TCP",
"port":80,
"targetPort":8080
}
],
"clusterIP":"None"
}
}
注意:targetPort一定要和项目启动的端口号一致。
配置Ingress信息(相当于nginx):
api:/apis/extensions/v1beta1/namespaces/{mynamesapce}/ingresses/
请求方式:post
{
"metadata":{
"name":"myservice",
"namespace":"mynamesapce"
},
"apiVersion":"extensions/v1beta1",
"kind":"Ingress",
"spec":{
"rules":[
{
"host":"myservice.mtdata.bach.com",
"http":{
"paths":[
{
"path":"/",
"backend":{
"servicePort":80,
"serviceName":"myservice"
}
}
]
}
}
]
}
}
配置deployment,定义Deployment来创建Pod和ReplicaSet
api:/apis/extensions/v1beta1/namespaces/{mynamespace}/deployments/
请求方式:post
{
"metadata":{
"name":"myservice",
"namespace":"mynamespace"
},
"apiVersion":"extensions/v1beta1",
"kind":"Deployment",
"spec":{
"template":{
"metadata":{
"labels":{
"app":"myservice"
}
},
"spec":{
"hostNetwork":false,
"containers":[
{
"image":"docker镜像路径:版本号",
"imagePullPolicy":"Always",
"name":"subtitle",
"resources":{
"requests":{
"memory":"1024Mi",
"cpu":4
},
"limits":{
"memory":"2048Mi", //内存最大限制
"cpu":4 //cpu核心数
}
},
"readinessProbe":{
"tcpSocket":{
"port":8080
},
"periodSeconds":10,
"initialDelaySeconds":20
}
}
],
"affinity":{
"nodeAffinity":{
"requiredDuringSchedulingIgnoredDuringExecution":{
"nodeSelectorTerms":[
{
"matchExpressions":[
{
"key":"gpu",
"operator":"DoesNotExist"
}
]
}
]
}
}
}
}
},
"replicas":1
}
}
image升级时候,需要修改deployment,请求方式为patch
api:/apis/extensions/v1beta1/namespaces/mynamespace/deployments/myservice
Content-Type:application/strategic-merge-patch+json
{
"spec":{
"template":{
"spec":{
"containers":[
{
"image":"docker镜像路径:版本号",
"name":"myservice"
}
]
}
}
}
}
k8s api文档:http://kubernetes.kansea.com/docs/api-reference/v1/operations/
k8s 参数说明文档:http://kubernetes.kansea.com/docs/api-reference/v1/definitions/#_v1_event