构建自己的 lnp 镜像文件
本文记录使用 Dockerfile 构建自己的lnp过程,没有数据库(需要加上数据库的也可以加上,过程类似) 本次构建使用编译安装,原因是想要学一下 首先分享我本次构建用到的资源my-lnmp.zip
my-lnmp.zip
my-lnp8.zip # php8.1
my-lnp7.zip # php7.4 两个文件仅在php版本上有差异
然后放出Dockerfile 文件,Dockerfile有两个 分别是
layered.DockerFile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 FROM debian:11.1 ADD ./resource.tar.gz /tmp COPY ./pre-operation.sh tmp/pre-operation.sh RUN sh /tmp/pre-operation.sh COPY ./install-php-rely.sh /tmp/install-php-rely.sh RUN sh /tmp/install-php-rely.sh COPY ./install-php.sh /tmp/install-php.sh RUN sh /tmp/install-php.sh COPY ./install-nginx-rely.sh /tmp/install-nginx-rely.sh RUN sh /tmp/install-nginx-rely.sh COPY ./install-nginx.sh /tmp/install-nginx.sh RUN sh /tmp/install-nginx.sh COPY ./install-composer.sh /tmp/install-composer.sh RUN sh /tmp/install-composer.sh COPY ./config.sh /tmp/config.sh RUN sh /tmp/config.sh EXPOSE 80 LABEL wanQQ="w_c_y_929@163.com" WORKDIR /usr/share/nginx/html/public CMD ["/home/run.sh"]
polymeric.DockerFile
1 2 3 4 5 6 7 FROM debian:11.1 ADD ./resource.tar.gz /tmp RUN sh /tmp/build.sh EXPOSE 80 LABEL wanQQ="w_c_y_929@163.com" WORKDIR /usr/share/nginx/html/public CMD ["/home/run.sh"]
polymeric.DockerFile 和 layered.DockerFile 构建出的镜像大小类似
但是 polymeric.DockerFile 构建出的镜像层数比 layered.DockerFile 少,见仁见智吧
my-lnp8.zip 和 my-lnp7.zip 中均有 resource.tar.gz 文件 内容仅有少许差异,这里只列举 my-lnp8.zip 中的resource.tar.gz 文件
resource.tar.gz 文件中包含
layered.DockerFile # 多层构建的 DockerFile 文件
polymeric.DockerFile # 紧凑构建的 DockerFile 文件
run.sh # 镜像每次启动执行的 shell 放到 /home 目录
build.sh # 最终构建镜像时运行的shell命令(暂时不必理会),放到 /tmp 目录
sources.list # 阿里云镜像源文件在 此处 查看
php-8.1.0.tar.xz # PHP源码文件 在此处 找到并下载想要安装的 PHP 版本
nginx-1.21.4.tar.gz # nginx源码文件在此处 找到并下载想要安装的 nginx 版本
default.conf # nginx 配置文件(会被 nginx.conf 引用)
nginx.conf # nginx 配置文件
nginx # 使 nginx 开机启动的脚本文件
pre-operation.sh # 最先在 Dockerfile 运行的脚本
install-php-rely.sh <br>
# 安装 编译 PHP 需要的依赖(这些依赖根据编译 PHP 时的扩展设置变化,需要自行判断需要那些依赖)
install-php.sh # 编译安装 PHP
install-nginx-rely.sh <br>
# 安装 编译 Nginx 需要的依赖(这些依赖根据编译 Nginx 时的扩展设置变化,需要自行判断需要那些依赖)
install-nginx.sh <br>
# 编译安装 Nginx 由于部分依赖已经在 install-php-rely.sh 安装所以在 install-nginx-rely.sh 中没有重复安装 所以本文件需要在 install-php-rely.sh 和 install-nginx-rely.sh 都执行完以后执行
install-composer.sh # 安装 composer
config.sh # 对 php 和 nginx 进行配置
依赖的安装随着各系统和配置的不同会有所差异,在执行 configure 时会根据参数的不同编译不同的扩展,如果有缺失依赖的扩展将会报错,根据报错安装对应的包即可,需要注意的是 ,configure 时报错提示的包名和在软件源中的包名不一定一样 ,需要根据自己的系统在搜索引擎中搜索
下面看每个 shell 文件的内容和作用
pre-operation.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #! /bin/bash rm /etc/apt/sources.list cp /tmp/sources.list /etc/apt/sources.list cp /tmp/run.sh /home/run.sh cd /tmptar zxvf php-8.1.0.tar.gz tar zxvf nginx-1.21.4.tar.gz chmod +x /home/run.sh groupadd nobody groupadd nginx useradd -g nginx -s /sbin/nologin nginx apt update && apt upgrade -y && apt-get update && apt-get upgrade -y apt-get install -y apt-transport-https ca-certificates sysv-rc-conf vim wget unzip tmux redis php-pear
这一步主要做一些准备工作,将所有的资源解压到 /tmp 文件夹
更换软件源(这里是阿里的 sources.list 可以自行准备其他的国内源,不想换源也可以不换源)
创建 nginx 用户 如果这里不创建 nginx用户,在 nginx 编译安装时需要去除对应的配置
安装一些自己想用的软件 自行选择 阿里 sources.list 内容
1 2 3 4 5 6 7 8 9 deb http://mirrors.aliyun.com/debian/ bullseye main non-free contrib deb-src http://mirrors.aliyun.com/debian/ bullseye main non-free contrib deb http://mirrors.aliyun.com/debian-security/ bullseye-security main deb-src http://mirrors.aliyun.com/debian-security/ bullseye-security main deb http://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib deb-src http://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib deb http://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib deb-src http://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib
install-php-rely.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #! /bin/bash apt update && apt upgrade -y && apt-get update && apt-get upgrade -y apt-get -y install build-essential autoconf automake libtool make re2c bison pkg-config libxml2-dev openssl libssl-dev libcurl4-openssl-dev libsqlite3-dev libonig-dev zlib1g-dev cd /tmp/php-8.1.0/ext/pecl channel-update pecl.php.net pecl download redis redis=$(ls -l | grep redis | awk '{print $9}' ) gzip -d < $redis | tar -xvf - rm $redis redis=$(ls -l | grep redis | awk '{print $9}' ) mv $redis rediscd /tmp/php-8.1.0/rm configure./buildconf --force
install-php.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 #! /bin/bash cd /tmp/php-8.1.0/./configure --prefix=/usr/local/php \ --with-config-file-path=/usr/local/php/etc \ --enable-fpm \ --enable-mbstring \ --with-curl \ --with-mysqli \ --enable-bcmath \ --with-openssl \ --with-zlib \ --enable-redis make && make install ln -s /usr/local/php/bin/php /usr/local/bin/phpln -s /usr/local/php/sbin/php-fpm /usr/local/bin/php-fpm
-首先进行配置,这里的扩展项我是根据 Tp 和 Laravel 的要求所选择的,有其他需求的自行选择
install-nginx-rely.sh
1 2 3 4 apt update && apt upgrade -y && apt-get update && apt-get upgrade -y apt-get -y install libpcre3 libpcre3-dev libgd-dev
安装依赖,此文件中的依赖并不全,原因是在安装 PHP 依赖时一部分依赖已经被安装了
install-nginx.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 37 38 39 #! /bin/bash cd /tmp/nginx-1.21.4/./configure --prefix=/usr/local/nginx \ --user=nginx \ --group=nginx \ --with-pcre \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_realip_module \ --with-http_addition_module \ --with-http_sub_module \ --with-http_dav_module \ --with-http_flv_module \ --with-http_mp4_module \ --with-http_gunzip_module \ --with-http_gzip_static_module \ --with-http_random_index_module \ --with-http_secure_link_module \ --with-http_stub_status_module \ --with-http_auth_request_module \ --with-http_image_filter_module \ --with-http_slice_module \ --with-mail \ --with-threads \ --with-file-aio \ --with-stream \ --with-mail_ssl_module \ --with-stream_ssl_module make && make install ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/nginx
-首先进行配置,这里的扩展项我是根据别人的文章里配置的,有其他需求的自行选择
如果前面没有创建 nginx 用户 那么 –user=nginx –group=nginx 配置项需要去掉
编译 && 安装 注册环境变量 没什么可说的
install-composer.sh
1 2 3 4 5 6 7 8 9 #! /bin/bash cd /tmpphp -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');" php composer-setup.php mv composer.phar /usr/local/bin/composercomposer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
config.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #! /bin/bash #配置 配置文件 ##php cp /tmp/php-8.1.0/php.ini-production /usr/local/php/php.ini cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf cp /tmp/php-8.1.0/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm chmod +x /etc/init.d/php-fpm chmod 777 /etc/init.d/php-fpm sysv-rc-conf php-fpm on #开机自启 ##nginx mkdir -p /usr/share/nginx/html/public cp /tmp/index.php /usr/share/nginx/html/public/index.php cp /tmp/default.conf /usr/local/nginx/conf/default.conf cp /tmp/nginx.conf /usr/local/nginx/conf/nginx.conf cp /tmp/nginx /etc/init.d/nginx chmod +x /etc/init.d/nginx chmod 777 /etc/init.d/nginx sysv-rc-conf nginx on #开机自启
对 php 和 nginx 进行配置,这一块我也比较迷糊
配置的开机自启似乎并没有作用,所以我是使用 CMD [“/home/run.sh”] 来实现的,有懂的大佬可以给我留言
run.sh
1 2 3 4 5 #! /bin/bash php-fpm nginx redis-server
用于启动php-fpm nginx 和 redis-server 可自行修改
build.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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 #! /bin/bash rm /etc/apt/sources.list cp /tmp/sources.list /etc/apt/sources.list cp /tmp/run.sh /home/run.sh cd /tmptar zxvf php-8.1.0.tar.gz tar zxvf nginx-1.21.4.tar.gz chmod +x /home/run.sh groupadd nobody groupadd nginx useradd -g nginx -s /sbin/nologin nginx apt update && apt upgrade -y && apt-get update && apt-get upgrade -y apt-get install -y apt-transport-https ca-certificates sysv-rc-conf vim wget unzip tmux redis php-pear apt update && apt upgrade -y && apt-get update && apt-get upgrade -y apt-get -y install build-essential autoconf automake libtool make re2c bison pkg-config libxml2-dev openssl libssl-dev libcurl4-openssl-dev libsqlite3-dev libonig-dev zlib1g-dev cd /tmp/php-8.1.0/ext/pecl channel-update pecl.php.net pecl download redis redis=$(ls -l | grep redis | awk '{print $9}' ) gzip -d < $redis | tar -xvf - rm $redis redis=$(ls -l | grep redis | awk '{print $9}' ) mv $redis rediscd /tmp/php-8.1.0/rm configure./buildconf --force cd /tmp/php-8.1.0/./configure --prefix=/usr/local/php \ --with-config-file-path=/usr/local/php/etc \ --enable-fpm \ --enable-mbstring \ --with-curl \ --with-mysqli \ --enable-bcmath \ --with-openssl \ --with-zlib \ --enable-redis make && make install ln -s /usr/local/php/bin/php /usr/local/bin/phpln -s /usr/local/php/sbin/php-fpm /usr/local/bin/php-fpmapt update && apt upgrade -y && apt-get update && apt-get upgrade -y apt-get -y install libpcre3 libpcre3-dev libgd-dev cd /tmp/nginx-1.21.4/./configure --prefix=/usr/local/nginx \ --user=nginx \ --group=nginx \ --with-pcre \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_realip_module \ --with-http_addition_module \ --with-http_sub_module \ --with-http_dav_module \ --with-http_flv_module \ --with-http_mp4_module \ --with-http_gunzip_module \ --with-http_gzip_static_module \ --with-http_random_index_module \ --with-http_secure_link_module \ --with-http_stub_status_module \ --with-http_auth_request_module \ --with-http_image_filter_module \ --with-http_slice_module \ --with-mail \ --with-threads \ --with-file-aio \ --with-stream \ --with-mail_ssl_module \ --with-stream_ssl_module make && make install ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/nginxcd /tmpphp -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');" php composer-setup.php mv composer.phar /usr/local/bin/composercomposer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ cp /tmp/php-8.1.0/php.ini-production /usr/local/php/php.inicp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.confcp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.confcp /tmp/php-8.1.0/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpmchmod +x /etc/init.d/php-fpmchmod 777 /etc/init.d/php-fpmsysv-rc-conf php-fpm on mkdir -p /usr/share/nginx/html/publiccp /tmp/index.php /usr/share/nginx/html/public/index.phpcp /tmp/default.conf /usr/local/nginx/conf/default.confcp /tmp/nginx.conf /usr/local/nginx/conf/nginx.confcp /tmp/nginx /etc/init.d/nginxchmod +x /etc/init.d/nginxchmod 777 /etc/init.d/nginxsysv-rc-conf nginx on
不再重复解释,仅是把前面的文件整合到一起
参考文章:
Debian/Ubuntu下使用sysv-rc-conf将NGINX设置为自启动 - VPS推荐 (vpstry.com)
编译安装php+nginx详细步骤 - ranblogs - 博客园 (cnblogs.com)
PHP: Unix 系统下的安装 - Manual
PHP 常用扩展模块 - 简书 (jianshu.com)
安装 |《Laravel 8 中文文档 8.x》| Laravel China 社区 (learnku.com)
安装ThinkPHP · ThinkPHP5.0完全开发手册 · 看云 (kancloud.cn)