构建自己的 lnp 镜像文件

wanQQ
• 阅读 1186

构建自己的 lnp 镜像文件

本文记录使用 Dockerfile 构建自己的lnp过程,没有数据库(需要加上数据库的也可以加上,过程类似) 本次构建使用编译安装,原因是想要学一下 首先分享我本次构建用到的资源 my-lnmp.zip

my-lnmp.zip

my-lnp8.zip # php8.1

my-lnp7.zip # php7.4 两个文件仅在php版本上有差异

然后放出Dockerfile 文件,Dockerfile有两个 分别是

layered.DockerFile

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

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 构建出的镜像大小类似

构建自己的 lnp 镜像文件

  • 但是 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
      # 安装 编译 PHP 需要的依赖(这些依赖根据编译 PHP 时的扩展设置变化,需要自行判断需要那些依赖)
    • install-php.sh # 编译安装 PHP
    • install-nginx-rely.sh
      # 安装 编译 Nginx 需要的依赖(这些依赖根据编译 Nginx 时的扩展设置变化,需要自行判断需要那些依赖)
    • install-nginx.sh
      # 编译安装 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

    #! /bin/bash
    # 换源 执行部分前置操作
    rm /etc/apt/sources.list #删除原来的apt源
    cp /tmp/sources.list /etc/apt/sources.list #安装提前准备好的软件源
    cp /tmp/run.sh /home/run.sh # 将运行文件放到 /home
    cd /tmp
    tar zxvf php-8.1.0.tar.gz
    tar zxvf nginx-1.21.4.tar.gz
    chmod +x /home/run.sh # 给 此文件执行权限
    groupadd nobody
    # 创建 nginx 用户 
    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 内容

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```
```bash
#! /bin/bash
# 安装编译 PHP 所需依赖
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 # 安装 PHP 依赖
#获取 redis 扩展
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 redis
cd /tmp/php-8.1.0/
rm configure
./buildconf --force
  • 安装依赖

    install-php.sh

    #! /bin/bash
    # 编译安装 PHP
    

进入 /tmp/php-8.1.0/ 目录, php 源码解压到了这里

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/php ln -s /usr/local/php/sbin/php-fpm /usr/local/bin/php-fpm

-首先进行配置,这里的扩展项我是根据 Tp 和 Laravel 的要求所选择的,有其他需求的自行选择
- 编译 && 安装 注册环境变量 没什么可说的

### ```install-nginx-rely.sh```
```bash
 #! /bin/bash
# 安装编译 Nginx 所需依赖(部分依赖已在PHP依赖中安装,不再重复安装)
apt update && apt upgrade -y && apt-get update && apt-get upgrade -y
apt-get -y install libpcre3 libpcre3-dev libgd-dev  #安装 nginx 依赖
  • 安装依赖,此文件中的依赖并不全,原因是在安装 PHP 依赖时一部分依赖已经被安装了

    install-nginx.sh

    #! /bin/bash
    # 编译安装 Nginx
    

进入 /tmp/nginx-1.21.4 目录, Nginx 源码解压到了这里

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```
```bash
#! /bin/bash

# 安装composer
cd /tmp
php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');"
php composer-setup.php
mv composer.phar /usr/local/bin/composer
## 换源
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

config.sh

#! /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

#! /bin/bash
php-fpm
nginx
redis-server
  • 用于启动php-fpm nginx 和 redis-server 可自行修改

build.sh

#! /bin/bash

#sh /tmp/pre-operation.sh

# 换源 执行部分前置操作
rm /etc/apt/sources.list #删除原来的apt源
cp /tmp/sources.list /etc/apt/sources.list #安装提前准备好的软件源
cp /tmp/run.sh /home/run.sh # 将运行文件放到 /home
cd /tmp
tar zxvf php-8.1.0.tar.gz
tar zxvf nginx-1.21.4.tar.gz
chmod +x /home/run.sh # 给 此文件执行权限
groupadd nobody
# 创建 nginx 用户 
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 #安装一些自己可能会用到的软件,自行选择



#sh /tmp/install-php-rely.sh

# 安装编译 PHP 所需依赖
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 # 安装 PHP 依赖
#获取 redis 扩展
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 redis
cd /tmp/php-8.1.0/
rm configure
./buildconf --force

#sh /tmp/install-php.sh

# 编译安装 PHP

# 进入 /tmp/php-8.1.0/ 目录, php 源码解压到了这里
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/php
ln -s /usr/local/php/sbin/php-fpm /usr/local/bin/php-fpm

#sh /tmp/install-nginx-rely.sh

# 安装编译 Nginx 所需依赖(部分依赖已在PHP依赖中安装,不再重复安装)
apt update && apt upgrade -y && apt-get update && apt-get upgrade -y
apt-get -y install libpcre3 libpcre3-dev libgd-dev  #安装 nginx 依赖

#sh /tmp/install-nginx.sh

# 编译安装 Nginx

# 进入 /tmp/nginx-1.21.4 目录, Nginx 源码解压到了这里
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


#sh /tmp/install-composer.sh

# 安装composer
cd /tmp
php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');"
php composer-setup.php
mv composer.phar /usr/local/bin/composer
## 换源
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

#sh /tmp/config.sh


#配置 配置文件
##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 #开机自启
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这