背景


在基于Docker部署PHP应用时,我用到了php-fpm:5.4.45nginx: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:latest

LABEL 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]# ls
Dockerfile v4

[root@centos7 php]# cd v4/

[root@centos7 v4]# ls
index.php

[root@centos7 v4]# cat index.php
<?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.584kB
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
---> 57cc5a07271a
Step 3/4 : ENV WORK_FILE /usr/local/nginx/html/
---> Running in 7b0e92e015cb
Removing intermediate container 7b0e92e015cb
---> 3db1aae08afc
Step 4/4 : ADD v4/ $WORK_FILE/v4/
---> 776090f1469b
Successfully built 776090f1469b
Successfully tagged lemonlzy/nginx-php:0.1

查看构建生成的镜像:

1
2
3
4
[root@centos7 oa]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
lemonlzy/nginx-php 0.1 776090f1469b 4 seconds ago 675MB
lemonlzy/nginx-php latest cd24045e7177 2 weeks ago 675MB

tag为0.1的镜像已生成,先验证镜像是否按需求生成,使用curl命令或者直接访问ip/v4/index.php即可看到php相关信息,则说明镜像构建成功,若是自定义php代码,也可在其中加入index.php文件来进行验证:

1
2
3
4
5
6
7
8
[root@centos7 demo]# docker run -d -p 80:80 --name php lemonlzy/nginx-php:0.1
90b0815a16ed4aaeeda6be5a03612a854b89f1a47a6e22434a401e97f04795f4

[root@centos7 demo]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
90b0815a16ed 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]# curl -l 192.168.235.11/v4/index.php

php.png

镜像满足需求,已经成功将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的项目部署。