Docker搭建PHP运行环境

本篇是使用Docker安装PHP运行环境的命令笔记。这里PHP版本为7.0+。主要是手动运行php+fpm+apache步骤、使用compose编排php+fpm+apache 和nginx+PHP-FPM环境搭建过程简述。

运行PHP程序

拉取7.2版本的官方PHP镜像 docker pull php:7.2-cli
运行刚才的镜像 –rm 运行完自己干掉自己,一般用于执行临时任务

1
2
docker run -it --rm --name runphp -v  /home/xugz/php:/usr/src/myphp  php:7.2-cli \
php /usr/src/myphp/index.php

手动运行php+fpm+apache

我们尽可能的使用基于alpine的镜像。
安装FPM镜像 docker pull php:7.2.0-fpm-alpine3.6 ,使用命令docker run -d --rm --name fpm php:7.2.0-fpm-alpine3.6 让容器以后台守护模式运行
安装Apache镜像 docker pull httpd:2.4-alpine,写一个测试HTML网页,使用命令 docker run -d -p 80:80 --rm --name myweb -v /home/xugz/php:/usr/local/apache2/htdocs/ httpd:2.4-alpine映射80端口挂载默认网站路径,尝试是否正常使用。一般来说应该是可使用的。

然后我们需要修改配置文件。我们可以自己准备配置,或者从容器中拷贝一个。根据文档,容器里默认的配置文件路径为/usr/local/apache2/conf/httpd.conf。
使用 docker exec -it myweb cat /usr/local/apache2/conf/httpd.conf查看配置文件信息
使用 docker cp myweb:/usr/local/apache2/conf/httpd.conf /home/xugz/conf/复制文件
修改配置文件 vi /home/xugz/conf/httpd.conf 找到以下内容,把前面的#号去掉开启对应模块

1
2
3
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

另需增加修改配置如下内容

1
2
3
4
5
6
7
8
9
10
11
12
<VirtualHost *:80>
ServerAdmin xugz@com.cn
DocumentRoot "/usr/local/apache2/htdocs"
ServerName localhost
<Directory "/usr/local/apache2/htdocs">
Options None
Require all granted
</Directory>
ProxyRequests Off
ProxyPassMatch ^/(.*\.php)$ fcgi://192.158.0.2:9000/php/$1
#转向fpm基本配置。使用docker network ls && docker network inspect bridge 中查看FPM的inet
</VirtualHost>

启动fpm的时候把php文件夹挂载到fpm容器中,因此fpm容器的启动要增加文件挂载,命令改成
docker run -d --rm --name fpm -v /home/xugz/php:/php php:7.2.0-fpm-alpine3.6
重新运行apache容器

1
2
3
docker run -d  -p 80:80 --name myweb -v /home/xugz/php:/usr/local/apache2/htdocs/  \
-v /home/xugz/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf \
httpd:2.4-alpine

没有异常的话,可用 curl localhostcurl localhost/index.php 测试。

compose编排php+fpm+apache

为了让我们容器的启动和删除操作方便,所以要我们要使用docker compose ,一款编排工具。
下载安装步骤见本站其他篇,点我瞬时移动。新建目录webcompose目录,在目录中新建docker-compose.yml文件,拷贝如下内容(就是将上文中两条启动容器命令翻译成dockerfile)

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
version: "3"                                                                         
services:
fpm:
image: php:7.2.0-fpm-alpine3.6
container_name: fpm
volumes:
- /home/xugz/php:/php
networks:
mywebnet:
ipv4_address: 192.159.0.2 # 这里的IP需要和Apache配置文件httpd.conf中的ProxyPassMatch fcgi地址保持一致

httpd:
image: httpd:2.4-alpine
container_name: httpd
ports:
- 80:80
volumes:
- /home/xugz/php:/usr/local/apache2/htdocs/
- /home/xugz/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf
networks:
mywebnet:
ipv4_address: 192.159.0.3 # 设置指定IP IP从0.1开始生成


networks:
mywebnet: # 如果之前创建了相同子网的网络 要先删掉之前的,否则冲突
driver: bridge
ipam:
config:
- subnet: 192.159.0.0/16
# 子网随便填写 IP地址是以网络号和主机号来表示网络上的主机的,只有在一个网络号下的计算机之间才能“直接”互通,不同网络号的计算机要通过网关(Gateway)才能互通。但这样的划分在某些情况下显得并不十分灵活。为此IP网络还允许划分成更小的网络,称为子网(Subnet)。

然后可以使用 docker-compose up -d启动可用 curl localhostcurl localhost/index.php 测试。

搭建nginx+PHP-FPM环境

使用命令 docker pull nginx:1.13.9-alpine安装Nginx
默认的网页文件夹是 /usr/share/nginx/html
默认的配置文件地址是/etc/nginx/nginx.conf

如果我们没有现成的配置文件,那么可以先胡乱启动下容器,然后拷贝到 我们的文件夹中。如下

1
2
docker run --name nginx --rm -d  nginx:1.13.9-alpine
docker cp nginx:/etc/nginx/nginx.conf ~/conf

普通html的情况下,nginx不需要做任何配置,使用如下命令重新运行后,尝试普通HTML访问是否正常

1
2
docker run --name nginx -d --rm -v /home/xugz/php:/usr/share/nginx/html \
-p 80:80 nginx:1.13.9-alpine

nginx+FPM的配置

nginx配置文件的内容参考

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
43
44
45
46
user  nginx;
worker_processes 1;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;


events {
worker_connections 1024;
}


http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

sendfile on;
#tcp_nopush on;

keepalive_timeout 65;

#gzip on;

# include /etc/nginx/conf.d/*.conf;
server{
listen 80;
location / {
root /usr/share/nginx/html;
index index.html index.htm index.php;
}
location ~ \.php$ {
root /php;
fastcgi_pass 192.138.0.2:9000; # 这个192.138.0.2 是容器IP 需要指定
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

}

启动FPM和Nginx

1
2
3
4
5
6
7
8
9
10
11
docker network create --driver=bridge --subnet=192.138.0.0/16 mynginx

docker run -d --rm --name fpm \
--network mynginx --ip 192.138.0.2 \ # 这个IP和Nginx配置文件中 fastcgi_pass配置的IP需要保持一致
-v /home/xugz/php:/php \
php:7.2.0-fpm-alpine3.6

docker run --name nginx -d --rm -v /home/xugz/php:/usr/share/nginx/html \
-v /home/xugz/conf/nginx.conf:/etc/nginx/nginx.conf \
--network mynginx -p 80:80 \
nginx:1.13.9-alpine

当然可以使用compose进行编排,很简单这里不就赘述了,不要忘记同步修改Apache和Nginx配置文件中的fpm部分,统一改成fpm的IP。
nginx 官方镜像

本文标题:Docker搭建PHP运行环境

文章作者:xugz

发布时间:2019年11月29日 - 17:12

最后更新:2021年09月11日 - 16:16

原始链接:https://xlline.github.io/2019/11/29/Docker-php-base/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。