diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index 51a617a..c6c65ac 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -54,6 +54,7 @@ module.exports = { '/php/': [ '../', '', + 'docker-phpfpm74', 'docker81', 'nginx', 'openresty', @@ -84,6 +85,7 @@ module.exports = { collapsable: false, // 可选的, 默认值是 true, sidebarDepth: 1, // 可选的, 默认值是 1 children: [ + `/php/docker-phpfpm74.md`, '/php/docker81', '/php/nginx', '/php/openresty', diff --git a/docs/php/docker-phpfpm74.md b/docs/php/docker-phpfpm74.md new file mode 100644 index 0000000..f838129 --- /dev/null +++ b/docs/php/docker-phpfpm74.md @@ -0,0 +1,370 @@ +# 基于docker的phpfpm+nginx环境 + +## 简介 + +本文以php7.4为例,介绍在具有docker环境的系统上,不安装任何php相关服务,完全利用docker容器来实现运行环境的搭建,最后还会以ThinkPHP6.0为例演示真实项目的运行,本文中的环境可在生产环境使用。 + +## 准备工作 + +在本地创建一个工作目录,笔者的宿主机上它的位置就是`/app/dev/phpfpm-demo`。 + +```sh +mkdir -p /app/dev/phpfpm-demo +cd /app/dev/phpfpm-demo +``` + +## 制作过程 + +### 基础镜像 + +```sh +docker pull nginx:1.24 +docker pull php:7.4.33-fpm-bullseye +``` + +其中,nginx镜像不需要做更改可以直接使用,而php镜像则要在基础镜像的基础上安装一些必要的依赖和扩展。 + +### 制作PHP镜像 + +#### 为PHP安装扩展 + +```sh +docker run --rm --name php-fpm -it -d php:7.4.33-fpm-bullseye +docker exec -it php-fpm +``` + +在容器内安装依赖前最好先更换一下软件源,否则可能会很慢。 + +```sh +cp /etc/apt/sources.list /etc/apt/sources.list.bak && echo "deb http://mirrors.aliyun.com/debian/ bullseye main non-free contrib +deb-src http://mirrors.aliyun.com/debian/ bullseye main non-free contrib +deb http://mirrors.aliyun.com/debian-security/ bullseye-security main +deb-src http://mirrors.aliyun.com/debian-security/ bullseye-security main +deb http://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib +deb-src http://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib +deb http://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib +deb-src http://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib" | tee /etc/apt/sources.list >/dev/null +``` + +基础php镜像中没有`redis`、`mysql`等扩展,我们要自己安装一下。在容器内可以随时用`php -m`命令查看当前已经生效的扩展 + +```sh +apt update && apt install -y \ +# gd扩展依赖 +libzip-dev libpng-dev \ +# pgsql扩展依赖 +libpq-dev \ +# gmp扩展依赖 +libgmp-dev \ +# composer需要 +git + +# redis扩展 +pecl install redis && docker-php-ext-enable redis +# mysql扩展 +docker-php-ext-install pdo_mysql && docker-php-ext-enable pdo_mysql +# opcache扩展 +docker-php-ext-install opcache && docker-php-ext-enable opcache +# gd扩展 +docker-php-ext-install gd && docker-php-ext-enable gd +# zip扩展 +docker-php-ext-install zip && docker-php-ext-enable zip +# xlswriter扩展(超高速读写excel文件) +pecl install xlswriter && docker-php-ext-enable xlswriter +# pgsql扩展(连接postgres数据库) +docker-php-ext-install pdo_pgsql && docker-php-ext-enable pdo_pgsql +# gmp扩展 +docker-php-ext-install gmp && docker-php-ext-enable gmp +# 安装composer +php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');" && php composer-setup.php && php -r "unlink('composer-setup.php');" && mv composer.phar /usr/local/bin/composer +``` + +以上是笔者经历过的项目中比较常用的扩展,如果还有其他需要,可以按照类似的方式安装。 + +最后一切完毕后就可以离开容器了: + +```sh +exit +``` + +另外,我们需要知道几个关键路径: + +- php.ini文件所有路径:`/usr/local/etc/php/php.ini` +- 应用路径:`/var/www/html` + +这两个路径我们未来要采用映射的方式从项目目录映射到容器内,因此不需要在容器内做什么动作了。 + +如果在自己的宿主机中没有现成的`php.ini`文件,可以从容器内复制出来一份: + +```sh +# 开发环境建议 +docker cp php-fpm:/usr/local/etc/php/php.ini-development ./php.ini +# 生产环境建议 +docker cp php-fpm:/usr/local/etc/php/php.ini-production ./php.ini +``` + +#### 保存PHP镜像 + +```sh +docker commit php-fpm php-fpm:7.4 +``` + +以后我们要使用的就是这个新创建的镜像,如果有`hub.docker.com`网站的账号,可以使用`docker push`命令把这个镜像上传到自己的docker hub上,方便以后在其他地方使用。 + +现在我们刚才启动的镜像已经不再需要了,直接删除就行。 + +```sh +# 启动时已经使用了--rm参数,所以容器被关闭就会自动删除 +docker stop php-fpm +``` + +### 准备nginx配置文件 + +我们直接启动nginx容器,然后从容器是把配置文件复制到宿主机上。 + +```sh +# 当前目录是宿主机上的工作目录 +mkdir nginx +docker run --rm --name php-fpm-nginx -it -d nginx:1.24 +docker cp php-fpm-nginx:/etc/nginx/nginx.conf ./nginx/ +docker cp php-fpm-nginx:/etc/nginx/conf.d ./nginx/ +dorker stop php-fpm-nginx +``` + +现在我们已经准备好了`nginx:1.24`镜像和`php-fpm:7.4`镜像,已经具备工作条件,下面就开始使用。 + +## 环境与配置 + +到目前为止,我们已经有两个镜像:`nginx:1.24`和`php-fpm:7.4`,同时工作目录`/app/dev/phpfpm-demo`中的目录结构如下: + +|目录或文件|说明| +|---|---| +|php.ini|PHP环境的配置文件| +|nginx|Nginx的配置文件目录| +|nginx/nginx.conf|nginx的主配置文件| +|nginx/conf.d|nginx下的站点配置目录| + +现在我们已经把环境准备好了,接下来准备一个可以一键启动的`docker-compose.yml`文件,再修改一些nginx的配置,就可以了。 + +`docker-compose.yml`文件: + +```yml +version: "3.1" + +services: + php: + image: php-fpm:7.4 + container_name: php74 + restart: always + volumes: + - ./php.ini:/usr/local/etc/php/php.ini + - ./:/var/www/html + stdin_open: true + nginx: + image: nginx:1.24 + container_name: phpnginx + restart: always + volumes: + - ./nginx/nginx.conf:/etc/nginx/nginx.conf + - ./nginx/conf.d:/etc/nginx/conf.d + - ./:/usr/share/nginx/html + stdin_open: true + ports: + - 8008:80 + depends_on: + - php +``` + +简单解读一下: + +- 把当前工作目录中的`php.ini`文件映射到php容器对应的路径上。 +- 把当前上作目录映射到php容器中的默认站点根目录上。 +- 把当前工作目录中的nginx配置文件映射到nginx容器对应的路径上。 +- 把当前工作目录映射到nginx容器中的默认站点根目录上。 +- 把nginx容器的80端口映射到宿主机上的8008端口上(可以自己改)。 +- nginx容器和php容器都不使用host网络而是自己组成一个私有网络。 + +接下来我们去修改nginx的配置文件,只需要修改`nginx/conf.d/default.conf`这一个文件即可,在里面加入下面这一段: + +在`location /`段中添加`index.php`: + +```conf + location / { + root /usr/share/nginx/html; + index index.html index.htm index.php; + } +``` + +然后再添加下面一段: + +```conf + location ~ \.php$ { + fastcgi_pass phpfpm74:9000; + fastcgi_index index.php; + fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name; + include fastcgi_params; + } +``` + +接下来,我们在站点根目录上创建一个`index.html`文件: + +```html + + +
+ + +