使用Docker创建一个包含PHP5-Alpine开发环境的容器(包括MySQL和Redis)

首先

为了复习Docker,尝试构建PHP开发环境。

系统配置

    • nginx

 

    • php-fpm

php5/php7

mysql
redis

由于PHP5将不再受支持,我们正在进行PHP7的迁移。因此,我们需要一个PHP5的开发环境。

我只写了适用于PHP5的部分,如果忽略这部分,也可以在PHP7上运行。

Nginx + PHP7 + MySQL (+HTTP2) → Nginx加PHP7加MySQL(加HTTP2)

山田さん的文章非常详细地逐步阐述了Docker,有助于理解和复习。

谢谢!

使用docker-compose搭建nginx + HTTP/2 + PHP-FPM7 + MySQL环境的方法。

只需要一种选项,用汉语原生方式改写以下句子:

php5-alpine兼容。

我会从Docker Hub的PHP仓库中查找PHP5+alpine的镜像,并进行替换。

FROM php:5-fpm-alpine
RUN docker-php-ext-install pdo_mysql mysqli mbstring

我在GitHub上上传了修改后的文件。

支持Xdebug

在是否有调试器的情况下,可用装备的效率和威力就像是使用竹枪还是坦克一样不同。

以下是我创建的示例:
https://github.com/idani/nginx-http2-php-mysql/tree/master/step6-php5-xdebug

我将参考以下文章,来修改DockerFile文件。
我觉得参考这篇文章中链接到的GitHub上的配置文件会很有帮助。
建议阅读该文章一次。

在安装xdebug到php-alpine容器时遇到的问题的备忘录。

好的,对于PHP5来说,最新的Xdebug不支持。根据xdebug的发布说明,从2.6版本开始不再支持PHP5。因此我们将使用xdebug的2.5.5版本。
※请将2.5.5版本在PHP7中删除。

另外,通过安装Xdebug,现在可以显示时间警告。
因此,我也添加了时区设置。

FROM php:5-fpm-alpine

# timezone
ARG TZ=Asia/Tokyo

# Composer install
RUN set -eux && \
  apk add --update --no-cache --virtual=.build-dependencies \
    autoconf \
    gcc \
    g++ \
    make \
    tzdata && \
  cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
  echo ${TZ} > /etc/timezone && \
  pecl install xdebug-2.5.5 && \
  apk del .build-dependencies && \
  docker-php-ext-install pdo_mysql mysqli mbstring && \
  docker-php-ext-enable xdebug

另外,为了xdebug添加的设置,我们将其命名为「xdebug.ini」,并创建一个单独的文件来加载这些额外的设置。

[PHP] Xdebug のリモートデバッグ、理解していますか?を参考にさせていただきました。

补充一下,php.ini本身是使用容器的默认设置。
由于需要设置date.timezone,所以不是准备一个php.ini文件,而是在xdebug.ini中追加配置,将配置文件整合到一个文件中。

date.timezone = "Asia/Tokyo"

xdebug.remote_enable=1
xdebug.remote_autostart=1
xdebug.remote_port=9000
xdebug.remote_host="host.docker.internal"
xdebug.remote_connect_back = 0
; xdebug.remote_log=/tmp/xdebug.log

这个xdebug.ini文件被挂载到容器中作为共享文件使用。

version: '3'
services:
  web:
    image: nginx:1.13.5-alpine
    ports:
      - "80:80"
    depends_on:
      - app
    volumes:
      - ./web/default.conf:/etc/nginx/conf.d/default.conf
      - ./data/html:/var/www/html

  app:
    build: ./app
    env_file: .env
    environment:
      DATABASE_HOST: db
    depends_on:
      - db
    volumes:
      - ./data/html:/var/www/html
      - ./xdebug.ini:/usr/local/etc/php/conf.d/xdebug.ini
  db:
    image: mysql:5.7.19
    env_file: .env
    ports:
      - "3306:3306"
    volumes:
      - db-data:/var/lib/mysql
      - ./db/initial.sql:/docker-entrypoint-initdb.d/initial.sql

volumes:
  db-data:

我参考了以下的文章,成功地配置了VS Code的调试环境。

    Dockerで構築したPHP環境をxdebugでデバッグ(vscode)
        {
            "name": "Listen for XDebug step6",
            "type": "php",
            "request": "launch",
            "port": 9000,
            "pathMappings": {
                // {docker上のdocument root}:{ローカルのdocument root}
                "/var/www/html":"${workspaceRoot}/step6-php5-xdebug/data/html"
            }
        },   

请通过Git示例来查看launch.json的整体情况。

现在,您可以按照以下方式使用VS Code的调试模式。

