dockerfile创建lnmp镜像

2023-11-11

目录

 

一、创建lnmp的相关镜像

1.1、dockerfile创建php7.2.16镜像

1. 2、dockerfile创建nginx-1.15.7镜像

1.3、mysql镜像是直接在docker仓库上pull

二、通过dockerpose-compose运行lnmp环境

 2.1、安装docker-compose

 2.2、用docker-compose运行lnmp环境并挂载docker容器数据目录到本地目录

 2.3、用docker-compose运行并管理lnmp环境

dockerfile的lnmp环境大功告成!



       现在说虚拟化技术的话,docker是最火的技术之一了,在生产环境中,越来越多业务需求用到docker去部署环境了!这篇文章讲的就是怎样用dockerfile去创建lnmp的各部件的镜像,docker-compose运行lnmp的环境!

      注意:搞docker的环境时,切记把selinux关了,否则docker很多服务会起不来,比较挂载docker内部的目录到宿主主机时,由于selinux是开启了,就会导致docker的状态是Restarting。所以一般都是把selinux给关了,用以下命令

sed  -i "s/^SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config 
或sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config

 

一、创建lnmp的相关镜像

  • 1.1、dockerfile创建php7.2.16镜像

FROM centos:latest
MAINTAINER https://blog.csdn.net/lituxiu
ENV TIME_ZOME Asia/Shanghai
ARG WJ="php-7.2.16"
# wget https://www.php.net/distributions/php-7.2.16.tar.gz

ADD $WJ.tar.gz /tmp
RUN yum -y install gcc gcc-c++ make gd-devel libxml2-devel libcurl-devel libjpeg-devel libpng-devel openssl-devel bison \
    && mkdir -p /usr/php/etc \
    && cd /tmp/$WJ \
    && ./configure --prefix=/usr/php \
        --with-config-file-path=/usr/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 \
    && make -j 4 \   
    && make install \
    && cp /usr/php/etc/php-fpm.conf.default /usr/php/etc/php-fpm.conf \
    && cp /usr/php/etc/php-fpm.d/www.conf.default /usr/php/etc/php-fpm.d/www.conf \
    && sed -i '/;daemonize/a\daemonize = no' /usr/php/etc/php-fpm.conf \
    && sed -i 's/127.0.0.1/0.0.0.0/g' /usr/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 /usr/php/
EXPOSE 9000
CMD ["sbin/php-fpm","-c","etc/php-fpm.conf"]

文件结构:

[root@dingzhi ~]# tree php7.2.16/
php7.2.16/
├── dockerfile
└── php-7.2.16.tar.gz

创建php镜像php7.2.16:latest

[root@dingzhi ~]# cd php7.2.16/
[root@dingzhi php7.2.16]# docker build -t php7.2.16:latest ./

(注意: docker build创建镜像时,注意文件路径的上下文,一般是在dockerfile的 ./ 当前目录里创建)

说明:

#      cp /tmp/php-7.2.16/php.ini-production /usr/php/etc/php.ini \ 普通源码安装时的php.ini是要复制php.ini-production改名的,这里只安装好php的模块,只修改php-fpm配置文件,启动php-fpm服务。

    make -j 4 是指定4个并行运行的任务数,即4个编译的任务程序同时运行,提高速度(注意cpu瓶颈,如果提供了多个-j,最后一个才是有效的)。

#    echo "${TIME_ZOME}" > /etc/timezone 和 ln -sf /usr/share/zoneinfo/${TIME_ZOME} /etc/localtime是修改时区为shanghai。

  daemonize = no 是php-fpm服务在前台启动,因为要后台启动容器的话,必须起的容器服务是前台运行,否则启动容器后就会莫名其妙自动退出。

 

  • 1. 2、dockerfile创建nginx-1.15.7镜像

FROM centos:latest
MAINTAINER https://blog.csdn.net/lituxiu
ENV TIME_ZOME Asia/Shanghai
ARG WJ="nginx-1.15.7"
#wget http://nginx.org/download/nginx-1.15.7.tar.gz

#COPY nginx.conf /usr/local/nginx/
ADD $WJ.tar.gz /tmp
RUN yum -y install gcc gcc-c++ make openssl-devel pcre-devel zlib-devel \
        && mkdir -p /usr/local/nginx \
        && cd /tmp/$WJ \
        && ./configure --prefix=/usr/local/nginx  --with-stream --with-http_ssl_module \
        && make -j 4 \
        && 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 \
        && ln -s /usr/local/nginx/sbin/nginx /usr/sbin/nginx

