使用Docker部署PHP环境

8,518 阅读4分钟

「这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战

前面两章介绍了安装Docker部署Nginx环境

今天说一下使用Docker部署PHP环境。

拉取PHP镜像

首先可以通过 docker search php 查看PHP的镜像列表

Snipaste_2021-11-13_00-21-59.png

然后使用 docker pull php:7.4-fpm 获取PHP镜像,后面的数字可以指定PHP的版本,我安装的是PHP7.4,如果需要获取其他版本,可以通过dockerhub查询

可以通过 docker images 查看安装的镜像列表,或者通过 docker images php 查看php的信息。

Snipaste_2021-11-13_00-27-52.png

上图中的 IMAGE ID 是一个重要的信息,这个是全局唯一的,由于位数太多,我们可以通过使用前几位来代表PHP这个镜像。比如 “80bf”,下面我们会使用到。

创建容器

现在我们需要创建PHP的容器,并且启动PHP。

docker run --name php-test -v /usr/local/nginx/html:/www -p 9000:9000 -d 80bf

命令解释

  • docker run : 是创建一个新容器并运行一个命令
  • --name : 给容器起一个名字,指的是 php-test
  • -p : 指定宿主机与容器内部端口的映射关系,-p [宿主机端口]:[容器内部端口],我设置的是 9000:9000
  • -d : 设置容器在在后台一直运行
  • 最后面的 PHP 是镜像名称,也可以是镜像ID,例如上面提到的 “80bf”

Snipaste_2021-11-13_00-33-57.png

启动PHP后,返回的名称为php-test的容器唯一ID。

可以通过 docker ps 查看Docker 创建的容器

Snipaste_2021-11-13_00-34-18.png

需要注意的是,如果使用的是云服务器,需要在安全组的规则中,打开上面设置的端口号,不然是访问不了的。比如PHP使用的9000端口号。

通过Nginx访问PHP

PHP配置

首先我们需要把PHP容器内的存放文件的目录挂载到宿主机中。避免重复进入PHP容器内更改。

需要先停止PHP容器,然后删除,再重新创建一个容器。

docker stop php-test

docker rm php-tet

docker run --name php-test -v /usr/local/nginx/html:/www -p 9000:9000 -d 80bf

  • -v:  挂载目录, 此处 /usr/local/nginx/html目录为宿主机存放文件目录,/www为PHP容器内存放文件目录。

Nginx配置

我们在讲解使用Docker安装Nginx时,已经把容器内的相关Nginx配置文件挂载到了宿主机内。

由于Nginx的默认配置文件 /etc/nginx/conf.d/default.conf 中存放默认页面的目录是 /usr/share/nginx/html, 由于再PHP容器内,存放文件的目录为/www,所以Nginx存放文件的目录也需要和PHP一致。

创建Nginx的容器命令

docker run --name nginx-test -p 80:80 \
 -v /usr/local/nginx/nginx.conf:/etc/nginx/nginx.conf \
  -v /usr/local/nginx/logs:/var/log/nginx \
   -v /usr/local/nginx/html:/www \
    -v /usr/local/nginx/conf:/etc/nginx/conf.d \
     --privileged=true --link php-test:php -d 0466
  • --link:  把 php-test 容器的网络并入 nginx,并通过修改 nginx 的 /etc/hosts,把域名 php 映射成 127.0.0.1,让 nginx 通过 php:9000 访问 php-fpm。

通过上面操作,PHP和Nginx容器存放文件的目录/www,都挂载到了宿主机/usr/local/nginx/html目录下。这是为了避免相同文件修改多次。

注意:PHP和Nginx容器存放文件的目录必须一致,才能访问,不然会找不到文件。

配置属于PHP容器的虚拟主机

从上面创建Nginx容器的命令可以看到,我们把Nginx容器存放虚拟主机的目录/etc/nginx/conf.d映射到了宿主机/usr/local/nginx/conf上,我们先把已经存在的default.conf文件删除或者更改名称的后缀不能为conf

新建文件 mkdir php-web.conf

server {
    listen       80;
    server_name  localhost;

    location / {
        root   /www;
        index  index.html index.htm index.php;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /www;
    }

    location ~ \.php$ {
        fastcgi_pass   php:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /www$fastcgi_script_name;
        include        fastcgi_params;
    }
}

Snipaste_2021-11-13_01-09-20.png

root /www 就是Nginx容器中存放文件的目录。

fastcgi_param SCRIPT_FILENAME /www$fastcgi_script_name/www是PHP容器中存放文件的目录。

但是Nginx和PHP容器中的目录必须一致。

准备工作做好了,接下来我们新建一个访问的PHP文件。

mkdir index.php

<?php
echo phpinfo();

接下来我们就可以通过 宿主机的IP访问到index.php文件了。

Snipaste_2021-11-13_01-14-57.png

文中说到的存放文件的目录,可能不太准确,意思是存放代码文件。