使用Dockerfile定制LNMP环境镜像

2023-11-15

                        使用Dockerfile定制LNMP环境镜像

   LNMP是继LAMP之后的又一个非常流行的web框架,即Linux+Nginx+Mysql+PHP网站架构方案。nginx相较于apache更轻量级,尤其是对静态页面的处理更有优势。做运维的朋友应该都知道一个流行的词汇——动静态分离,其中一个比较普遍的是使用nginx处理静态页面,而动态页面交由后端的apache或者tomcat处理。本文要讲的是通过Dockerfile构建LNMP环境镜像,分别把nginx、mysql和PHP部署在docker容器里,实现LNMP网站架构。

一、项目环境介绍

1)系统环境
操作系统版本:Centos 7.5 64位
Docker版本:18.06.1-ce(社区版)
Nginx版本:1.15.5
PHP版本:7.2.11
Mysql版本:8.0.12
ip地址:192.168.2.2
lnmp网络ip地址:172.18.0.1
2)源码包下载地址
nginx下载地址:http://nginx.org/download/nginx-1.15.5.tar.gz
php下载地址:http://cn2.php.net/get/php-7.2.11.tar.gz/from/this/mirror
mysql使用官方8.0.12镜像

3)目录结构

1. 下载目录树

[root@localhost /]# yum -y install tree

2. 创建dockerfile的目录

[root@localhost /]# mkdir /dockerfile/

[root@localhost /]# cd  /dockerfile/

[root@localhost dockerfile]# mkdir nginx

[root@localhost dockerfile]# mkdir php

[root@localhost dockerfile]# cd  php

上传php-7.2.11.tar.gz的安装包

3. 构建镜像

1)编写Dockerfile文件

[root@localhost php]# vim Dockerfile

内容如下:

FROM centos:7

ENV TIME_ZOME Asia/Shanghai

ARG PV="php-7.2.11"

ADD $PV.tar.gz /tmp

RUN yum -y install gcc gcc-c++ make gd-devel libxml2-devel libcurl-devel libjpeg-devel libpng-devel openssl-devel bison libm* \

    && mkdir /data \

    && cd /tmp/$PV \

    && ./configure --prefix=/data/php  --with-config-file-path=/data/php/etc --with-gd --with-mysqli --with-openssl --with-zlib --with-curl --with-jpeg-dir --with-png-dir --with-iconv  --enable-fpm --enable-zip --enable-mbstring --with-mysql=mysqlnd  --with-pdo-mysql=mysqlnd  --with-mysqli=mysqlnd  --with-openssl  --enable-fpm  --enable-sockets  --enable-sysvshm  --enable-mbstring  --with-freetype-dir  --with-jpeg-dir  --with-png-dir  --with-zlib  --with-libxml-dir=/usr  --enable-xml  --with-mhash  --with-mcrypt=/data/php/libmcrypt  --with-config-file-path=/etc  --with-config-file-scan-dir=/etc/php.d  --with-config-file-path=/etc  --with-config-file-scan-dir=/etc/php.d \

    && make -j 4 \

    && make install \

    && cp /data/php/etc/php-fpm.conf.default /data/php/etc/php-fpm.conf \

    && cp /data/php/etc/php-fpm.d/www.conf.default /data/php/etc/php-fpm.d/www.conf \

    && sed -i '/;daemonize/a\daemonize = no' /data/php/etc/php-fpm.conf \

    && sed -i 's/127.0.0.1/0.0.0.0/g' /data/php/etc/php-fpm.d/www.conf \

    && echo "${TIME_ZOME}" > /etc/timezone \

    && ln -sf /usr/share/zoneinfo/${TIME_ZOME} /etc/localtime \

    && rm -rf /tmp/php* \

    && yum clean all \

    && yum -y remove gcc gcc-c++ make

WORKDIR /data/php/

EXPOSE 9000

CMD ["sbin/php-fpm","-c","etc/php-fpm.conf"]

注:daemonize = no表示fpm在前台运行

2)构建PHP镜像

[root@localhost php]# docker build -t php:7.2.11 .

