编程学习网 > PHP技术 > php高级 > PHP项目采用多个Docker镜像的方式在Kubernets平台的部署范例
2020
04-21

PHP项目采用多个Docker镜像的方式在Kubernets平台的部署范例

attachments-2020-04-FepTgNKQ5e9e87fedddb5.png

前言


组织的容器支持docker-compose部署,组织的容器支持kubernets部署。
以php框架thinkphp为示例,演示php项目的kubernets部署。

多容器方式(3容器)分别为:
  1. appphp(php代码),openresty(nginx webserver),php-fpm(php的运行环境)
  2. dockerfile 和 yaml文件
  3. docker iamges仓库

PHP项目在Docker中如何部署运行?


PHP应用的运行方式


PHP应用的运行方式一般有Apache mod_php 模式、Nginx(FastCgi)+PHP-FPM模式、Swoole常驻内存Daemon模式。


Docker单容器


Apache mod_php 模式和Swoole常驻内存Daemon模式本身就是单程序,那么在Docker中入口运行程序直接为应用程序即可。

Nginx(FastCgi)+PHP-FPM模式需要nginx和php-fpm 2个程序,这样Docker中就需要运行多个程序,需要有进程守护类软件来运行多个程序。

推荐使用s6-overlay

Docker Hub中PHP官方镜像包已经包括Apache mod_php 模式的镜像包,Kubernets官方PHP项目实例GuestBook中就是采用这种模式的镜像包。


Docker多容器配合


Docker官方倡导容器单一职责,也就是一个容器只运行一个程序。

那么Nginx(FastCgi)+PHP-FPM模式就需要2个容器配合编排工作,再加上如果把PHP代码再独立成一个Docker镜像,那么就是3容器配合编排工作。
所以下面就是以PHP项目采用多个Docker镜像的方式再Kubernets平台部署的范例。

kubernets(k8s)部署运行


思路说明容器共有3个,

① appphp(wwek/k8s-php-thinkphp-hello:app-v1)php代码容器、

② php-fpm(wwek/k8s-php-thinkphp-hello:php-fpm-7.2) 、

③ openresty(wwek/k8s-php-thinkphp-hello:openresty)。


apphp、php-fpm、openresty三个容器都在一个Pod(8s-php-thinkphp-hello)中,appphp容器作为initContainers初始化容器使用。


挂载了一个叫做wwwroot的volume,类型为emptyDir,临时卷initContainers。

初始化容器的时候会把php代码复制到wwwroot(volume)中php-fpm和openresty都挂载wwwroot(volume)。


openresty的upstream php 使用域名php-fpm。使用hostAliases把域名php-fpm解析为127.0.0.1(在同一个Pod中网络是共享的,所以用127.0.0.1)


具体的yaml文件
# Service apiVersion: v1
kind: Service
metadata:
  name: k8s-php-thinkphp-hello
  labels:
    app: k8s-php-thinkphp-hello
spec: type: ClusterIP
  ports:
    - port: 80
      targetPort: http
      protocol: TCP
      name: http
  selector:
    app: k8s-php-thinkphp-hello
--- # deployment apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: k8s-php-thinkphp-hello
  labels:
    app: k8s-php-thinkphp-hello
spec:
  replicas: 1
  selector:
    matchLabels:
      app: k8s-php-thinkphp-hello
  template:
    metadata:
      labels:
        app: k8s-php-thinkphp-hello
    spec: #做一个emptyDir类型,名为wwwroot的volume 用于多个容器共享同一个挂载 volumes:
      - name: wwwroot
        emptyDir: {} # 私有docker 镜像仓库 # imagePullSecrets: # - name: registrykey-qlcoud-1 # 自定义设置POD的hosts hostAliases:
      - ip: "127.0.0.1" hostnames:
        - "php-fpm" initContainers: #php程序本身 - name: appphp
          image: "wwek/k8s-php-thinkphp-hello:app-v1" imagePullPolicy: Always # 复制php程序文件到wwwroot volume command: ["sh", "-c", "cp -r /var/www/k8s-php-thinkphp-hello /appdata"]
          volumeMounts:
          - mountPath: /appdata
            name: wwwroot
      containers: #php-fpm php运行环境 - name: php-fpm
          image: "wwek/k8s-php-thinkphp-hello:php-fpm-7.2" imagePullPolicy: Always
          volumeMounts:
          - mountPath: /var/www
            name: wwwroot #openrsty webserver - name: openresty
          image: "wwek/k8s-php-thinkphp-hello:openresty" imagePullPolicy: Always
          volumeMounts:
          - mountPath: /var/www
            name: wwwroot
          ports:
            - name: http
              containerPort: 80
              protocol: TCP # livenessProbe: #   httpGet: #     path: / #     port: http # readinessProbe: #   httpGet: #     path: / #     port: http resources:
            {}
--- # Ingress apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: k8s-php-thinkphp-hello
  labels:
    app: k8s-php-thinkphp-hello
spec:
  rules:
    - host: k8sphpthinkphp.com
      http:
        paths:
          - path: /
            backend:
              serviceName: k8s-php-thinkphp-hello
              servicePort: http



kubectl apply -f k8s-php-thinkphp-hello.yml
kubectl get pods |grep k8s-php-thinkphp-hello
kubectl get service |grep k8s-php-thinkphp-hello
kubectl get ingress |grep k8s-php-thinkphp-hello


把http://k8sphpthinkphp.com hosts解析到Ingress 的ip


然后浏览器

访问http://k8sphpthinkphp.com/ ,可以看到thinkphp的欢迎页面。

访问http://k8sphpthinkphp.com/phpinfo.php, 可以看到phpinfo信息。
如果没有ingress请自行修改service的type为 NodePort 使用节点的ip和端口访问

docker-compose部署运行


一套打包好的业务PHP Docker业务镜像也可以用docker-compose部署,这样方便了本地的开发调试使用
version: '2' services: ### Applications Code Container ############################# appphp:
      image: wwek/k8s-php-thinkphp-hello:app-v1
      build:
        context: ./appphp
        dockerfile: "Dockerfile" ### PHP-FPM Container ####################################### php-fpm:
      image: wwek/k8s-php-thinkphp-hello:php-fpm-7.2
      build:
        context: ./php-fpm
        dockerfile: "Dockerfile" volumes_from:
        - appphp
      environment:
        - RUN_MODE=prd
        - MYSQL_HOSTNAME= \
        - MYSQL_USERNAME= \
        - MYSQL_PASSWORD= 
      depends_on:
        - appphp
      expose:
        - "9000" networks:
        - backend ### OPENRESTY Server Container ################################## openresty:
      image: wwek/k8s-php-thinkphp-hello:openresty
      build:
        context: ./openresty
        dockerfile: "Dockerfile" volumes_from:
        - appphp
      ports:
        - "80:80" - "443:443" depends_on:
        - php-fpm
      networks:
        - frontend
        - backend ### Networks Setup ############################################ networks:
  frontend:
    driver: "bridge" backend:
    driver: "bridge" ### Volumes Setup ############################################# volumes:
  redis:
    driver: "local"

直接up方式,直接pull已经build好的docker images

docker-compose up -d

本地build方式

docker-compose up -d --build

浏览器访问http://127.0.0.1 访问 http://127.0.0.1/phpinfo.php

扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取