跳至主要內容

php环境使用docker构建

Mr.Lexon大约 6 分钟environment

php环境使用docker构建

注意: 本方案还是需要人工建立php环境容器,并非完全以dockerFile直接构建出来,但是前面的构建成功之后,可对镜像导出或上传至docker hub中,直接拉取使用,方案做得比较粗糙,整个容器的大小尚未压缩,但是应付一般和测试情况足以。

安装

首先执行拉取ubuntu镜像,并进入镜像

docker pull ubuntu
docker run -it ubuntu /bin/bash

安装容器依赖:

apt install -y gcc autoconf libxml2 bzip2 curl e2fsprogs openssl patch git libtool automake telnet cmake bison iptables psmisc wget net-tools traceroute whois g++ libjpeg-tools libjpeg-dev libpng-tools libpng-dev libfreetype-dev libxml2-dev zlib1g zlib1g-dev libglib2.0-dev libbz2-dev libncurses5 libncurses5-dev e2fsprogs e2fslibs-dev libssl-dev bind9-utils libsqlite3-dev libcurl4-openssl-dev libldap-dev libsasl2-dev libonig-dev

2、下载PHP拓展包:
这里遵循单个容器单个服务,所以不再直接安装nginx, 从PHP 5.3.3版本起,PHP已经集成php-fpm了,不再是第三方的包了。在编译PHP时./configure的时候带 –enable-fpm参数即可开启PHP-FPM

mkdir -p /data0/software
cd /data0/software
wget http://cn2.php.net/distributions/php-8.2.12.tar.gz
wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.17.tar.gz
wget https://libzip.org/download/libzip-1.10.1.tar.gz

