Docker快速部署PHP环境

2021-07-17 23:59:24阅读 11评论 0

最近发现我们网站突然无法访问了,弹出一个阿里云的页面,说没有备案无法访问。我一愣,这TM几个月前刚备案,又要备案了。登录到阿里云的控制台后,进入备案界面填好信息又没有下一步的按钮,找人工客户又找不到电话,找半天就找到一个和机器人的对话框,回一堆没有用的信息,浪费我一个上午时间,问题还没解决。

此时,心里充满了焦虑和愤怒。冷静下来,阿里云容器的各个问题、以及体验上的诸多不满汇总了一下,发现阿里云对我的价值已经很低了,最终下定决心,要从阿里云把项目迁移出来。在新的服务器上我决定用docker进行部署,以下是部署过程的总结。

1.通过Dockerfile自定义镜像

FROM php:7.2.4-fpm
MAINTAINER xiexinyang <983600849@qq.com>

#docker中php扩展安装方式
#1、PHP源码文件目录自带扩展 docker-php-ext-install直接安装
#2、pecl扩展 因为一些扩展不包含在PHP源码文件中,PHP 的扩展库仓库中存在。用 pecl install 安装扩展,再用 docker-php-ext-enable 命令 启用扩展
#3、其他扩展 一些既不在 PHP 源码包,也不再 PECL 扩展仓库中的扩展,可以通过下载扩展程序源码,编译安装的方式安装

# 扩展版本号定义 

#redis 扩展
ENV PHPREDIS_VERSION 4.0.0
#msgpack扩展
ENV MSGPACK_VERSION 2.0.3
#memcached扩展
ENV MEMCACHED_VERSION 3.1.3
#mongodb扩展
ENV MONGODB_VERSION 1.5.3
#xhprof扩展 https://github.com/longxinH/xhprof/releases(pecl 不支持php7 使用这里的)
ENV XHPROF_VERSION 2.0.5
#swoole安装 如果以后用到的话,不用再安装了,4.0之后性能更好
ENV SWOOLE_VERSION 4.0.3
#swoole依赖hiredis
ENV HIREDIS_VERSION 0.13.3
# 设置时间
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo 'Asia/Shanghai' > /etc/timezone

# 扩展依赖
RUN apt-get update \
    && apt-get install -y \
        curl \
        wget \
        git \
        zip \
        libz-dev \
        libssl-dev \
        libnghttp2-dev \
        libpcre3-dev \
        libmemcached-dev \
        zlib1g-dev \
    && apt-get clean \
    && apt-get autoremove

# Composer安装
RUN curl -sS https://getcomposer.org/installer | php \
    && mv composer.phar /usr/local/bin/composer \
    && composer self-update --clean-backups

# Mysqli 扩展 自带 直接安装即可(当前数据库使用的mysqli查询的)
RUN docker-php-ext-install mysqli
# PDO 扩展 自带 直接安装即可
RUN docker-php-ext-install pdo_mysql
# Bcmath 扩展 自带 直接安装即可
RUN docker-php-ext-install bcmath
# Redis 扩展下载 pecl本地安装 开启扩展
RUN wget http://pecl.php.net/get/redis-${PHPREDIS_VERSION}.tgz -O /tmp/redis.tgz \
    && pecl install /tmp/redis.tgz \
    && rm -rf /tmp/redis.tgz \
    && docker-php-ext-enable redis

# msgpack 扩展下载 pecl本地安装 开启扩展(延迟队列使用减少源数据占用空间)
RUN wget http://pecl.php.net/get/msgpack-${MSGPACK_VERSION}.tgz -O /tmp/msgpack.tgz \
    && pecl install /tmp/msgpack.tgz \
    && rm -rf /tmp/msgpack.tgz \
    && docker-php-ext-enable msgpack

# memcached 扩展下载 pecl本地安装 开启扩展 前面已经通过 apt-get安装了libmemcached-dev依赖
RUN wget http://pecl.php.net/get/memcached-${MEMCACHED_VERSION}.tgz -O /tmp/memcached.tgz \
    && pecl install /tmp/memcached.tgz \
    && rm -rf /tmp/memcached.tgz \
    && docker-php-ext-enable memcached

# mongodb 扩展下载 pecl本地安装 开启扩展 前面已经通过 
RUN wget http://pecl.php.net/get/mongodb-${MONGODB_VERSION}.tgz -O /tmp/mongodb.tgz \
    && pecl install /tmp/mongodb.tgz \
    && rm -rf /tmp/mongodb.tgz \
    && docker-php-ext-enable mongodb

因为库里的镜像没有相关的扩展,需要自定义镜像安装扩展
执行docker build -t fpm-php-7.2:v1.0.0 .创建镜像,创建成功后执行docker images查看镜像id

3.创建docker-compse.yml文件

version: "2.1"
services:
    nginx:
        image: nginx
        ports:
            - "82:80"
        volumes: 
            - ./www:/usr/share/nginx/html
            - ./conf:/etc/nginx
            - ./logs:/var/log/nginx
        networks:
            - lnmp-network
    php:
        image: 6bfd101 #镜像id
        volumes:
            - ./www:/www
        networks:
            - lnmp-network
networks: 
    lnmp-network:

注意:需要提前在同级目录下创建conf目录,并将nginx的/etc/nginx里的配置文件复制到conf目录下,否则nginx无法启动

3.修改conf.d目录下的default.conf

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm index.php;
        if (!-e $request_filename) {
           rewrite  ^/(.*)$  /index.php/$1  last;
           break;
        }
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    location ~ \.php/?.* {
        root   /usr/share/nginx/html;
        fastcgi_pass    php:9000;
        fastcgi_index   index.php;
        fastcgi_split_path_info ^(.+\.php)(.*)$;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param   SCRIPT_FILENAME /www/$fastcgi_script_name;
        include     fastcgi_params;
    }
}

之前尝试过其他配置方案,会出现php内部路由无法使用的问题,这是最终版

4.启动容器

执行docker-compse up -d,执行之后,再执行docker ps检查容器是否正常启动,出现未正常启动情况执行docker logs 容器id查看日志,根据日志中提示解决相应问题

5.其他

docker环境下数据库安装不在赘述

还没有评论,来说两句吧