此时会先下载centos镜像,然后再构建新镜像,时间会比较久,可喝杯茶耐心等待
3)报错问题解决方法
如果yum语句无法执行的话,并且报以下警告:
[Warning] IPv4 forwarding is disabled. Networking will not work.
这个问题是由于IPv4转发被禁用了,导致无法上网,需要将IPv4转发开启
解决方法:
vim /usr/lib/sysctl.d/00-system.conf
添加如下内容
net.ipv4.ip_forward=1
重启network服务
systemctl restart network

4. 构建nginx镜像

1)编写Dockerfile文件

[root@localhost php]# cd ../nginx/

[root@localhost nginx]# vim Dockerfile

内容如下:

FROM centos:7

ENV TIME_ZOME Asia/Shanghai

ARG NV="nginx-1.15.5"

COPY nginx.conf /data/nginx/conf/

ADD $NV.tar.gz /tmp

RUN yum -y install gcc gcc-c++ make openssl-devel pcre-devel zlib-devel \

        && mkdir -p  /var/tmp/nginx/client \

        && groupadd  nginx \

        && useradd   nginx   -g  nginx   -s /sbin/nologin \

        && chown -R nginx   /var/tmp/nginx/client  \

        && mkdir -p /data \

        && cd /tmp/$NV \

        && ./configure --prefix=/data/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_realip_module --with-http_ssl_module --with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fcgi --with-pcre \

        && make -j 2 \

        && make install \

        && echo "${TIME_ZOME}" > /etc/timezone \

        && ln -sf /usr/share/zoneinfo/${TIME_ZOME} /etc/localtime \

        && rm -rf /tmp/nginx* \

        && yum clean all \

        && yum -y remove gcc gcc-c++ make

WORKDIR /data/nginx/

EXPOSE 80

CMD ["./sbin/nginx","-g","daemon off;"]

2)准备好nginx.conf的配置文件

[root@localhost nginx]# vim  nginx.conf

内容如下:

worker_processes  1;

events {

    worker_connections  1024;

}

 

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    server {

       listen       80;

      

server_name  localhost;

       location / {

          root   html;

         index  index.php index.html index.htm;

    }

 

    error_page   500 502 503 504  /50x.html;

     location = /50x.html {

          root   html;

       }

 

 location ~ \.php$ {

            root           html;

            fastcgi_pass   php:9000;

            fastcgi_index  index.php;

            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

            include        fastcgi_params;

        }

 

    }

}

3)上传nginx:1.15.5安装包

4)构建nginx镜像

[root@localhost nginx]# docker build -t nginx:1.15.5 .

5. 下载mysql镜像

建议直接使用mysql官方镜像,我测试过源码编译安装,最后生成的镜像大小3G多,而官方镜像只有400多M,而且源码安装操作步骤比较复杂,所以这里我弃用了源码安装,而选择直接使用官方镜像。

1)下载镜像

[root@localhost nginx]# cd /

[root@localhost /]# docker pull mysql:8.0.12

2)查看已经构建完成的镜像情况

[root@localhost /]# docker images

6. 创建并启动容器

1)创建自定义网络lnmp

[root@localhost /]# docker network create lnmp

2)创建生成mysql、php、nginx容器的脚本

[root@localhost /]# cd dockerfile/

[root@localhost dockerfile]# vim docker_lnmp.sh

docker_lnmp.sh脚本内容如下

#!/bin/bash

function mysql()

{

    docker run --name mysql --restart=always --net lnmp -p 3306:3306 \

    -v /data/mysql/data:/var/lib/mysql \

    -v /data/mysql/conf:/etc/mysql/conf.d \

    -v /data/mysql/logs:/logs \

    -e MYSQL_ROOT_PASSWORD=test123456 \

    -d mysql:8.0.12 --character-set-server=utf8

}

 

function php()

{

    docker run --name php --restart=always --net lnmp \

    -v /data/nginx/html:/data/nginx/html \

    -v /data/php/log:/data/php/var/log \

    -itd php:7.2.11

}

 

function nginx()

{

    docker run --name nginx --restart=always --net lnmp -p 80:80 \

    -v /data/nginx/html:/data/nginx/html \

    -v /data/nginx/logs:/data/nginx/logs \

    -itd nginx:1.15.5

}

$1

注:php和nginx必须都要挂载网站目录

3)启动mysql、php、nginx容器

