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