index_php_—_nginx-http2-php-mysql.png
Step_6_nginx___PHP5___MySQL.png

填补

查看xdebug的设置,看到它使用9000端口,所以考虑将其设置为90001。由此可以推测php-fpm使用9000端口,与Xdebug的9000端口冲突。

其实我也曾经误解过,Xdebug是指客户端调试器(Vscode)成为服务器。

如果用图表示的话,大致如下。

php-docker-xdebug.png

简单来说。。。

    1. 当在浏览器中打开127.0.0.1(:80)时,会连接到Nginx(web)。

 

    1. Nginx根据访问index.php的请求,将PHP的处理委托给PHP-FPM的9000端口。

 

    1. PHP-FPM负责处理PHP,如果有Xdebug的设置,则将PHP的处理发送到”xdebug.remote_host:xdebug.remote_port”。

 

    调试器(VS Code)在127.0.0.1:9000端口上等待,并接收来自PHP-FPM的PHP处理信息。

使用PHP来引入Redis。

由于我也想要使用Redis,所以会进行引入。
和xdbug一样,似乎使用Pecl进行引入是常规做法。
在以下的DockerFile的Xdebug部分,将添加Redis。

FROM php:5-fpm-alpine

# timezone
ARG TZ=Asia/Tokyo

# Composer install
RUN set -eux && \
  apk add --update --no-cache --virtual=.build-dependencies \
    autoconf \
    gcc \
    g++ \
    make \
    tzdata && \
  cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
  echo ${TZ} > /etc/timezone && \
  pecl install redis xdebug-2.5.5 && \
  apk del .build-dependencies && \
  docker-php-ext-install pdo_mysql mysqli mbstring && \
  docker-php-ext-enable redis xdebug

接下来,在docker-compose.yml文件中添加Redis服务器。

version: '3'
services:
  web:
    image: nginx:1.13.5-alpine
    ports:
      - "80:80"
    depends_on:
      - app
    volumes:
      - ./web/default.conf:/etc/nginx/conf.d/default.conf
      - ./data/html:/var/www/html

  app:
    build: ./app
    env_file: .env
    environment:
      DATABASE_HOST: db
      REDIS_HOST: redis
    depends_on:
      - db
      - redis
    volumes:
      - ./data/html:/var/www/html
      - ./app/xdebug.ini:/usr/local/etc/php/conf.d/xdebug.ini
  db:
    image: mysql:5.7.19
    env_file: .env
    ports:
      - "3306:3306"
    volumes:
      - db-data:/var/lib/mysql
      - ./db/initial.sql:/docker-entrypoint-initdb.d/initial.sql
  redis:
    image: redis:alpine3.9
    command: redis-server --requirepass ${REDIS_PASSWORD}
    ports:
      - "${REDIS_PORT}:${REDIS_PORT}"
volumes:
  db-data:

在Redis中,密码(REDIS_PASSWORD)和端口(REDIS_PORT)是通过环境变量在“.env”中指定的。

・・・

# REDIS関係
REDIS_PORT=6379
REDIS_PASSWORD=password

确认一下在PHP中Redis的操作,我参考了phpredis的使用方法总结。

为了测试,在index.php中添加Redis的测试代码。
有个名为”REDIS_HOST”的环境变量,我们在docker-compose中指定了它在app容器中。

        $redis = new Redis();
        $redis->connect($_ENV['REDIS_HOST'], $_ENV['REDIS_PORT']);
        $redis->auth($_ENV['REDIS_PASSWORD']);
        echo '<pre class="log">';
        echo 'Redis接続' . PHP_EOL;
        echo $redis->ping() . PHP_EOL;

        // string_keyというkeyにhugaという値をセット
        $redis->set('string_key', 'huga');
        // 値を取得する
        $value = $redis->get('string_key');
        // 表示
        echo $value . PHP_EOL; // huga

        // lPushは先頭、rPushは末尾に値をpush
        $redis->rPush('list_key', 'a');
        $redis->rPush('list_key', 'b');
        $redis->lPush('list_key', 'c');
        $redis->lPush('list_key', 'd');

        // 値をすべて取得する -1はすべて
        $value = $redis->lRange('list_key', 0, -1);

        // 表示
        var_dump($value);
        echo '</pre>';

我已经确认了操作如下。

Step_7_nginx___PHP5___MySQL___xdebug___redis.png

总结

我們可以將PHP的開發環境無限次地重現。我們希望在今後的PHP開發中加以利用。

顺便一提,因为我想要一个测试邮件环境,所以我会去创建。我已经建立了邮件环境!

广告
将在 10 秒后关闭
bannerAds