使用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的调试模式。
填补
查看xdebug的设置,看到它使用9000端口,所以考虑将其设置为90001。由此可以推测php-fpm使用9000端口,与Xdebug的9000端口冲突。
其实我也曾经误解过,Xdebug是指客户端调试器(Vscode)成为服务器。
如果用图表示的话,大致如下。
简单来说。。。
-
- 当在浏览器中打开127.0.0.1(:80)时,会连接到Nginx(web)。
-
- Nginx根据访问index.php的请求,将PHP的处理委托给PHP-FPM的9000端口。
-
- 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>';
我已经确认了操作如下。
总结
我們可以將PHP的開發環境無限次地重現。我們希望在今後的PHP開發中加以利用。
顺便一提,因为我想要一个测试邮件环境,所以我会去创建。我已经建立了邮件环境!