[root@localhost dockerfile]# sh docker_lnmp.sh mysql

[root@localhost dockerfile]# sh docker_lnmp.sh php

[root@localhost dockerfile]# sh docker_lnmp.sh nginx

4)查看容器是否正常启动

[root@localhost dockerfile]# docker ps

5)修改mysql的密码加密方式为mysql_native_password

[root@localhost dockerfile]# vim /data/mysql/conf/docker_mysql.cnf

内容如下:

[mysqld]

default-authentication-plugin=mysql_native_password

如果不修改加密方式的话,低版本的mysql客户端登陆时会报错

6)重启mysql容器

[root@localhost dockerfile]# docker restart mysql

7.测

1)创建mysql测试账号

[root@localhost dockerfile]# docker exec -it mysql /bin/bash

root@64a8cd55ee93:/# mysql -uroot -ptest123456

mysql>  create database test;

mysql> create user test@php.lnmp identified by '123456';

mysql> grant all privileges on test.* to test@php.lnmp;

mysql> exit

root@64a8cd55ee93:/# exit

注:这里需要对php容器授权访问,使用php.lnmp

2)编写一个测试连接mysql的php文件

[root@localhost dockerfile]# vim /data/nginx/html/index.php

内容如下:

<?php

    echo "Hello PHP<br/>";

    $conn = mysqli_connect("mysql","test","123456");

    if(!$conn){

        echo "连接数据库失败";

    }else{

        echo "连接数据库成功";

    }

    phpinfo();

?>

3)使用浏览器访问:http://192.168.2.2/index.php

8. 制作镜像

1)将mysql容器制作成镜像

[root@localhost /]# docker commit -a "abc" -m "lnmp-mysql" mysql mysql:lnmp.8.0.12

[root@localhost /]# docker images

2)将nginx、mysql和php镜像打个标签

[root@localhost /]# docker tag mysql:lnmp.8.0.12 192.168.2.2:5000/mysql:lnmp.v1

[root@localhost /]# docker tag php:7.2.11 192.168.2.2:5000/php:lnmp.v1

[root@localhost /]# docker tag nginx:1.15.5 192.168.2.2:5000/nginx:lnmp.v1

[root@localhost /]# docker images

3)将镜像打包成tar文件,保存到 /目录下

[root@localhost /]# docker save -o /mysql-lnmp.v1.tar 192.168.2.2:5000/mysql

[root@localhost /]# docker save -o /php-lnmp.v1.tar 192.168.2.2:5000/php

[root@localhost /]# docker save -o /nginx-lnmp.v1.tar 192.168.2.2:5000/nginx

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Dockerfile定制LNMP环境镜像 的相关文章

