1.前言 我尝试使用 Docker 安装 php,我尝试了很多的方式,都没有效果,最后php7-3-容器安装SQL-Server-扩展 这篇文章才弄完了这个东西。
RockyLinux 9
Docker 20.1
php:7.3.7-fpm
ODBC
pdo_sqlsrv
pdo_mysql
2.目录 1 2 3 4 5 -- docker-compose.yml -- Dockerfile -- sqlserver_extension.sh -- openssl.cnf -- php.ini
3.sqlserver_extension.sh 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 apt-get update && apt-get install -y gnupg2 curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - curl https://packages.microsoft.com/config/debian/10/prod.list > /etc/apt/sources.list.d/mssql-release.list apt-get update ACCEPT_EULA=Y apt-get install -y msodbcsql17 ACCEPT_EULA=Y apt-get install -y mssql-tools echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrcapt-get install -y unixodbc-dev apt-get install -y libgssapi-krb5-2 docker-php-source extract && cd /tmp \ && curl -L -o /tmp/pdo_sqlsrv.tgz https://pecl.php.net/get/pdo_sqlsrv-5.9.0.tgz \ && curl -L -o /tmp/sqlsrv.tgz https://pecl.php.net/get/sqlsrv-5.9.0.tgz \ && tar zxvf pdo_sqlsrv.tgz && tar zxvf sqlsrv.tgz \ && mv pdo_sqlsrv-5.9.0 /usr/src/php/ext/pdo_sqlsrv \ && mv sqlsrv-5.9.0 /usr/src/php/ext/sqlsrv \ && docker-php-ext-install pdo_sqlsrv && docker-php-ext-install sqlsrv \ && docker-php-ext-install pdo && docker-php-ext-install pdo_mysql
参考文章: 【1】.容器内安装 容器中新增Microsoft ODBC Driver for SQL Server 驱动 Debian 9、Debian 10、Debian 8 【2】.【docker】php容器安装pdo_mysql扩展 1.进入php容器;2.执行安装 【3】.docker+php 安装pdo_mysql
4.Dockerfile 1 2 3 4 5 FROM php:7.3.7-fpm COPY sqlserver_extension.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/sqlserver_extension.sh RUN sh /usr/local/bin/sqlserver_extension.sh
5.dockeer-compose.yml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 version : '3.8' services: ph-php: container_name: ph-php restart: always build: context: . dockerfile: dockerfile ports: - "9000:9000" volumes - /cloud/master/PhEMSWxPHP:/var/www/html - ./openssl.cnf:/etc/ssl/openssl.cnf - ./php.ini:/usr/local/etc/php/php.ini
6.修改配置 先把配置文件拷出来,然后修改其中的内容。
1 2 3 4 docker cp 容器id :/usr/local/etc/php/php.ini-production ./php.ini docker cp 容器id :/etc/ssl/openssl.cnf ./openssl.cnf
(1) 修改 openssl.cnf 文件,为了解决 08001 问题,需要修改容器内的 /etc/ssl/openssl.cnf 文件
1 2 3 4 5 6 7 [system_default_sect] MinProtocol = TLSv1CipherString = DEFAULT:@SECLEVEL=1
(2) 修改 php.ini
1 2 3 4 session.auto_start =0 session.auto_start =1
参考文章: 【1】.request ssl_choose_client_version:unsupported protocol 这里有解决问题的办法。
7.启动 1 2 3 4 docker compose up -d docker compose down
问题 1.404问题 安装上面的docker配置之后,可以启动php容器,也可以正确的监听 9000 端口,但是在本机配置ningx之后,指向容器的 9000 端口,总是出现404错误。
1 2 3 4 5 6 7 8 9 10 11 12 location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/htmlfastcgi_script_name; fastcgi_connect_timeout 10; fastcgi_send_timeout 10; fastcgi_read_timeout 10; include fastcgi_params; }
我尝试修改了 nginx 里面的路径映射,修改了 docker php 配置,好像还是不起作用。
【解决方案】解决Docker中部署PHP-FPM出现”File not found.”的问题 这里和我的情况差不多,就是本机的nginx,docker中的php,这里说了配置了两个地方,一个就是nginx里面的东西,将 $document_root 改为了 /var/www/html,docker-compose.yml 配置 opt/myapp/html:/var/www/html。这里问题就是关于nginx配置和映射的问题,这个我尝试了很久,最后还是因为域名的问题,就是我修改的配置是另外一个,但是我访问的不是这个目录。
nginx 中的 $document_root 要换成 /var/www/html,fastcgi_param SCRIPT_FILENAME /var/www/htmlfastcgi_script_name;
docker-compose.yml 中的 volumes 要将本地路径映射到 /var/www/html
参考文章: 【1】.docker如何一键部署php项目教程 【2】.使用docker部署访问php项目 【3】.Docker 安装 PHP /Users/sui/www 是本地 php 文件的存储目录,/var/www/html 是容器内 php 文件的存储目录 【4】.Dockerfile基于镜像php:7.2-fpm构建自定义php7.2镜像 【5】.Docker + Nginx + PHP 访问403,404问题 【6】.php安装过程遇到的坑 解决思路:第一步:首先看一下是不是权限的问题;第二步:检查nginx配置,修改配置。 【7】.docker部署nginx+php的 各种坑 修改nginx.conf配置,加上php解析:这里的fastcgi_pass要是phprpm容器的内网ip地址,而不是127.0.0.1,其实nginx版本不通,document_root高版本已不支持,写成绝对路径,但大部署介绍写的是宿主机路径,这是错的。要写成phpfpm容器内的路径,如:/var/www/html 【8】.docker 搭建环境出现 FastCGI sent in stderr: “Primary script unknown” 在安装好 Nginx 并配置好根目录之后,采用了默认的 SCRIPT_FILENAME 配置参数,这样的话 FastCGI 无法定位到正确目录解析 php 文件,$document_root 表示 root 指定的目录,针对 /home/web 目录下的 php 文件进行解析。Nginx 用户与 Php-fpm 用户不一致 如果以上配置都为正确的情况下,将 nginx.conf 中的 user 用户配置与 www.conf 用户配置设置为统一的用户与用户组。
2.方式一 使用Docker安装配置php环境,我准备尝试一下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ROM php:7.1-fpm-jessie ENV ACCEPT_EULA=Y RUN apt-get update \ && curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \ && curl https://packages.microsoft.com/config/debian/8/prod.list \ > /etc/apt/sources.list.d/mssql-release.list \ && apt-get install -y --no-install-recommends \ locales \ apt-transport-https \ && echo "en_US.UTF-8 UTF-8" > /etc/locale.gen \ && locale-gen \ && apt-get update \ && apt-get -y --no-install-recommends install msodbcsql unixodbc-dev RUN docker-php-ext-install mbstring \ && pecl install sqlsrv pdo_sqlsrv \ && docker-php-ext-enable sqlsrv pdo_sqlsrv
参考文章: 【1】.PHP7连接访问SqlServer及开发环境搭建 这里也有一个dockerfile,但是我没有运行成功。
3.方式二 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 FROM php:7.2.11-fpm WORKDIR /application ENV ACCEPT_EULA=Y ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update \ && apt-get -y --no-install-recommends install apt-utils libxml2-dev gnupg apt-transport-https \ && apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/* RUN apt-get update \ && apt-get -y install git \ && apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/* RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \ && curl https://packages.microsoft.com/config/debian/9/prod.list > /etc/apt/sources.list.d/mssql-release.list \ && apt-get update \ && apt-get -y --no-install-recommends install msodbcsql17 unixodbc-dev \ && pecl install sqlsrv \ && pecl install pdo_sqlsrv \ && echo "extension=pdo_sqlsrv.so" >> `php --ini | grep "Scan for additional .ini files" | sed -e "s|.*:\s*||" `/30-pdo_sqlsrv.ini \ && echo "extension=sqlsrv.so" >> `php --ini | grep "Scan for additional .ini files" | sed -e "s|.*:\s*||" `/30-sqlsrv.ini \ && apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/* RUN docker-php-ext-install intl mysqli pdo pdo_mysql
参考文章: 【1】.Example of PHP 7.2.x Docker image install with MS SQL Server extensions php和mysql的dockerfile文件配置示例。这里还有安装 odbc 的dockerfile文件,这是上面的代码。 【2】.php容器中(docker)新增sqlserver扩展 本人容器操作系统版本是 Debian 10,根据个人实际操作系统找到对应操作系统对应版本按指示安装执行即可,vim /etc/ssl/openssl.cnf,我选择了将MinProcotol修改为TLSv1。
4.方式三 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 FROM php:7.2.11-fpm-jessie WORKDIR /Whitecap ENV ACCEPT_EULA=Y ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update -y && apt-get install -y \ libicu-dev \ && docker-php-ext-configure intl \ && docker-php-ext-install intl RUN apt-get update \ && apt-get -y --no-install-recommends install apt-utils libxml2-dev gnupg apt-transport-https \ && apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/* RUN apt-get update \ && apt-get -y install git \ && apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/* RUN apt-get update \ && curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \ && curl https://packages.microsoft.com/config/debian/10/prod.list \ > /etc/apt/sources.list.d/mssql-release.list \ && apt-get install -y --no-install-recommends \ locales \ apt-transport-https \ && echo "en_US.UTF-8 UTF-8" > /etc/locale.gen \ && locale-gen \ && apt-get update \ && apt-get -y --no-install-recommends install msodbcsql unixodbc-dev RUN docker-php-ext-install mbstring \ && pecl install sqlsrv pdo_sqlsrv \ && docker-php-ext-enable sqlsrv pdo_sqlsrv RUN docker-php-ext-install intl mysqli pdo pdo_mysql
php7-3-容器安装SQL-Server-扩展 这里分了两步,安装了
1 2 3 4 5 FROM php:7.3.7-fpm COPY sqlserver_extension.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/sqlserver_extension.sh RUN sh /usr/local/bin/sqlserver_extension.sh
参考文章: 【1】.php容器中(docker)新增sqlserver扩展 本人容器操作系统版本是 Debian 10,根据个人实际操作系统找到对应操作系统对应版本按指示安装执行即可 【2】.PHP安装sqlserver,为PHP docker映像安装/配置SQL Server PDO驱动程序 【3】.容器内安装 容器中新增Microsoft ODBC Driver for SQL Server 驱动 【4】.apt-get update failed to fetch debian amd64 packages while building dockerfile from maven:3.5.2-jdk-8 To update your repository configuration, change deb.debian.org to archive.debian.org in lines referencing Stretch in /etc/apt/sources.list and files in /etc/apt/sources.list.d 【6】.通过docker自定义安装php7.x并且安装源码扩展、pecl扩展、及其他扩展 php:7.2.4-fpm,docker中php扩展安装方式:1、PHP源码文件目录自带扩展 docker-php-ext-install直接安装;2、pecl扩展 因为一些扩展不包含在PHP源码文件中,PHP 的扩展库仓库中存在。用 pecl install 安装扩展,再用 docker-php-ext-enable 命令 启用扩展;3、其他扩展 一些既不在 PHP 源码包,也不再 PECL 扩展仓库中的扩展,可以通过下载扩展程序源码,编译安装的方式安装 【7】.【已解决】执行apt-get update报错404 Not Found的解决方案——docker 镜像下安装报错 这个错误表明你使用的操作系统版本,即 Debian 8 (jessie) 已经停止支持并已归档,因此官方软件源已经关闭。所以更新操作系统包列表时就会遇到 404 错误。如果要继续使用这个操作系统版本,你需要使用归档的 Debian 镜像源来更新包列表。 你可以在 /etc/apt/sources.list 文件中添加以下内容,指定归档源地址(直接执行一下命令即可) 【8】.docker执行apt-get update报错 Err http://security.debian.org jessie/updates/main amd64 Packages 可以看到404了,所以就是debian源地址改了,修改源,我们修改debian源地址,这里使用清华的debian源 【9】.如何在dockerfile中将apt-get源更换为中国国内源 这将使用 sed 命令替换默认的 Ubuntu 源为阿里云镜像。如果您使用的是 Debian 发行版,则可以使用以下命令替换默认源为中科大的镜像。
5.方式四 1 2 3 4 5 6 7 RUN docker-php-source extract && cd /tmp \ && curl -L -o /tmp/pdo_sqlsrv.tgz https://pecl.php.net/get/pdo_sqlsrv-5.9.0.tgz \ && curl -L -o /tmp/sqlsrv.tgz https://pecl.php.net/get/sqlsrv-5.9.0.tgz \ && tar zxvf pdo_sqlsrv.tgz && tar zxvf sqlsrv.tgz \ && mv pdo_sqlsrv-5.9.0 /usr/src/php/ext/pdo_sqlsrv \ && mv sqlsrv-5.9.0 /usr/src/php/ext/sqlsrv \ && docker-php-ext-install pdo_sqlsrv && docker-php-ext-install sqlsrv
在执行 php 的时候,出现了这个问题。
【尝试问题】
1 2 3 docker cp koko:/tmp/test.db ./data/test.db docker cp 容器id :/usr/local/etc/php/php.ini-development ./php.ini
【解决方案】 找到 php.ini 配置文件,session.auto_start,将其后面的0置为1,然后重启apache,就解决了!
参考文章: 【1】.session_start(): Cannot start session when headers already sent in 打开php.in配置文件,并改写其中内容(这里不推荐在记事本中操作此文件) 【2】.快速修改PHP镜像中的php.ini并生效 - wuuconix’s blog 进入后php –ini
7.could not find driver 这个问题主要就是没有安装 mysql 驱动导致的。
【解决方案】
1 2 3 4 5 6 7 8 9 10 11 12 docker exec -it php-phserver /bin/bash cd /usr/srcdocker-php-ext-install pdo pdo_mysql docker restart php-phserver
参考文章: 【1】.tp5.1 页面错误!请稍后再试~ 安装好后,提示错误 打开文件:config/app.php app_debug=true
8.连接超时 在安装了 mysql 数据库扩展之后,连接数据库,总是出现:504 Gateway Time-out。这里是 nginx 弹出的,但是实际上应该是 php 连接数据库的时候,出现了错误,至于哪里错误了,这个却不知道。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public function add ( ) { $dsn ='mysql:host=xxx:3306;dbname=vtigercrm6_5;charset=UTF8' ; $username ='phCrmUser' ; $passwd ='Mw-2o.tz86]erL' ; $pdo =new \PDO ($dsn ,$username ,$passwd ); $query = "select accountname from vtiger_account" ; $stmt = $pdo ->query ($query ); $customerName = $stmt ->fetchAll (); $this ->assign ('customerName' ,$customerName ); $query1 = "select productname from vtiger_products group by productname order by productname DESC" ; $stmt1 = $pdo ->query ($query1 ); $product = $stmt1 ->fetchAll (); $this ->assign ('product' ,$product ); $pdo = null ; return $this ->fetch (); }
【尝试方案】 (1)尝试设置超时属性,结果无效
1 2 3 4 5 6 7 8 9 $DBH = new PDO ( "mysql:host=$host ;dbname=$dbname " , $username , $password , array ( PDO::ATTR_TIMEOUT => 5 , // in seconds PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ) );
(2) 设置php.ini,设置超时值,结果无效。 修改php.ini,设置mysqlnd.net_read_timeout=n(单位秒,扩展原设置31536000秒)
(3) 开启日志,查看具体问题,好像没有什么效果。 修改 php.ini , log_errors=On
(4) 致命错误: Class ‘app\services\controller\PDO’ not found[/var/www/html/DingDing/application/services/controller/Index.php:52 这里就特别的奇怪,我明明已经安装了扩展,而且已经启动了, Module ‘pdo_mysql’ already loaded in Unknown on line 0,结果还是报这个错误。后来我解决了这个问题,但是虽然返回了 200,但是实际上还是不行的,因为还是显示 time-out。
参考文章: 【1】.PHP访问MySQL查询超时设置 【2】.Setting a connect timeout with PDO 【3】.PDO(mysql驱动)查询超时设置方法 修改php.ini,设置mysqlnd.net_read_timeout=n(单位秒,扩展原设置31536000秒) 【4】.php连接mysql报错连接超时:报错SQLSTATE[HY000] [2002] Connection timed out问题的一个解决思路 我的原因是因为网段被占用的问题,就是docker容器中的mysql网段被占用了 【5】.Docker php-fpm/nginx set-up: php-fpm throwing blank 500, no error logs [duplicate]