背景
在基于Docker部署PHP应用时,我用到了php-fpm:5.4.45
,nginx:1.17.10
两个镜像来部署PHP项目,通过Nginx反向代理至php-fpm的根目录即可。那么在kubernetes中部署PHP应用时,应该如何做呢,将这个两个镜像放在同一个pod中吗?
解决
其实是可以将Nginx与php-fpm制作为一个镜像,并提前定义好Nginx的配置,这样的话会方便很多,这里提供一个已经做好的nginx-php的镜像,nginx-php镜像的docker-hub地址 :
1 docker pull lemonlzy/nginx-php:latest
把php代码添加到镜像的/usr/local/nginx/html文件夹,比如将当前目录下的v4文件夹内的所有php代码添加到容器内部,如下为Dockerfile,这样做的话访问路径为ip+80/v4/文件名
,当然,如果不需要目录层级划分,访问路径要求为ip+80/文件名
,则使用COPY命令即可,不使用ADD命令:
1 2 3 4 5 6 7 FROM lemonlzy/nginx-php:latestLABEL maintainer=liu.ziyi<liu.ziyi@aishu.cn> ENV WORK_FILE /usr/ local/nginx/ html/ ADD v4/ $WORK_FILE/ v4/
使用docker build
构建镜像即可:
1 docker build -t lemonlzy/nginx-php:latest .
运行容器即可访问,根目录为/usr/local/nginx/html
。
部署
以下为演示:
查看目录结构:
1 2 3 4 5 6 7 8 9 10 11 12 [root@centos7 php] Dockerfile v4 [root@centos7 php] [root@centos7 v4] index.php [root@centos7 v4] <?php phpinfo(); ?>
Dockerfile文件与上述相同,开始构建镜像:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 [root@centos7 v4]# cd /tmp/ demo/php [root@centos7 php]# docker build -t lemonlzy/nginx-php:0.1 . Sending build context to Docker daemon 3.584 kB Step 1 /4 : FROM lemonlzy/ nginx-php:latest ---> cd24045e7177 Step 2 /4 : LABEL maintainer=liu.ziyi<liu.ziyi@aishu.cn> ---> Running in b97b5d6a55b2 Removing intermediate container b97b5d6a55b2 ---> 57 cc5a07271a Step 3 /4 : ENV WORK_FILE /u sr/local/ nginx/html/ ---> Running in 7 b0e92e015cb Removing intermediate container 7 b0e92e015cb ---> 3 db1aae08afc Step 4 /4 : ADD v4/ $WORK_FILE/v4/ ---> 776090 f1469b Successfully built 776090 f1469b Successfully tagged lemonlzy/nginx-php:0.1
查看构建生成的镜像:
1 2 3 4 [root@centos7 oa] REPOSITORY TAG IMAGE ID CREATED SIZE lemonlzy/nginx-php 0.1 776090 f1469b 4 seconds ago 675M B lemonlzy/nginx-php latest cd24045e7177 2 weeks ago 675M B
tag为0.1的镜像已生成,先验证镜像是否按需求生成,使用curl命令或者直接访问ip/v4/index.php
即可看到php相关信息,则说明镜像构建成功,若是自定义php代码,也可在其中加入index.php文件来进行验证:
1 2 3 4 5 6 7 8 [root@centos7 demo] 90 b0815a16ed4aaeeda6be5a03612a854b89f1a47a6e22434a401e97f04795f4[root@centos7 demo] CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 90 b0815a16ed lemonlzy/nginx-php: 0.1 "docker-entrypoint.s…" 4 seconds ago Up 3 seconds 0.0.0.0: 80 ->80 /tcp php[root@centos7 demo]
镜像满足需求,已经成功将php文件放至指定目录下且可通过ip/v4/index.php
进行访问,接下来只需要将镜像上传至给定的镜像仓库,编写kubernetes配置文件部署即可,以下为service配置文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 apiVersion: v1 kind: Service metadata: name: php namespace: default spec: selector: app: php release: canary ports: - name: web port: 80 targetPort: 80 --- kind: Deployment apiVersion: apps/v1 metadata: name: php-deploy namespace: default annotations: deployment.kubernetes.io/revision: '2' spec: replicas: 1 selector: matchLabels: app: php release: canary template: metadata: labels: app: php release: canary spec: containers: - name: myapp image: lemonlzy/nginx-php:0.1 ports: - name: web containerPort: 80 protocol: TCP imagePullPolicy: Always restartPolicy: Always
以下为ingress配置文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 apiVersion: extensions/v1beta1 kind: Ingress metadata: name: php-ingress namespace: default annotations: kubernetes.io/ingress.class: "nginx" spec: tls: - hosts: - your.host.cn secretName: tls-secret rules: - host: your.host.cn http: paths: - path: /v4 backend: serviceName: php servicePort: 80
基于这两个配置文件创建pod与ingress,即可实现php的项目部署。