随机推荐

  • 1.3 CSDN考试C1 奇偶校验

    文章目录 1 为什么数据校验 2 奇偶校验 3 练习题 3 1练习1 3 2练习2 1 为什么数据校验 数据在传输的过程中 会受到各种干扰的影响 如脉冲干扰 随机噪声干扰和人为干扰 等 这会使数据产生差错 为了能够控制 减少甚至消除传输过程
  • Linux下的硬件驱动——USB设备(下)(驱动开发部分)

    http www ibm com developerworks cn linux l usb index2 html Linux下的硬件驱动 USB设备 下 驱动开发部分 赵明 联想软件设计中心嵌入式研发处系统设计工程师 2003年7月 赵
  • python findall函数用法_Python--re模块的findall等用法

    1 正则表达式含义 点可代表一切字符 起转义作用 指代方括号中的任意字符 d 指代数字0 9 D 指代非数字 s 指代一切空格 包括tab制表符 空格 换行等 S 指代非空格 w 指代大小写字母 数字和下划线 W 指代非大小写字母 数字和下
  • 简易登录界面html+css(自学)

    页面展示 代码展示 html代码 图标使用阿里巴巴矢量图标库图标 阿里巴巴矢量图标库地址
  • 视频图像处理课程推荐(持续更新...)

    1 斯坦福大学 课程EE367 CS448I https web stanford edu class ee367 课程内容有 Introduction and fast forward overview of class logistic
  • GPIO的地址和寄存器映射

    1 GPIO详解 1 1 gpio框图 与GPIO相关的寄存器 不涉及复用 简单理解就是电灯 蜂鸣器控制等 与之相关的寄存器一共有7个 GPIOx CRL x A E 端口配置低寄存器 GPIOx CRH x A E 端口配置高寄存器 GP
  • 如何快速启动npm run build 后的dist文件呢?

    1 通过npm run build 打包后会出现如下 tips 提示我们打包完的项目 必须要在http server 下才能运行 2 安装http server 进入 dist 文件夹 然后启动一个http服务即可 或者 你现在已经到apa
  • 使用BFD操作ELF

    使用BFD操作ELF 创建时间 2001 09 21 文章属性 原创 文章来源 http www xfocus org 文章提交 alert7 sztcww at sina com 使用BFD操作ELF 作者 alert7
  • Python计算Arduino声音方向范围和绘制声音位置二维概率分布热图

    声音检测和测距有许多与回声定位 导航和地理定位相关的应用 所有这些都依赖于使用声音延迟准确定位声源的位置 在这项研究中 我们组装了一个设备 该设备可以利用声音到达时间的差异来精确定位声源的位置 它由连接到 Arduino 电路板的三个声音传
  • 1052 卖个萌 (20 分)

    1052 卖个萌 20 分 萌萌哒表情符号通常由 手 眼 口 三个主要部分组成 简单起见 我们假设一个表情符号是按下列格式输出的 左手 左眼 口 右眼 右手 现给出可选用的符号集合 请你按用户的要求输出表情 输入格式 输入首先在前三行顺序对
  • thinkphp S缓存在服务器上可以写入,但是无法读取

    在Linux服务器上S可以正常写入 但无法读取出来 原来是nobody权限问题 发下文件的用户和组都是nobody导致无法读取 S的File class php里面的读取方法调用file get contents时无法读取文件出来
  • Python下ImportError: DLL load failed: 找不到指定的模块

    环境 Anaconda3 Python3 7 scarpy1 5 版本似乎都能对的上 但是在cmd下报错 如下截图 从以上错误来看 应该是lxml包有异常 pip uninstall lxml包 然后 pip install lxml包 完
  • 2012.8.28 阿里巴巴电话面试

    半个小时左右的电话面试 问题不是太难 算法和数据结构是薄弱环节 1 现在主要在做什么研究 做过的项目介绍和在其中担任的职责 2 问语言方向 是否做过相关的工作 3 是否了解linux系统 在系统中都做过什么 用什么编译器 4 数据结构中 栈
  • Android开源项目网址

    1 http p codekk com 2 https github com Trinea android open project tree master
  • 自动控制原理笔记(3)——线性系统的稳定性

    文章目录 前言 线性系统的稳定性 线性系统的稳定性分析 线性系统的稳态误差计算 误差系数 减小稳态误差 前言 汇总版在这篇文章 自动控制原理上课笔记 线性系统的稳定性 线性系统的稳定性分析 线性系统的稳定性仅取决于系统自身的固有特性 而与外
  • (openEuler21.03-x86)yum安装配置nginx解析php—shell脚本

    EulerOS是华为自主研发的服务器操作系统 能够满足客户从传统IT基础设施到云计算服务的需求 EulerOS对ARM64架构提供全栈支持 打造完善的从芯片到应用的一体化生态系统 EulerOS 以Linux稳定系统内核为基础 支持鲲鹏处理
  • resnet18_deploy

    ResNet 18 deploy prototxt name ResNet 18 layer name data type Input top data input param shape dim 10 dim 3 dim 224 dim
  • 详解二分搜索

    https www cnblogs com kyoner p 11080078 html
  • nginx代理普通请求、静态文件、websocket

    一 nginx描述 nginx是一个代理服务器 中间件 二 nginx正向代理 反向代理 三 使用原因 在维护老项目做融合时 需要将项目合并在同一项目中 因为使用了单点登录 融合的框架使用的是iframe 由于嵌入的链接地址不同源 导致if
  • 使用Dockerfile定制LNMP环境镜像

    使用Dockerfile定制LNMP环境镜像 LNMP是继LAMP之后的又一个非常流行的web框架 即Linux Nginx Mysql PHP的网站架构方案 nginx相较于apache更轻量级 尤其是对静态页面的处理更有优势 做运维的朋