本文主要分享一个小技巧,如果你的环境中只有一个php版本,又想部署一个新的版本,但是又不想太繁杂,可以使用本文提供的一个简单方法。使用docker创建多PHP环境。

现有的物理环境版本如下,使用 php -v查看当前版本。

php -v
PHP 5.6.31 (cli) (built: Sep  6 2017 16:12:32) 
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
    with Zend Guard Loader v3.3, Copyright (c) 1998-2014, by Zend Technologies

例子中我的PHP版本是5.6,整个基础软件环境使用的是LNMP架构,想提供一个新的PHP版本。这里采用的docker最基本的方式。
手动安装方式:

#手动方式运行php docker容器
docker run -idt --name=php7.2 \
--restart=always \
-p 9001:9000 \
-v /home/wwwroot/xxxx:/var/www/html \ 
-v /opt/server/php:/usr/local/etc/php php:7.2-fpm \
--link mysql8:docker_mysql8 \
/bin/bash \

#手动方式运行mysql docker容器
docker run -idt --name=mysql8\
--restart=always \
-p 3307:3306 \
-v /server/mysql:/var/lib/mysql \
-v /etc/localtime:/etc/localtime \
-e "MYSQL_ROOT_PASSWORD=xxxx"  \
mysql:8.0  

以服务方式构建:

#docker-compose.yml 如果不需要mysql可以将mysql的相关配置去掉
version: "2"
services:
    mysql8:
        container_name: "mysql8"
        command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --max_connections=1000
        restart: always
        ports:
            - "3307:3306"
        volumes:
           - /server/mysql:/var/lib/mysql
           - /etc/localtime:/etc/localtime:ro
       environment:
           MYSQL_ROOT_PASSWORD: xxxxxx
       image: mysql:8.0
               
    php7.2:
        container_name: "php7.2"
        restart: always
        ports:
            - "9001:9000"
        volumes:
            - /home/wwwroot/xxxx:/var/www/html
           - /etc/localtime:/etc/localtime:ro
       links:
           - "mysql8:docker_mysql8 "    
       image: php:7.2-fpm    
    

上面的command指令中了默认的认证方式为mysql_native_password,mysql8.0中默认为caching_sha2_password,旧版本的mysql客户端是不支持的
大概率需要自行构建自己的php镜像,选用Dockerfile的方式

FROM php:7.2-fpm
MAINTAINER eve
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

RUN apt update && apt install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev\
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd \
&& docker-php-ext-install zip \
&& docker-php-ext-install pdo_mysql \
&& docker-php-ext-install opcache \
&& docker-php-ext-install mysqli \
&& rm -r /var/lib/apt/lists/*

RUN pecl install redis \
&& pecl install xdebug \
&& docker-php-ext-enable redis xdebug

WORKDIR /data
RUN usermod -u 1000 www-data

启动服务

docker-compose up 

在nginx中配置PHP服务

注意:在原来的ngxin应用中配置的root项目也需要配置,应该配置到容器中映射的数据卷目录,在本次实验中应该这样设置

root /var/www/html

如果你有静态资源访问出现404的情况,很可能是你在写nginx转发规则的时候也将请求转发到了对应的在server块配置的root目录,因此需要单独对静态资源配置root规则。
比如我要访问 http://xxx.com/static/css/common.css就需要添加如下配置规则

location /static/ {
    root /home/wwwroot/xxxx.com/;
}

最后重启自己的ngxin服务。

总结:
如果是在容器内部连接宿主机的mysql服务,也需要做相应的调整,一般来说默认情况下mysql都是只允许本地连接的。
上面所述都是奇技淫巧,正常在项目中尽量不要这样用,如果你对ngxin的配置规则和fast-cgi架构不是很了解,一点出现问题很难排查。会花费大量的时间。

Tags: docker

Related Posts:

Leave a Comment