淮安市汽车网站建设背景,旅游网站代码html,枣庄市建设项目环评备案网站,企业网站建设流程介绍应用场景
应用从虚拟机迁移到容器中
为什么虚拟机中的应用不能无缝迁移到容器中
虚拟机中应用#xff1a;一组进程#xff0c;被管理在systemd或者supervisord中
容器的本质#xff1a;一个容器一个进程
所以将运行在虚拟机中的应用无缝迁移到容器中#xff0c;与容器…
应用场景
应用从虚拟机迁移到容器中
为什么虚拟机中的应用不能无缝迁移到容器中
虚拟机中应用一组进程被管理在systemd或者supervisord中
容器的本质一个容器一个进程
所以将运行在虚拟机中的应用无缝迁移到容器中与容器的本质是相悖的。
容器无法像虚拟机那样完全模拟本地物理机环境中的部署方式。
swarm 项目无法成长起来的原因单容器的工作方式难以描述真实世界里的复杂的应用架构。 Pod的本质一种编排思想
扮演传统基础设施里“虚拟机”的角色而容器则是这个虚拟机中的用户程序
虚拟机应用迁移到docker
方法松耦合的容器编排技巧超亲密关系容器的设计思想
分析那些进程组件运行在这个虚拟机里把虚机想象成为一个pod把进程分别做成镜像把有顺序关系的定义为 Init Container。
从传统应用架构到微服务架构最自然的过渡方式。 Pod 实现原理
pod 是一组共享了某些资源的容器。如network声明 volume
docker run -net--volumes-from
Pod里的容器是拓扑关系
中间容器来解决容器启动顺序问题
第一个Infra容器 k8s.io/pause 100-200KB第二个容器 A Join Infra Network namespace第三个容器 B Join Infra Network namespace
共享volume
apiVersion: v1
kind: Pod
metadata:name: two-containers
spec:restartPolicy: Nevervolumes:- name: shared-datahostPath:path: /datacontainers:- name: nginx-containerimage: nginxvolumeMounts:- name: shared-datamountPath: /usr/share/nginx- name: debian-containerimage: debianvolumeMounts:- name: shared-datamountPath: /pod-datacommand: [/bin/sh]args: [-c, echo Hello from the debian container /pod-data/index.html]
宿主机目录 /data 被同时绑定到上述两个容器中
例子一war包与web服务器
一个java Web 应用的WAR包需要被放在Tomcat的webapps目录下运行起来
docker解决方式
方法一把war包直接放在Tomcat 镜像的webapps目录下做成一个新的镜像运行起来。 缺点更新升级时需要重新制作镜像
方法二只发布一个tomcat 镜像声明一个hostPath 的volume , 从而把宿主机上的WAR包挂载进Tomcat容器中巡行。 缺点每一个宿主机都要存储WAR包目录。或者独立维护一套分布式存储系统。 pod 解决方式
sidecar 设计模式
作用在一个pod 中启动一个辅助容器完成一些独立于主进程之外的工作
如下面启动一个InitContainer 的方式优先运行一个WAR包容器扮演一个sidecar的角色。
apiVersion: v1
kind: Pod
metadata:name: javaweb-2
spec:initContainers:- image: geektime/sample:v2name: warconmmand: [cp, /sample.war, /app]volumeMounts:- mountPath: /appname: app-volumecontainers:- image: geektime/tomcat:7.0name: tomcatcammand: [sh, -c, /root/apache-tomcat-7.0.42-v2/bin/start.sh]volumeMounts:- mountPath: /root/apache-*/webappsname: app-volumeports:- containerPort: 8080hostPort: 8001volumes:- name: app-volumeemptyDir: {}
例子二容器的日志收集 在Pod里声明volume挂载到应用容器的/var/log目录。
在pod里运行一个sidecar容器声明挂载同一个volume 到自己的/var/log目录上。 特性
容器A 容器B 可以使用 locahost 通信一个pod只有一个IP地址也就是这个pod的network namespace 对应的IP地址网络资源都是一个pod一份pod容器的进出流量通过infra容器完成pod 的生命周期与infra一致与 容器 A和B无关 例子 思考题