二、安装PHP (FastCGIopen in new window
由于采用了mysqlndopen in new window,编译PHP时不再需要先编译MySQL。 oniguruma是一个处理正则表达式的库,我们之所以需要安装它,是因为在安装php7.4+的过程中,mbstring的正则表达式处理功能对这个包有依赖性,所以我们要先安装这个库

1、编译安装PHP所需的支持库

tar zxvf libiconv-1.17.tar.gz
cd /data0/software/libiconv-1.17
./configure --prefix=/usr/local
make
make install
cd ../
 
apt remove -y libzip
apt install -y cmake3
tar zxvf libzip-1.10.1.tar.gz
cd libzip-1.10.1
mkdir build && cd build && cmake .. && make && make install
cd ../../
 
wget https://github.com/kkos/oniguruma/releases/download/v6.9.8/onig-6.9.8.tar.gz -O oniguruma-6.9.8.tar.gz
tar -zxvf oniguruma-6.9.8.tar.gz
mv onig-6.9.8 oniguruma-6.9.8
cd oniguruma-6.9.8/
./configure --prefix=/usr/local --libdir=/lib64
make
make install
cd ../

2、编译安装PHP

echo /usr/local/lib >> /etc/ld.so.conf
echo /usr/local/lib64 >> /etc/ld.so.conf
ldconfig

tar zxvf php-8.2.12.tar.gz
cd php-8.2.12
export PKG_CONFIG_PATH="/usr/local/lib/pkgconfig/"
cp -frp /usr/lib64/libldap* /usr/lib #不需要
ln -s /usr/lib64/liblber* /usr/lib/ #不需要
./configure --prefix=/usr/local/webserver/php-8.2.12 --with-config-file-path=/usr/local/webserver/php-8.2.12/etc --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd  --with-iconv=/usr/local --with-zlib --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem  --with-curl --enable-mbregex --enable-fpm --enable-mbstring --enable-gd --with-openssl  --enable-pcntl --enable-sockets --with-ldap --with-ldap-sasl --enable-soap --enable-opcache --enable-exif --enable-sysvmsg --with-zip
make ZEND_EXTRA_LIBS='-liconv'
make install
cp php.ini-production /usr/local/webserver/php-8.2.12/etc/php.ini
cd ../

3、编译安装PHP扩展模块

cd /data0/software/
git clone https://github.com/nicolasff/phpredis
cd phpredis
git submodule init
git submodule update
/usr/local/webserver/php-8.2.12/bin/phpize
./configure --with-php-config=/usr/local/webserver/php-8.2.12/bin/php-config
make && make install
cd ../
 
cd /data0/software/
git clone https://gitee.com/swoole/swoole.git
cd swoole
/usr/local/webserver/php-8.2.12/bin/phpize
./configure --with-php-config=/usr/local/webserver/php-8.2.12/bin/php-config --enable-openssl
make
make install
cd ../

配置

修改php.ini文件

手工修改:

vi /usr/local/webserver/php-8.2.12/etc/php.ini

查找php.ini中的

; extension_dir = "./"

修改为

extension_dir = "/usr/local/webserver/php-8.2.12/lib/php/extensions/no-debug-non-zts-20220829/"

注意要去掉extension_dir 前面的分号(😉
并在此行后增加以下几行,然后保存:

;extension = "memcache.so"
;extension = "imagick.so"
extension = "redis.so"
extension = "swoole.so"

查找

;cgi.fix_pathinfo=1

修改为

cgi.fix_pathinfo=0

查找

;date.timezone =

修改为

date.timezone = Asia/Hong_Kong

说明,timezone可以到这里open in new window查找对应的timezone

sed一键修改上述配置:

sed -i 's#;extension_dir = "./"#extension_dir = "/usr/local/webserver/php-8.2.12/lib/php/extensions/no-debug-non-zts-20220829/"\nextension = "redis.so"\nextension = "swoole.so"\n#' /usr/local/webserver/php-8.2.12/etc/php.ini
sed -i "s#;cgi.fix_pathinfo=1#cgi.fix_pathinfo=0#g" /usr/local/webserver/php-8.2.12/etc/php.ini
sed -i "s#;date.timezone =#date.timezone = Asia/Hong_Kong#g" /usr/local/webserver/php-8.2.12/etc/php.ini

创建php-fpm运行用户组

创建www用户和组,以及供blog.abc.comopen in new windowwww.abc.comopen in new window两个虚拟主机使用的目录:

/usr/sbin/groupadd www
/usr/sbin/useradd -g www www
mkdir -p /data0/htdocs/blog
chmod +w /data0/htdocs/blog
chown -R www:www /data0/htdocs/blog
mkdir -p /data0/htdocs/www
chmod +w /data0/htdocs/www
chown -R www:www /data0/htdocs/www

创建php-fpm配置文件

cd /usr/local/webserver/php-8.2.12/etc/
mv php-fpm.conf.default php-fpm.conf
vim /usr/local/webserver/php-8.2.12/etc/php-fpm.conf

修改下面几个地方

pid = run/php-fpm.pid
error_log = log/php-fpm.log
process_control_timeout = 5s
rlimit_files = 65535
rlimit_core = 0

sed一键修改上述配置:

sed -i "s#;pid = run/php-fpm.pid#pid = run/php-fpm.pid#g" /usr/local/webserver/php-8.2.12/etc/php-fpm.conf
sed -i "s#;error_log = log/php-fpm.log#error_log = log/php-fpm.log#g" /usr/local/webserver/php-8.2.12/etc/php-fpm.conf
sed -i "s#;process_control_timeout = 0#process_control_timeout = 5s#g" /usr/local/webserver/php-8.2.12/etc/php-fpm.conf
sed -i "s#;rlimit_files = 1024#rlimit_files = 65535#g" /usr/local/webserver/php-8.2.12/etc/php-fpm.conf
sed -i "s#;rlimit_core = 0#rlimit_core = 0#g" /usr/local/webserver/php-8.2.12/etc/php-fpm.conf

创建配置文件:

cd /usr/local/webserver/php-8.2.12/etc/php-fpm.d
mv www.conf.default www.conf
vim /usr/local/webserver/php-8.2.12/etc/php-fpm.d/www.conf

需要修改的几个地方

user=www
group=www
listen.backlog = 128
pm = static
pm.max_children = 128
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 1024
rlimit_core = 0
catch_workers_output = yes

sed一键修改上述配置:

sed -i "s#;listen.backlog = 511#listen.backlog = 128#g" /usr/local/webserver/php-8.2.12/etc/php-fpm.d/www.conf
sed -i "s#pm = dynamic#pm = static#g" /usr/local/webserver/php-8.2.12/etc/php-fpm.d/www.conf
sed -i "s#pm.max_children = 5#pm.max_children = 16#g" /usr/local/webserver/php-8.2.12/etc/php-fpm.d/www.conf
sed -i "s#pm.start_servers = 2#pm.start_servers = 20#g" /usr/local/webserver/php-8.2.12/etc/php-fpm.d/www.conf
sed -i "s#pm.min_spare_servers = 1#pm.min_spare_servers = 5#g" /usr/local/webserver/php-8.2.12/etc/php-fpm.d/www.conf
sed -i "s#pm.max_spare_servers = 3#pm.max_spare_servers = 35#g" /usr/local/webserver/php-8.2.12/etc/php-fpm.d/www.conf
sed -i "s#;pm.max_requests = 500#pm.max_requests = 1024#g" /usr/local/webserver/php-8.2.12/etc/php-fpm.d/www.conf
sed -i "s#;rlimit_core = 0#rlimit_core = 0#g" /usr/local/webserver/php-8.2.12/etc/php-fpm.d/www.conf
sed -i "s#;catch_workers_output = yes#catch_workers_output = yes#g" /usr/local/webserver/php-8.2.12/etc/php-fpm.d/www.conf

配置php环境变量

ln -s /usr/local/webserver/php-8.2.12/bin/php /usr/bin/php

启动测试

拷贝init.d.php-fpm到/etc/init.d

cp init.d.php-fpm /etc/init.d/
ln -s /usr/local/webserver/php-8.2.12/ /usr/local/webserver/php

并修改名称和权限

mv init.d.php-fpm php-fpm
chmod 755 php-fpm

运行

service php-fpm start

运行出现:

Starting php-fpm  done

输入:

service php-fpm status

出现:

php-fpm (pid 245) is running...

即为启动成功

保存镜像

首先保持原来的容器运行,在另外的窗口创建一个连接,然后输入以下命令

docker ps

然后找到对应的容器ID,并执行:

docker commit [容器ID] [镜像名称]

显示出一段sha256编码即为成功。 因为在运行过程中保存可以较好的找到对应的容器,如果关闭了容器,可以执行以下命令找到:

docker ps -a

警告

操作完的镜像一定要做这一步的操作,否则会丢失之前的所有操作记录 ## 编写dockerfile 首先进行目录映射测试: docker run -it -v /data0/project/test1/:/project --name test1 2bbe8bf274fc 命令解析: docker run -it -v <映射原始目录>:<映射目标目录> --name <命名容器名称> <容器id> 执行之后进入容器命令行,cd到对应映射目标目录,执行以下命令: (测试项目为laravel) php artisan serve 可运行,成功. 编写Dockerfile: ``` Dockerfile FROM php8.2:v1.1 USER root

EXPOSE 9000 EXPOSE 8000

WORKDIR "/project"

CMD ["./serve.sh"]

然后再对应项目目录创建一个名为`serve.sh`的文件,文件内容:
``` shell
#!/bin/bash

phpFpm(){
        service php-fpm start
}
phpServe(){
        /usr/local/webserver/php/bin/php artisan serve --host=0.0.0.0 --port=8000
}

phpFpm
phpServe

第一个函数为启动fpm,第二个函数为启动laravel服务 创建完后保存,并进入对应的文件目录,然后打包镜像:

docker build -t php8.2 .

(注意最后有一个点.表示当前目录) 打包完之后执行以下命令

docker images

得到:

REPOSITORY                 TAG               IMAGE ID       CREATED          SIZE
php8.2                     latest            a66613bf2239   last second   1.95GB

那么就打包完成了。

运行打包完的镜像

执行以下命令:

docker run -it -v /data0/project/test1/:/project -p 8080:8000 php8.2

这里的-p参数是将容器内的8000端口映射到宿主机的8080端口 当出现laravel的命令行时,在浏览器里面输入网址,当网址可以直接进入laravel首页时,即为成功。

提交镜像至docker hub

首先要在docker hub创建一个账户,在hub中创建一个docker repositories 然后在命令行上执行:

docker login

登录账号 接着执行以下命令查看docker需要上传的images的id

docker images

如下所示,这里的 IMAGE ID就是所要的数值

REPOSITORY TAG IMAGE ID CREATED SIZE php8.2 v1.0 2bbe8bf274fc 12 hours ago 1.95GB

然后执行:

docker tag <images_id> <docker_hub_user_name>/<images_name>:<tag_name>

当对应镜像变成如下时: REPOSITORY TAG IMAGE ID CREATED SIZE webdocker112/php8.2 v1.0 2bbe8bf274fc 12 hours ago 1.95GB 就可以上传了 执行:

docker push <docker_hub_user_name>/<images_name>:<tag_name>

执行完成即上传成功.

容器导出至本地

可使用以下命令:

docker save <镜像ID> > <文件全名>
上次编辑于:
贡献者: Lexon