Pod只是一个逻辑概念,一个原子调度单位,其优点在于html
需求:Tomcat经过webapp下的WAR包运行应用java
将WAR包放在Tomcat镜像的webapps目录下,作成一个新的docker镜像,
缺点:更新WAR包或者升级Tomcat镜像,都要从新发布镜像node
声明一个hostPath类型的Volume,把宿主机的WAR包挂载到Tomcat容器当中运行起来,只有一个tomcat镜像
缺点:要在宿主机里放一个WAR包,而且得通知宿主机更新这个包nginx
经过A容器--volumes-from=B容器
方式,将B容器目录挂载
缺点:容器存在启动前后顺序,地位不对等web
单独给WAR包和Tomcat分别作成镜像,而后放在一个Pod容器里组合在一块儿, 利用Init Container解决顺序和依赖关系,
initContainers会先启动,按顺序 tomcat和initContainer的容器声明了一样的Volume,而后Container容器启动后,volume就已经存在程序了,tomcat就能够直接执行
这样只须要在tomcat或者WAR更新的时候,单独更新相应的镜像,yaml以下docker
apiVersion: v1 kind: Pod metadata: name: javaweb-2 spec: initContainers: - image: xxx/sample:v2 name: war command: ["cp", "/sample.war", "/app"] volumeMounts: - mountPath: /app name: app-volume containers: - image:xxx/tomcat:7.0 name: tomcat command: ["sh","-c","/root/apache-tomcat-7.0.42-v2/bin/start.sh"] volumeMounts: - mountPath: /root/apache-tomcat-7.0.42-v2/webapps name: app-volume ports: - containerPort: 8080 hostPort: 8001 volumes: - name: app-volume emptyDir: {}
K8s的volume和mountPath是bind mount的方式,功能就是把文件或目录绑定挂载在一块儿,bind mount的挂载点是容器volume在宿主机上的目录
k8s项目只要把全部Volume的定义都设计在Pod层级,一个Volume对应的宿主机目录对于Pod来讲只有一个,只要声明挂载了这个Volume,就能够共享这个Volume对应的宿主机目录apache
apiVersion: v1 kind: Pod metadata: name: two-containers spec: restartPolicy: Never volumes: - name: shared-data hostPath: path: /data containers: - name: nginx-container image: nginx volumeMounts: - name: shared-data mountPath: /usr/share/nginx/html - name: debian-container image: debian volumeMounts: - name: shared-data mountPath: /pod-data command: ["/bin/sh"] args: ["-c", "echo Hello from the debian container > /pod-data/index.html"]
debin-container和nginx-conntainer都声明挂载了shared-data这个Volume,shared-data是hostPath类型,对应宿主机的/data,同时被绑定挂载进了两个容器中,这就是为何nginx-container能够从它的/usr/share/nginxapi
形象的说,云计算机的操做系统是K8S,容器至关于进程,而Pod则是进程组(可使用pstree -g
查看)
Pod扮演的是传统基础设施的“虚拟机”的角色,容器则是虚拟机的应用程序,要完成虚拟机应用到微服务架构的迁移,核心思想是:tomcat