WORKDIR /usr/local/nginx/
EXPOSE 80
CMD ["nginx","-g","daemon off;"]

文件结构:

[root@dingzhi ~]# tree nginx1.15.7/
nginx1.15.7/
├── dockerfile
└── nginx-1.15.7.tar.gz

创建nginx镜像nginx1.15,7:latest

[root@dingzhi ~]# cd nginx1.15.7/
[root@dingzhi nginx1.15.7]# docker build -t nginx1.15.7:latest ./

说明:

#   daemon off表示nginx服务前台启动

#   COPY nginx.conf /usr/local/nginx/这行在nginx的dockerfile里我是注释掉的,用默认的。如果想要用自己修改的nginx.conf,只要把修改好的nginx.conf与dockerfile同一目录路径,COPY那行去注释。

#  注意: nginx.conf的location ~ \.php$配置的这一块要修改下。

 location ~ \.php$ {
            root           html;
            fastcgi_pass   php:9000;   #php容器名称和端口号
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;  #使用root指定的路径
            include        fastcgi_params;

注意!注意!注意!

        重要的事情要说三遍:这里的nginx连接php-fpm时,在php容器里运行php-fpm的用户为nobody。可能有某些生产环境要求权限较高时,有可能存在nginx容器连接php容器的php-fpm服务实现不了功能的情况,不过简单显示连接mysql数据库是没问题的。

扩展:

        nobody就是一个普通账户,因为默认登录shell是 '/sbin/nologin',所以这个用户是无法直接登录系统的,也就是黑客很难通过漏洞连接到你的服务器来做破坏。此外这个用户的权限也给配置的很低。因此有比较高的安全性。一切都只给最低权限。这就是nobody存在的意义。

  • 1.3、mysql镜像是直接在docker仓库上pull

命令为:

docker pull mysql:5.7
[root@dingzhi ~]# docker pull mysql:5.7
Trying to pull repository docker.io/library/mysql ... 
5.7: Pulling from docker.io/library/mysql
27833a3ba0a5: Pull complete 
864c283b3c4b: Pull complete 
cea281b2278b: Pull complete 
8f856c14f5af: Pull complete 
9c4f38c23b6f: Pull complete 
1b810e1751b3: Pull complete 
5479aaef3d30: Pull complete 
1d924ec3d520: Pull complete 
1ab7ae63ac60: Pull complete 
08aa5f3680e9: Pull complete 
a832d0a0972a: Pull complete 
Digest: sha256:dba5fed182e64064b688ccd22b2f9cad4ee88608c82f8cff21e17bab8da72b81
Status: Downloaded newer image for docker.io/mysql:5.7

建议直接使用docker官方mysql镜像,通过dockerfile源码编译安装mysql镜像,最后生成的镜像大小超1G,docker官方mysql5.7镜像才400M不到。

二、通过dockerpose-compose运行lnmp环境

  •  2.1、安装docker-compose

先到Docker-compose官网下载

下载最新版本docker-compose

sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

[root@dingzhi ~]# chmod +x /usr/local/bin/docker-compose
[root@dingzhi ~]# docker-compose -v
docker-compose version 1.24.0, build 0aa59064

说明:

# 添加x执行权限后,docker-compose执行失败,一般是环境变量路径,请执行以下命令ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

# 如果想删除docker-compose的话,直接在rm -rf /usr/local/bin/docker-compose

# Docker-compose -v  #查看docker-compose版本

# Docker-compose操作容器的命令是基于存放docker-compose.yml文件的目录里输出的,否则,就会以下错误!!!

  •  2.2、用docker-compose运行lnmp环境并挂载docker容器数据目录到本地目录

查看php、nginx和mysql容器id

[root@dingzhi ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx1.15.7         latest              4b05c87dcbec        3 hours ago         302 MB
php7.2.16           latest              3428fd528787        4 hours ago         627 MB
docker.io/mysql     5.7                 98455b9624a9        2 weeks ago         372 MB
docker.io/centos    latest              9f38484d220f        4 weeks ago         202 MB

编辑docker-compose.yml

version: '2'
services:
  nginx:
    image: 4b05c87dcbec
    container_name: 'nginx'
    restart: 'always'
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - "/data/nginx/html:/usr/local/nginx/html"
      - "/data/nginx/logs/:/usr/local/nginx/logs/"
      - "/data/nginx/conf/:/usr/local/nginx/conf/"
    networks:
      dangjian:
        ipv4_address: 172.19.0.2

  php:
    image: 3428fd528787 
    container_name: 'php'
    restart: 'always'
    ports:
      - "9000:9000"
    volumes:
      - "/data/nginx/html:/usr/local/nginx/html"
    networks:
      dangjian:
        ipv4_address: 172.19.0.3


  mysql:
    image: 98455b9624a9
    container_name: 'mysql'
    restart: 'always'
    ports:
      - "3306:3306"
    volumes:
      - "/data/mysql/data/:/var/lib/mysql/"
      - "/data/mysql/conf/:/etc/mysql/conf.d/"

    environment:
      MYSQL_ROOT_PASSWORD: 123456
    networks:
      dangjian:
        ipv4_address: 172.19.0.4

networks:
   dangjian:
      ipam:   #切记这里的“ipam:”改动就报错
         config:
         - subnet: 172.19.0.0/16
           gateway: 172.19.0.1

创建本地挂载的目录

nginx目录

mkdir -p /data/nginx/{conf,html,logs}

mysql目录

mkdir -p /data/mysql/{conf,data}

由于mysql容器的/etc/mysql/my.cnf里的配置内容为:(注意感叹号

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

#注意!includedir /etc/mysql/conf.d/包含/etc/mysql/conf.d/目录下的*.cnf配置内容

#实现验证为# cat /data/mysql/conf/my.cnf 
[mysqld]
skip-grant-tables
启动mysql容器可以实现在mysql容器内直接用mysql命令登录数据库

#注意  !includedir /etc/mysql/conf.d/包含/etc/mysql/conf.d/目录下的*.cnf配置内容

#注意 本地的/data/nginx/conf/里要有nginx.conf文件,要不启动nginx容器会报错

  •  2.3、用docker-compose运行并管理lnmp环境

docker-compose命令必须在存在docker-compose.yml目录下输入

启动lnmp
~]# docker-compose up -d

常用的docker-compose命令

docker-compose up -d           #后台docker-compose.yml所有容器
docker-compose down            #关闭docker-compose.yml所有容器
docker-compose ps              #查看所有容器的状态
docker-compose restart 容器名   #重启启动某个容器

更多的docker-compose命令的话,请查看docker-compose -h

验证

[root@dingzhi ~]# vi /data/nginx/html/test.php
<?php
    echo "Hello lituxiu<br/>";
    echo "Hello PHP<br/>";
    $conn = mysqli_connect("mysql","test","123456");
    if(!$conn){
        echo "连接数据库失败";
    }else{
        echo "连接数据库成功";
    }
    phpinfo();
?>

浏览器访问:http://192.168.21.140/test.php

dockerfile的lnmp环境大功告成!

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

dockerfile创建lnmp镜像 的相关文章

随机推荐

  • 如何提高烟雾、火的检测准确率?!

    我最近在做一个烟雾和火的检测实验 有时候效果不太好 不知道如何提高效果 我用的是YOLO V3训练的模型
  • [js] 去除小数点后面多余的零

    var a 0 100 parseFloat a a 0 1
  • Android studio Gradle 7.0+ 版本的.aar引入方式说明

    新建的Androidi项目编译错误 莫名其妙的错误 踩坑了 记录一下 各位大神指正 1 buildg radle中引入 aar错误 android repositories flatDir 引入libs目录下的aar dirs libs A
  • linux命令打印消息自动保存,Linux基本命令(2)

    1 如果在任何命令的后面加上一个 gt 和文件名 不一定事先存在 那么这个命令的执行结果就被送至该文件中 如 ls usr bin gt unknown 如果该文件已经存在 则ls命令的输出结果将会覆盖原来的文件内容 如果用csh和tcsh
  • Python time strftime() 方法

    描述 Python time strftime 函数用于格式化时间 返回以可读字符串表示的当地时间 格式由参数 format 决定 语法 strftime 方法语法 time strftime format t 参数 format 格式字符
  • SpringBoot项目配置跨域报错When allowCredentials is true, allowedOrigins cannot contain the special value

    项目配置允许跨域访问后 报When allowCredentials is true allowedOrigins cannot contain the special value错误 解决办法找到配置允许跨域访问配置的地方 找到如下配置
  • 二叉搜索树 BST

    文章目录 一 判断 BST 的合法性 Q98 迭代写法见提交记录 使用stack 二 在 BST 中搜索一个数 Q700 三 在 BST 中插入一个数 Q701 四 在 BST 中删除一个数 Q450 最后总结 原文 https mp we
  • A优秀的springcloud项目部署及代码。

    在线演示地址 http 114 115 178 160 8082 index 演示服务器内存宽带比较小 可能导致演示系统比较卡 第一次加载可能要20秒 为防止人为恶意删除我演示系统数据库演示系统将禁止修改数据库 敬请谅解 在这个社会上总有一
  • 【Java】jdk5.0、jdk7、jdk8、jdk11、jdk17新特性

    文章目录 前言 一 jdk5 0新特性 二 jdk7新特性 三 jdk8新特性 四 jdk11新特性 五 jdk17新特性 前言 了解jdk新特性 一 jdk5 0新特性 泛型 允许类型或方法对各种类型的对象进行操作 同时提供编译时类型安全
  • 华为OD机试-高性能AI处理器-2022Q4 A卷-Py/Java/JS

    某公司研发了一款高性能AI处理器 每台物理设备具备8颗AI处理器 编号分别为0 1 2 3 4 5 6 7 编号0 3的处理器处于同一个链路中 编号4 7的处理器处于另外一个链路中 不同链路中的处理器不能通信 现给定服务器可用的处理器编号数
  • Opencascade之STL可视化与选取渲染风格

    在Opencascade中 STL模型可以的可视化有两种方式 一 STL模型加载为Shape对象 再可视化 1 1 STL模型加载为Shape对象 TopoDS Shape aShape try StlAPI Reader reader r
  • LeetCode两个数组的交集

    两个数组的交集 给定两个数组 nums1 和 nums2 返回 它们的交集 输出结果中的每个元素一定是 唯一 的 我们可以 不考虑输出结果的顺序 输入 nums1 1 2 2 1 nums2 2 2 输出 2 输入 nums1 4 9 5
  • Maven —— Plugin execution not covered by lifecycle configuration 错误

    转载自 https blog csdn net lmxmimihuhu article details 34436205 一 错误描述 Eclipse 导入已存在的Maven 后 pom xml 文件的execution 节点报错 错误位置
  • 网络安全的方向好就业吗

    一些网络安全专业方向的同学难免会有疑问 这个方向好就业吗 我能做些什么呢 今天就业老师就给大家解答一下相关的问题 网络安全是目前为止比较容易就业的一个方向 现今我国是被黑客攻击 信息丢失最严重的的国家之一 因此在市场需求和政策引导的共同推动
  • 微信小程序-0.11.122100版本更新问题

    官方更新了122100版本 一共有90几处改动 这里先不一一列举了 一 redirectTo和navigateTo不能再跳转到带有tab选项卡的页面 小程序新增了一个接口wx switchTab 这个接口是专门用来跳转到带有tabbar的页
  • 1.平台介绍:FISCO BCOS 区块链

    引言 区块链技术作为一种分布式 安全可信的数据记录和交互方式 正逐渐在各行各业展现出巨大潜力 然而 公共区块链的隐私性和性能限制使得企业更倾向于采用联盟链或私有链解决方案 FISCO BCOS Blockchain Open Consort
  • wildfly(JBOSS)启动报错

    报错内容 15 07 50 724 ERROR org jboss as controller management operation Controller Boot Thread WFLYCTL0013 Operation add fa
  • Delphi 判断fast report 是否存在未定义对象

    Assigned fastreport 对象 Boolean 返回 sql Fields i FieldName 获取列名 sql select from table tmp ADOQuery DLLMan Exe server Query
  • ansys选择一个面上所有节点_ANSYS选中无序关键点、节点并得到其编号

    看样子选中无序关键点 节点并得到其编号不可能的 在ANSYS中 有时我们需要采用APDL命令流选中一堆无序的关键点或节点 也就是这堆关键点或节点的编号完全是任意不连续的 因此无法采用根据编号来选中这堆无序的关键点或节点 而且假如最不利情况下
  • dockerfile创建lnmp镜像

    目录 一 创建lnmp的相关镜像 1 1 dockerfile创建php7 2 16镜像 1 2 dockerfile创建nginx 1 15 7镜像 1 3 mysql镜像是直接在docker仓库上pull 二 通过dockerpose