多容器共享卷

首先定义一个pod,其中包含两个容器

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: busybox-container
    image: busybox
    volumeMounts:
    - name: shared-data
      mountPath: /pod-data
    command: ["/bin/sh"]
    args: ["-c", "echo Hello from the debian container > /pod-data/index.html"]

首先定义了一个volume名为shared-data,它挂载在宿主机/data目录下

然后两个容器分别挂载这个卷,在nginx容器中这个卷的地址为/usr/share/nginx/html/也就是默认web地址

在busybox容器中这个地址指向/pod-data,然后创建busybox容器之后我们执行了一个写入字符串到/pod-data/index.html的操作

由于两个容器共享这个卷,所以在nginx中也能访问到这个index.html文件,最终实现解析访问

pod创建后宿主机出现index.html文件,说明busybox拉取成功且顺利执行命令

image-20230516174606596

进入nginx容器访问自己的web服务,成功访问

image-20230516174800736

顺带一提,上面这个Pod创建后并不会进入Running状态

image-20230516174905383

在实际开发中这种模式可以用于war部署更新

apiVersion: v1
kind: Pod
metadata:
  name: javaweb-2
spec:
  initContainers:
  - image: geektime/sample:v2
    name: war
    command: ["cp", "/sample.war", "/app"]
    volumeMounts:
    - mountPath: /app
      name: app-volume
  containers:
  - image: geektime/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: {}

WAR 包容器的类型不再是一个普通容器,而是一个 Init Container 类型的容器

所以,这个 Init Container 类型的 WAR 包容器启动后,我执行了一句"cp /sample.war /app",把应用的 WAR 包拷贝到 /app 目录下,然后退出。

而后这个 /app 目录,就挂载了一个名叫 app-volume 的 Volume。

接下来就很关键了。Tomcat 容器,同样声明了挂载 app-volume 到自己的 webapps 目录下。

所以,等 Tomcat 容器启动时,它的 webapps 目录下就一定会存在 sample.war 文件:这个文件正是 WAR 包容器启动时拷贝到这个 Volume 里面的,而这个 Volume 是被这两个容器共享的。

posted @ 2023-07-24 17:27  pr1s0n  阅读(9)  评论(0编辑  收藏  举报