Docker PHP
开发环境
PHP
镜像构建在 PHP for Dockerfile
需要设置如下环境变量:
环境变量名称 | 描述 |
---|---|
WEB_PATH |
网站目录, 就是网站程序根路径 |
MYSQL_DATA |
MySql 数据库数据目录,本地持久化存储 |
MYSQL_ROOT_PASSWORD |
初次运行需要设置,作为 MySql root 密码 |
WEB_USER |
php-fpm 运行账户,一般为主机账户,有权限对 ${WEB_PATH} 读写,常配置为用户 id ,用户名可能在容器内找不到 |
WEB_GROUP |
php-fpm 运行账户组,一般为主机账户组,有权限对 ${WEB_PATH} 读写,常配置为用户组 id ,用户组可能在容器内找不到 |
- 启动服务
$ docker-compose up -d
- 重启服务
$ docker-compose restart
- 注销服务
$ docker-compose down
- 为保证
MySql
密码安全,不要配置环境变量MYSQL_ROOT_PASSWORD
, 而通过运行时设置,例如执行如下命令
在首个命令前面加空格,以防止被加入到历史记录中,为了确保安全关闭当前
shell
窗口, 清空本地历史。 重启是为了保证MySql
容器中没有这个环境变量,避免容器泄露密码
$ MYSQL_ROOT_PASSWORD=123456 docker-compose up -d
$ docker-compose down
$ docker-compose up -d
php-fpm
默认与运行用户为www
, 手动修改 php-conf.d/user.ini
的用户和用户组,或者运行下面的 shell
$ echo -e "[www]\nuser = ${WEB_USER}\ngroup = ${WEB_GROUP}" > php-conf.d/user.ini
Nginx
运行用户可以在 docker-compose.yml
nginx
服务 volumes
配置项下面增加 ./nginx/nginx.conf:/etc/nginx/nginx.conf
使用自己的配置
配置模版可以通过运行 docker cp nginx:/etc/nginx/nginx.conf ./nginx/nginx.conf
修改其中的用户及组信息即可
网站目录在镜像中必须保持一致
当前默认配置 Nginx
与 PHP
镜像中的网站根目录均为 /var/www
,在配置 Nginx
网站时根目录应该是 /var/www/{project_path}
错误: SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client
发生这种错误,是由于 MySql
8 默认使用了新的密码验证插件:caching_sha2_password
,而之前的 PHP
版本中所带的 MySqlnd
无法支持这种验证。
一种办法是升级 PHP
支持 MySql
8 的新验证插件。
PHP 7.2.8
和 PHP 7.1.20
已经可以支持 caching_sha2_password
,直接连接 MySql
8。
PHP 7.1.8
和 PHP 5.6.26
还无法支持 caching_sha2_password
。
具体解决办法请参考: mysql.cnf 中的 default-authentication-plugin=MySql_native_password
配置。
在 PHP
程序中使用如下服务 host
:
服务名称 | 服务 host |
---|---|
mysql |
mysql |
redis |
redis |
修改 docker-compose.yml
中 redis
服务配置,如下:
redis:
container_name: redis
image: redis:alpine
privileged: true
restart: always
command: redis-server /etc/redis.conf
volumes:
- ./redis.conf:/etc/redis.conf
ports:
- "6379:6379"
其中 ./redis.conf
为自己创建的 Redis
配置文件。
PHP 这里有一份简短的模块列表, 详细的可以查看 phpinfo
程序获取。
新增扩展的方法, 修改 docker-compose.yml
中 php
服务配置,如下:
php:
container_name: php
image: php-extend
build: ./php-extend/
privileged: true
restart: always
volumes:
- ./php-conf.d:/usr/local/etc/conf.d/:rw
- ${WEB_PATH}:/var/www:rw
depends_on:
- redis
- mysql
然后在 ./php-extend/
目录下创建 Dockerfile
文件, 内容如下(替换 myshell
为自己安装扩展 shell
命令):
FROM thinkeridea/php:7.1.8
RUN set -xe \
&& myshell
&& echo "extension={扩展名称}.so" >> /usr/local/etc/conf.d/my-exend.ini
然后运行 docker-compose build php
就会编译一个为 php-extend
的镜像, 这个镜像包含 PHP
环境与你添加的扩展。
在运行
docker-compose build php
先注销掉整个服务,避免重启是出错。