在docker环境下启动php的注意事项-docker完整挂载php目录、在Docker查看容器完整启动命令以及mysql ERROR 2059问题
一、在docker环境下启动php的注意事项-docker完整挂载php目录
之前刚使用docker启动php,但因为只是简单启动,很多配置及挂载也没有搞,因为一搞就出错,真是蛋痛,今天好好地梳理了一下,基本都OK吧。在docker下pull下php之后要注意启动的php容器里有以下几个文件及目录比较重要:
1. /usr/local/etc/php-fpm.conf 这是php的配置文件。
2. /usr/local/etc/php-fpm.d 这里是配置的pool,可以配多个,一般就是www.conf
3. /usr/local/etc/php 这里是php启动加载的扩展文件,比如redis.so配置之类。
这当然是我现在已经完全明白之后的事,在这之前我只要修改一下最简单的docker启动php容器命令就会报错误PHP Startup: Unable to load dynamic library usr/local/lib/php/extensions/no-debug-non-zts-20160303/geoip.so,详细如下:
tu@u34:/data01/php$ docker logs -f b321be15a3c4
[09-Nov-2019 08:08:19] NOTICE: PHP message: PHP Warning: PHP Startup: Unable to load dynamic library /usr/local/lib/php/extensions/no-debug-non-zts-20160303/geoip.so - /usr/local/lib/php/extensions/no-debug-non-zts-20160303/geoip.so: cannot open shared object file: No such file or directory in Unknown on line 0
[09-Nov-2019 08:08:19] WARNING: Nothing matches the include pattern /usr/local/etc/php-fpm.d/*.conf from /usr/local/etc/php-fpm.conf at line 125.
[09-Nov-2019 08:08:19] ERROR: No pool defined. at least one pool section must be specified in config file
[09-Nov-2019 08:08:19] ERROR: failed to post process the configuration
[09-Nov-2019 08:08:19] ERROR: FPM initialization failed
我知道这是缺少了geoip.so扩展,但因为没有把相关的目录挂载出来,又没法去修改。现在把目录挂载出来了,只需要去扩展目录/usr/local/etc/php中删除对应的geoip.so就不会把这个错误。不过也可以了解一下geoip为什么报错,这是因为这个扩展依赖系统安装geoip模块,可以在docker中使用pecl安装此模块(会提示对系统有依赖,需要安装)。
除此之外还需要挂载日志目录,使用/var/log/php吧。docker里面都写到/var/log里面了,但这里有很多其它的日志,不如独立一个文件夹。于是完整的docker启动php命令就出来了,建议建一个新目录,里面保持和docker中的/usr/local/etc一一对应,这样不至于花精力去对应两边的目录文件。另外对php.ini的配置都写在php-fpm.conf中的pool文件中,比如www.conf,启动命令及www.conf配置如下:
#启动命令
tu@u34:/data01/php$ docker run --name php -idt -p 9000:9000 \
-v /opt/www-data/test.kermit.com:/var/www \
-v /data01/php/php-fpm.conf:/usr/local/etc/php-fpm.conf \
-v /data01/php/php-fpm.d:/usr/local/etc/php-fpm.d \
-v /data01/php/php:/usr/local/etc/php \
-v /data01/php/log:/var/log/php \
php镜像名称
#www.conf中添加的配置如下。包括开户慢日志
slowlog = /var/log/php/$pool.log.slow
php_admin_value[error_log] = /var/log/php/fpm-php.www.log
php_admin_flag[log_errors] = on
php_admin_value[memory_limit] = 2048M
php_admin_value[post_max_size] = 2048M
php_admin_value[upload_max_filesize] = 2048M
二、在Docker查看容器完整启动命令及mysql ERROR 2059 (HY000): Authentication plugin caching_sha2_password
1. Docker查看正在运行的容器完整启动命令:
docker安装运行一个镜像之后,有时忘记了原来是怎么启动的,又没有把原来的启动记录做个完整记录,这时真是不爽了。我找了一些网上说的可以docker完整启动命令的方式,但是不凑效啊。如下是别人说的方法:
docker ps -a --no-trunc
-l, --latest Show the latest created container (includes all states)
--no-trunc Don t truncate output
但这个方法我试了不可行,--no-trunc选项是让输出不要截取内容,但是即便用了这个选项,也没有显示完整,比如启动的php只会显示docker-php-entrypoint php-fpm,而不会显示挂载的目录文件。很失望啊,不过docker中的inspect命令会显示很详细的信息,而我们在启动一个程序时主要的参数也就是挂载的文件或目录,而这个是可以通过docker inspect 容器ID得到的结果中的HostConfig信息获得。里面有一个字段:Binds,记录了启动时的挂载文件目录明细,目前来看也就只能通过这里自己再拼凑一次启动命令了。
2. docker下安装指定版本镜像及错误
docker下安装指定版本镜像及错误:ERROR 2059 (HY000): Authentication plugin caching_sha2_password' cannot be loaded:
一个人搞一堆服务器,特别是公司流程烦,头真是十个大啊!准备先把预览机弄弄吧,使用docker下载安装mysql,因为环境原因,必须是mysql5.7版本。于是使用docker search搜了一下,发现docker上面也有一些问题,要么你安装官方版本,down的人也是最多最保险的,但它是一个latest最新的版本,要是指定版本搜就没有看到过官方的版本,除了官方版本,其它个人提交的下载量都很少,基本个位数,一大堆0的在后面垫底。很正常啊,个人提交的东西谁敢乱呢!有人可能说你可以加标签啊,我试了docker search mysql:5.7加标签,可以提前搜一下,加了标签下下来的也不是官方的。
我下了一个mysql的5.7版本,REPOSITORY名称叫做mysql.于是我使用如下命令进行安装。发现它根本不鸟我下载下来的镜像,直接云下载最新版的image了。docker下安装启动mysql5.7的命令如下:
#启动mysql
kermit@u27: docker run -d -p 3306:3306 --name mysql5.7 \
-v /data01/mysql57/conf:/etc/mysql/conf.d \
-v /data01/mysql57/logs:/logs \
-v /data01/mysql57/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=test123 \
mysql
....
#在还没有下载latest版的mysql执行上面的命令直接下载latest版,而不会使用第三行的镜像
kermit@u27:/data01/nginx/conf.d# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
kermit_php latest 9b3a2ed86cb6 4 hours ago 827MB
kermit_nginx latest 098b1d014880 4 hours ago 126MB
mysql 5.7 cd3ed0dfff7e 3 weeks ago 437MB
mysql latest c8ee894bd2bd 3 weeks ago 456MB
#可以使用IMAGE ID替代REPOSITORY,这样不会出现这个问题,看来REPOSITORY只是个名称可以重复
kermit@u27: docker run -d -p 3306:3306 --name mysql5.7 \
-v /data01/mysql57/conf:/etc/mysql/conf.d \
-v /data01/mysql57/logs:/logs \
-v /data01/mysql57/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=test123 \
cd3ed0dfff7e
在还没有下载latest版的mysql执行上面的命令直接下载latest版,而不会使用第三行的镜像,可以使用IMAGE ID替代REPOSITORY,这样不会出现这个问题,看来REPOSITORY只是个名称可以重复,通过上面开始的方法下载下来的mysql最新版是mysql8.*了,启动正常但是在本地连接mysql时就报了错:
ERROR 2059 (HY000): Authentication plugin caching_sha2_password' cannot be loaded;
问题就是MySQL8.0.11版本默认的认证方式是caching_sha2_password ,而在MySQL5.7版本则为mysql_native_password,又是一个变化啊。没时间研究,先用mysql5.7吧。不过网上有提供解决方法,修改mysql的配置文件设置这项参数。写入my.cnf文件后重启MySQL:
[mysqld]
default_authentication_plugin=mysql_native_password