成功使用 dnmp 构建 php 8.2 开发环境

成功使用 dnmp 构建 php 8.2 开发环境

本文编写时间:2023-01-16 2023-01-28
本文主要根据官网的文档进行装机调试,然后加入 php 8.2,因为原来的 dnmp 只有 php 8.0,不方便的。

但是,我只会用 centos 7 镜像构建 php8.2,所以本文提供的只是这种方案,但确实可用,已测试通过。

电脑环境。

我自己的电脑是 windows 10,然后已经安装了 docker desktop,已经安装了 wsl 2,然后 docker desktop 设置了 use the wsl 2 based engine。

安装步骤

进入 wsl 2 的 shell
当前是非 root 用户,

# 这个网址是 dnmp 的官方网址
git clone https://github.com/yeszao/dnmp.git
cd dnmp                                           
cp env.sample .env                                
cp docker-compose.sample.yml docker-compose.yml   

# 下面这个命令,花时间大约1020分钟,耗时很长,需要耐心。其中,我是下 mysql 镜像花的时间比较长。
docker-compose up -d         

成功后的显示类似

xxx@DESKTOP-IULT8FD:~/docker_php/dnmp$ docker-compose up -d
Creating network "dnmp_default" with driver "bridge"
Creating mysql5 ... done
Creating nginx  ... done
Creating php    ... done
Creating mysql  ... done
xxx@DESKTOP-IULT8FD:~/docker_php/dnmp$

各个软件的版本定义在 .env 文件中,打开就能看到。也可以自己修改。算是比较方便的。

验证镜像是安装成功的。非常简单,打开windows 的浏览器,输入 localhost 即可。
类似如下显示:

<h1 style="text-align: center;">
    欢迎使用DNMP</h1>
<h2>
    版本信息
</h2>
<ul>
    <li>
        PHP版本:7.4.27
    </li>
    <li>
        Nginx版本:nginx
    </li>
    <li>
        MySQL服务器版本:8.0.28
    </li>
    <li>
        Redis服务器版本:Redis 扩展未安装 ×
    </li>
    <li>
        MongoDB服务器版本:MongoDB 扩展未安装 ×
    </li>
</ul>
<h2>
    已安装扩展
</h2>
<ol>
    <li>
        Core=7.4.27
    </li>
    <li>
        date=7.4.27
    </li>
    <li>
        libxml=7.4.27
    </li>
    <li>
        openssl=7.4.27
    </li>
    以下忽略。。
</ol>

切换 php 版本到 8.2

1、添加目录

1-1、给 logs 下面加目录 php82
1-2、给 services 下面加目录 php82,同时把 php80 的目录下的内容拷贝到 php82

2、修改 php82 镜像的 Dockerfile 内容

FROM centos:7.9.2009

ENV TZ Asia/Shanghai

WORKDIR /www

RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo \
    && yum makecache \
    && yum repolist \
    && yum install -y https://mirrors.aliyun.com/remi/enterprise/remi-release-7.rpm \
    && sed -i  's/https*:\/\/rpms.remirepo.net/https:\/\/mirrors.aliyun.com\/remi/g'  /etc/yum.repos.d/remi* \
    && sed -i 's/#baseurl/baseurl/g' /etc/yum.repos.d/remi* \
    && sed -i 's|^mirrorlist|#mirrorlist|' /etc/yum.repos.d/remi* \
    && yum makecache \
    && yum repolist \
    && yum -y install yum-utils \
    && yum-config-manager --enable remi-php82 \
    && yum install -y php82 php82-php-devel  php82-php-fpm  php82-php-mbstring php82-php-memcache php82-php-memcached php82-php-redis  php82-php-mysqlnd  php82-php-pdo  php82-php-bcmath php82-php-xml php82-php-gd php82-php-gmp php82-php-igbinary php82-php-imagick   php82-php-mcrypt  php82-php-pdo_mysql php82-php-posix php82-php-simplexml  php82-php-opcache php82-php-xsl php82-php-xmlwriter php82-php-xmlreader php82-php-swoole php82-php-zip php82-php-phalcon  php82-php-yaml php82-php-yar php82-php-yaf php82-php-uuid  \
    && systemctl enable php82-php-fpm \ 
    && groupadd www-data \
    && useradd -g www-data www-data


RUN ln -s /usr/bin/php82 /usr/bin/php

CMD "/usr/sbin/init"

3、修改 nginx 配置

services - nginx - conf.d - localhost.conf
自己找到相应的地方,自己修改内容

charset utf-8; 

location ~ [^/]\.php(/|$) {
        fastcgi_pass   php82:9000;
        include        fastcgi-php.conf;
        include        fastcgi_params;
}

4、修改 php 配置

services - php82 - php-fpm.conf

自己找到相应位置
listen = 0.0.0.0:9000

5、修改 docker-compose.yml

5-1、需添加一个 php82 服务
  php82:
    build:
      context: ./services/php82
      args:
        PHP_VERSION: php:${PHP82_VERSION}-fpm
        CONTAINER_PACKAGE_URL: ${CONTAINER_PACKAGE_URL}
        PHP_EXTENSIONS: ${PHP82_EXTENSIONS}
        TZ: "$TZ"
    container_name: php82
    expose:
      - 9501
    volumes:
      - ${SOURCE_DIR}:/www/:rw
      - ${PHP82_PHP_CONF_FILE}:/etc/opt/remi/php82/php.ini:ro
      - ${PHP82_FPM_CONF_FILE}:/etc/opt/remi/php82/php-fpm.conf:rw
      - ${PHP82_LOG_DIR}:/var/log/php
      - ${DATA_DIR}/composer:/tmp/composer
    restart: always
    cap_add:
      - ALL
    command: ["/opt/remi/php82/root/usr/sbin/php-fpm", "--nodaemonize",  "--allow-to-run-as-root" ]  
    networks:
      - default
5-2、把 redis 那一块的注释取消,因为绝大多数 php 项目都会使用它。

6、修改 .env

6-1、添加 php82的配置。
#
# PHP8.2
#
PHP82_VERSION=8.2.1
PHP82_PHP_CONF_FILE=./services/php82/php.ini
PHP82_FPM_CONF_FILE=./services/php82/php-fpm.conf
PHP82_LOG_DIR=./logs/php82
PHP82_EXTENSIONS=pdo_mysql,mysqli,mbstring,gd,curl,opcache
6-2、修改 redis 的配置

几行全部要修改成如下内容。

REDIS_VERSION=6.2.10
REDIS_HOST_PORT=6379
REDIS_CONF_FILE=./services/redis/redis-6.conf

7、构建镜像,启动。

在 dnmp 目录下,Ubuntu 的 shell 里

docker-compose down
docker-compose build php82
docker-compose up -d

8、最后验证。

打开 windows 的浏览器,输入 localhost 即可。

宿主机是 linux 时的补丁

2023-02-03
在容器内连接 mysql 肯定无问题,因为上面的程序已经显示了。
但是,可能从宿主机内连接容器内的 mysql 会出现问题。
用如下解决方案:

1、修改 msyql 配置

services - mysql - mysql.conf

[mysqld] 这个小节内加一句。
skip-name-resove

2、修改 docker-compose.yml

服务 mysql 中添加一句
command: --default-authentication-plugin=mysql_native_password

3、正确输入宿主机连接容器内 mysql 服务的命令

账号密码如有变动,自己改,否则默认用下面的
mysql -h127.0.0.1  -uroot -p123456 -P3306 --ssl-mode=DISABLED
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 1

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!