Linux安装DockerPHP

标签: 无 分类: 未分类 创建时间:2024-11-12 11:15:20 更新时间:2024-11-15 10:49:43

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
# sqlserver
apt-get update && apt-get install -y gnupg2
curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -

#Download appropriate package for the OS version
#Choose only ONE of the following, corresponding to your OS version

#Debian 9
#curl https://packages.microsoft.com/config/debian/9/prod.list > /etc/apt/sources.list.d/mssql-release.list

#Debian 10
curl https://packages.microsoft.com/config/debian/10/prod.list > /etc/apt/sources.list.d/mssql-release.list

#Debian 11
#curl https://packages.microsoft.com/config/debian/11/prod.list > /etc/apt/sources.list.d/mssql-release.list

apt-get update
ACCEPT_EULA=Y apt-get install -y msodbcsql17
# optional: for bcp and sqlcmd
ACCEPT_EULA=Y apt-get install -y mssql-tools
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
#source ~/.bashrc
# optional: for unixODBC development headers
apt-get install -y unixodbc-dev
# optional: kerberos library for debian-slim distributions
apt-get install -y libgssapi-krb5-2

# sqlserver php extension
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
参考文章:
【1】.容器内安装 容器中新增Microsoft ODBC Driver for SQL Server 驱动 Debian 9、Debian 10、Debian 8

4.Dockerfile

1
2
3
4
5
FROM php:7.3.7-fpm
# install sqlserver odbc/php extension
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
# copy 配置 php.ini 文件
docker cp 容器id:/usr/local/etc/php/php.ini-production ./php.ini
# copy 拷贝 openssl.cnf
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 = TLSv1.2
# CipherString = DEFAULT@SECLEVEL=2
# 现在
MinProtocol = TLSv1
CipherString = 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 compse 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的超时时间(单位:秒)
fastcgi_connect_timeout 10;
# 向Fastcgi传送请求的超时时间,这个值是指已经完成两次握手后向Fastcgi传送请求的超时时间(单位:秒)
fastcgi_send_timeout 10;
# 指定接收Fastcgi应答的超时时间,这个值是指已经完成两次握手后接收Fastcgi应答超时时间(单位:秒)
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

# Microsoft SQL Server Prerequisites
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

# Fix debconf warnings upon build
ARG DEBIAN_FRONTEND=noninteractive

# Install selected extensions and other stuff
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/*

# Install git
RUN apt-get update \
&& apt-get -y install git \
&& apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/*

# Install MS ODBC Driver for SQL Server
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/*

# Install required extensions
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

# Fix debconf warnings upon build
ARG DEBIAN_FRONTEND=noninteractive

# RUN echo "deb http://archive.debian.org/debian stretch main" > /etc/apt/sources.list

# RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 112695A0E562B32A

# Install libicu and intl
RUN apt-get update -y && apt-get install -y \
libicu-dev \
&& docker-php-ext-configure intl \
&& docker-php-ext-install intl

# Install selected extensions and other stuff
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/*

# Install git
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

# Install required extensions
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
# install sqlserver odbc/php extension
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

6.session_start(): Cannot start session when headers already sent in

在执行 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
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。