runoops.com

如何用Docker配置不同的PHP版本

在开发过程中,有时候需要不同的版本,如PHP版本,老项目还是php5.6版本,新项目用php7.3版本,而本机上只用brew安装了php7版本,如果用brew同时安装php5.6版本会出现版本库之间兼容问题,这种情况下解决的办法主要2种:1、在本机上编译安装php5.6; 2、使用类似docker容器。 本文将介绍如何使用docker搭建不同php版本环境。

docker的安装和使用见教程

创建并运行nginx

docker run --name nginx8092 -p 8092:80 -v /data/docker/www8092:/var/www -v /data/docker/nginx8092/conf/conf.d:/etc/nginx/conf.d -d nginx

重要参数说明:

-p 指定端口映射关系,本地的8092对应容器的80端口-v 添加文件映射关系,这样在宿主机上更改的文件可以直接映射到容器中。这里的目录根据自己实际情况进行映射。
创建并运行容器后,docker内的nginx即启动成功,无需进入docker内部再次启动nginx, 否则会提示80等端口被占用,因为nginx已经启动。

查看下docker nginx是否正在运行:

ocalhost:conf.d changeluo$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
3810e387090a        nginx               "nginx -g 'daemon of…"   53 minutes ago      Up 3 seconds        0.0.0.0:8092->80/tcp     nginx8092

在本机目录/data/docker/www8092,创建测试文件index.html

<html>
<meta charset="utf-8" />
<title>index test</title>
<body>
Hello,runoops!
</body>
</html>

在目录/data/docker/nginx8092/conf/conf.d下新建nginx配置文件test.conf,内容如下:

server {
    listen 80;
    #server_name docker8092.lh;
    root /var/www;
}

重启dockernginx8092

$ docker restart nginx8092

由于已经建立了映射关系,index.html和test.conf都会同步到nginx容器的相应目录中。

通过浏览器访问http://localhost:8092/,如图:

说明docker nginx已经安装成功。

安装docker PHP5.6

创建并运行名为dockerphp56的容器:

docker run -p 9010:9000 --name dockerphp56 -v /data/docker/www:/var/www
/data/docker/php56/conf.d:/usr/local/etc/php/conf.d  -v /data/docker/php56/logs:/var/log/php56 -d php:5.6-fpm 
注意:这里一定要创建文件映射,或者php容器内有对应的php代码。上一步nginx的文件映射,在这里是找不到的。所以如果没有文件映射,127.0.0.1:9000 在此容器内就找不到文件 。

配置docker nginx与docker php5.6的关联,让docker nginx访问docker php5.6,这里需改本机目录/data/docker/nginx8092/conf/conf.d下的配置文件,因为前面创建nginx容器时已经建立好了nginx的配置映射关系。修改test.conf的配置文件如下;

server {
    listen       80;
    server_name  _;

    root /var/www;

    #location / {
    #    index index.php;
    #    autoindex on;
    #}

    location / {
            try_files $uri $uri/ /index.php?$args;
    }

    #proxy the php scripts to php-fpm
    location ~ \.php$ {
        root /var/www/test8092;#必须是前面映射路径/var/www/下
        #include /usr/local/etc/nginx/fastcgi.conf;
        include fastcgi_params;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_intercept_errors on;
        fastcgi_pass   172.17.0.2:9000;
    }

    error_log docker_test_lh_error.log;
    #access_log docker_test_lh_access.log;

}

fastcgi_pass 172.17.0.2:9000; 这里的IP地址可以通过以下docker命令查看:

$ docker inspect --format='{{.NetworkSettings.IPAddress}}' dockerphp56

配置本机nginx配置文件,添加的代理转发如下:

erver {
    listen       80;
    server_name  docker.test8092.lh;

    location / {
        index index.php index.html;
         proxy_pass http://127.0.0.1:8092/;  ## 指定端口号 8092
    }
}

添加本机虚拟域名hosts:

127.0.0.1 docker.test8092.lh

重启dockernginx8092:

$ docker restart nginx8092

重启本机nginx。

访问:http://docker.test8092.lh/index.html

通过以上一系列docker和本机操作,PHP项目文件必须放到/data/docker/www/test8092目录下,而不是放到/data/docker/www8092目录下。

这里,我在本机目录创建了phpinfo.php文件:

<?php
phpinfo();
?>

访问http://docker.test8092.lh/phpinfo.php,效果如下:

同理,可以添加不同的PHP版本,只需运行不同的php版本容器,并适当修改配置。

常见问题:

启动php容器后,如果访问nginx为:502 Bad Gateway

尝试以下方法:

查看php容器的ip地址

docker inspect --format='{{.NetworkSettings.IPAddress}}' dockerphp56

172.17.0.2

访问页面的时候出现:File not found.

检查下你的html文件和php文件放置的位置是否正确的,我这里使用的是各自两个不同的项目。