使用Dockerfile创建nginx+php镜像,采用分层

news2024/9/21 23:08:56

什么是Dockerfile

Dockerfile是一种能被Docker程序解释的脚本,它是由一条条的命令所组成,每条命令对应Linux下面的一条命令,Docker程序将这些Dockerfile命令翻译成真正的Linux命令

Dockerfile命令

 Dockerfile通常会包含如下命令:
   FROM:用于指定父镜像,如centos:7.6.1810,除了注释行,FROM要放在Dockerfile文件的第一行;
   ADD:用于添加宿主机的文件、目录等资源到镜像中,会自动解压tar.gz格式压缩包,不会自动解压zip压缩包;
   COPY:类似于ADD,也是用于添加宿主机的文件、目录等资源到镜像中,但不会自动解压任何压缩包;
   MAINTAINER:标注镜像的作者信息;
   LABEL:设置镜像的属性标签;
   ENV:用于设置容器的环境变量;
   USER:指定运行操作的用户;
   RUN:执行shell命令,但必须是非交互式的,例如yum/apt install安装服务一定要加上-y;
   VOLUME:用于定义卷,例如将宿主机的某个目录挂载到容器中;
   WORKDIR:用于定义工作目录;
   EXPOSE:声明要把容器的哪些端口映射到宿主机;
   CMD:指定镜像启动为容器时的默认命令或脚本;
   ENTRYPOINT:也可以指定容器启动时的命令或脚本,如果和CMD同时使用,会将CMD的命令当做参数传递给ENTRYPOINT后面的脚本

Docker镜像分层

利用Dockerfile文件来制作镜像时,我们可以采取一步到位的方式,将官方镜像与我们最终的业务镜像一次性整合到一起,也可以采取分层制作镜像的方式,通常我们是推荐使用分层制作

镜像分层的优势

 镜像分层的优势表现为:
 1. 最明显的优势在于实现了资源共享,由于多个镜像可能都是在同一个基础镜像上构建而来,宿主机上只需保留一份基础镜像即可,极大地节省了磁盘空间。同时,内存只需加载一份基础镜像,就能为所有使用该基础镜像的容器提供服务;
 2. 提高了上传和下载的速度,由于采用了分层,基础镜像如果已经存在相同的内容则不会重复进行上传或下载操作,这也为后期镜像的变动需进行的重建提供了极大地便利。

第一步:制作centos基础镜像

规划目录

mkdir /opt/dockerfile/{web/nginx,system/centos} -pv

下载镜像 通过docker官方下载centos镜像 我这里使用的是centos:7.8.2003

docker search centos:7.8.2003
docker pull centos:7.8.2003

在这里插入图片描述

dockerfile+脚本 构建镜像
  1. Dockerfile文件内容如下所示,主要是安装epel源和一些常用命令
 cd /opt/dockerfile/system/centos # cd到目录
 vim Dockerfile # 编辑,如下就是Dockerfile文件内容

在这里插入图片描述
2. 利用Dockerfile生成镜像时需要用到docker build命令,使用-t选项可以设置标签等信息,后期可能会在此基础上修改并生成新的镜像,因此可以将构建镜像的命令写到脚本中

vim centos7.8-build-command.sh # 编写sh脚本

在这里插入图片描述

bash centos7.8-build-command.sh v1 # 执行sh脚本

在这里插入图片描述
3. 验证镜像可用性
等待Dockerfile命令执行完毕,查看镜像时已经生成了指定tag的centos基础镜像
在这里插入图片描述
使用该镜像来启动一个容器,进入容器后,可以看到Dockerfile文件中指定的命令都已经完成了安装
在这里插入图片描述

第二步:制作nginx镜像

1.获取nginx源码包

进入到/opt/dockerfile/web/nginx/目录下 考虑到后期可能还会有其他版本的nginx镜像,因此也可以创建专门nginx版本号的目录,进入目录后通过nginx官网下载

我这里使用的是nginx-1.21.0版本:nginx-1.21.0

cd /opt/dockerfile/web/nginx/
在这里插入图片描述

2.创建Dockerfile文件

[root@lunan nginx-1.21.0]# pwd
/opt/dockerfile/web/nginx/nginx-1.21.0
nginx镜像的Dockerfile文件内容如下图所示:
在这里插入图片描述
nginx镜像Dockerfile命令说明:
(1)FROM部分要指定父镜像为上面新构建好的centos基础镜像;
(2)ADD命令将宿主机上的nginx1.21.0版本源码包解压至容器的指定目录;
(3)RUN命令部分需要先进入到解压目录,再执行编译安装,这里只是演示,就不加很多参数了,只是指定安装目录

3.制作nginx镜像
与centos基础镜像的制作相同,我们可将nginx镜像构建命令写入到脚本中
在这里插入图片描述
4.验证镜像可用性
Dockerfile文件命令执行完毕,查看镜像时,可以看到nginx1.21.0镜像已经构建完成
在这里插入图片描述
根据已制作好的nginx镜像来启动容器,进入容器后可以看到已经在安装目录下生成了nginx程序,并且可以执行,浏览器通过宿主机的端口映射也能访问到nginx的默认主页,说明镜像是可用的
在这里插入图片描述
在这里插入图片描述
5.nginx镜像优化

虽然以上的nginx镜像已经制作完成,但很多默认项都不符合实际生产的需求,如果后期运行的容器较多,一个个地去修改,工程量必然很大,因此还要加以完善

6.配置文件修改内容

宿主机可以提前准备好与镜像相同版本的nginx配置文件,在配置文件中我们可以指定容器运行用户、工作进程数和默认主页面等
在这里插入图片描述
7.创建默认首页

由于配置文件指定了nginx新的默认主页路径,但容器启动后该路径并不存在对应文件,因此可以提前在宿主机创建好

在nginx镜像Dockerfile文件所属目录下创建code/子目录,并创建对应的默认页面,打包后,后面添加到Dockerfile文件中
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.修改Dockerfile文件

根据以上配置文件的修改内容,需要在原有Dockerfile文件的基础上加入创建nginx用户、拷贝nginx配置文件和默认主页
在这里插入图片描述
9. 重新制作nginx镜像

由于Dockerfile中原有的命令并未发生变动,故重新构建nginx镜像时,只是针对新添加的命令做了变动
在这里插入图片描述
10.验证镜像可用性

以重新构建的nginx镜像启动容器,登录后可以看到index.html文件以自动放在了/data/nginx/html目录下,配置文件也变成了宿主机上的指定配置文件,同时nginx用户也创建好,通过手动开启nginx服务,浏览器也能成功访问到指定web主页内容
在这里插入图片描述
在这里插入图片描述
11.继续优化nginx 镜像

启动容器自动开启nginx服务

到上一步结束,一个完整的nginx镜像已基本构成,唯一不足的就是启动容器时需要手动开启nginx服务

12.修改Dockerfile文件

要想做到启动容器时自动开启服务,需要用到Dockerfile文件中的CMD命令,此外,容器要有一个能在tty前端一直执行的进程才能保持自身的运行。nginx镜像在启动容器时,要想保持自身能处于运行状态,可以加上“daemon off;”参数(也可以将参数直接放在配置文件中,只在Dockerfile文件中添加启动nginx服务命令)
在这里插入图片描述
13.重新制作nginx镜像

按照之前的方法重新构建nginx镜像
在这里插入图片描述
14.检测nginx镜像可用性

此时根据已制作的nginx镜像启动容器,进入容器可以看到80端口已经打开,通过浏览器是可以直接访问的,说明启动容器时即自动开启了nginx服务
在这里插入图片描述
在这里插入图片描述

第三步:制作php镜像

制作php镜像同nginx制作镜像

1.获取php源码包

进入到/opt/dockerfile/web目录下 创建php 目录 ,考虑到后期可能还会有其他版本的php镜像,因此也可以创建专门php版本号的目录,进入目录后通过php官网下载

https://www.php.net/releases/ ,我这里用的是7.3.8版本

wget https://www.php.net/distributions/php-7.3.8.tar.gz --no-check-certificate

在这里插入图片描述
2. 创建Dockerfile文件
在这里插入图片描述

3.制作php镜像

与nginx基础镜像的制作相同,我们可将php镜像构建命令写入到脚本中

在这里插入图片描述
在这里插入图片描述
4. 验证镜像可用性
在这里插入图片描述
在这里插入图片描述
记得将 /usr/local/src/php-7.3.8/php.ini-production 复制到 /usr/local/php/etc/php.ini
也可以加一个RUN命令

RUN cd /usr/local/src/php-7.3.8 && cp php.ini-production /usr/local/php/etc/php.ini

5.启动php

docker run -it -p 9000:9000 php7.3.8-base:v1

在这里插入图片描述
至此php镜像搭建完成

第四步:搭建nginx-php互通【web访问php文件】

1.修改Dockerfile文件

在之前基础之上新增了 php 项目目录project 及 php-fpm配置文件www.conf 复制php 的配置文件php.ini

RUN mkdir -p /data/wwwroot/project
COPY index.php /data/wwwroot/project

index.php文件内容

<?php
echo phpinfo();
?>

从容器中复制文件到宿主机目录

docker cp 78a5560a8d3d:/usr/local/php/etc/php-fpm.d/www.conf /opt/dockerfile/web/php/php7.3.8/www.conf

www.conf修改内容为

需要在php-fpm.conf中配置deamonize=no,使php服务在前台运行保证容器不会退出
独立的容器运行,我们需要将listen定义为0.0.0.0:9000或[::]:9000,表示任何IP都可以访问
在这里插入图片描述
在这里插入图片描述

2.重新生成php镜像
在这里插入图片描述
3.运行启动php
在这里插入图片描述
4.修改nginx配置文件

nginx和php用户都是www,设置nginx 的index.php文件,配置nginx中php

fastcgi_pass php738:9000; # php738指的是php容器
fastcgi_param SCRIPT_FILENAME /data/wwwroot/project/$fastcgi_script_name; # /data/wwwroot/project/ 指的是php容器的项目代码
在这里插入图片描述在这里插入图片描述

5.检查镜像是否成功
在这里插入图片描述
6.运行启动nginx

运行nginx镜像

—link php738 : 与php容器互联
在这里插入图片描述

7.访问web http://172.16.185.160/index.php
在这里插入图片描述

至此nginx+php web访问已完成

最后一步: docker 将镜像推送到docker hub上

我这里只是案例

docker tag centos7.8-base:v1 hub账号名/centos7.8-base:v1  # 设置带有标记的图像
docker push hub账号名/centos7.8-base:v1  # 推送到docker hub

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/740031.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【AGC】认证服务HarmonyOS(api9)实现手机号码认证登录

【问题背景】 近期AGC上线了HarmonyOS(api9)平台的SDK&#xff0c;这样api9的设备也能使用认证服务进行快速认证登录了。下面为大家带来如何使用auth SDK&#xff08;api9&#xff09;实现手机号码认证登录。 【开通服务】 1.登录AppGallery Connect&#xff0c;点击“我的项…

lc202306

785. 判断二分图 对于单个连通图&#xff1a;一个dfs判断图中所有节点符合二分。 遍历节点列表>遍历所有连通图。 133. clone graph 994. rotting oranges 力扣 维护一个time表&#xff0c;表示所有orange rot的最快时间。对每一个 t0 就 rot 的 orange dfs&#xff0c;遇…

无法从gcr.io获取distroless镜像问题

当我们能够访问外网&#xff0c;且能够ping通gcr.io网站后&#xff0c;依旧无法拉取distroless镜像时&#xff0c;可以通过以下网站作为中转获取。 rootacoinfo-Vostro-3667:/home/xxx/xx# docker pull gcr.io/distroless/base-debian11 Using default tag: latest Error resp…

快速制作优惠券信息展示小程序教程

要想拥有一个拥有优惠券功能的小程序商城&#xff0c;首先我们需要搭建一个小程序。以乔拓云第三方平台为例&#xff0c;我们可以通过以下步骤来完成。 首先&#xff0c;登录乔拓云平台&#xff0c;进入【乔拓云】后台管理页面。乔拓云功能强大&#xff0c;不仅可以搭建小程序…

运维开发面试题第五期(华电天益)

1、一个目录(没有子目录)有很多文件&#xff0c;想最快速度查看到最近更新的文件你有几种方式实现?请写出一种或几种 ls -lrt 目录 R 逆序 l 长格式 t 按更新时间排序2、使用 tar 命令打包/etc 目录下的所有文件(包括子文件夹) tar -cvf 打包路径加名字 /etc/ 仅打包…

[gtp]购物车案例参考

react hooks,购物车案例. 在列表上点击或者-更新数量,调用接口更新单个价格. 点击table的checkbox勾选后,计算总价? 对于React Hooks和购物车案例&#xff0c;您可以使用useState来管理列表中商品的数量和总价。当点击"“或”-"按钮时&#xff0c;可以更新相应商品…

网络营销的定义、实现方式、关键要素和应用案例

网络营销是通过互联网及相关技术手段来实现企业品牌推广、产品销售、客户维护等目标的营销方式。近年来&#xff0c;随着互联网技术的飞速发展&#xff0c;网络营销已成为企业推广、销售和宣传的重要手段。本文将从网络营销的定义、实现方式、关键要素和应用案例等方面&#xf…

【ECharts系列】ECharts 图表渲染问题解决方案

1 问题描述 echats 渲染&#xff0c;第一次的时候只出现Y轴数值&#xff0c;不出现X轴数值&#xff0c;切换下页面&#xff0c;X轴数值就能出现。 2 原因分析 如果在使用ECharts渲染时&#xff0c;X轴数值只在切换页面后才出现&#xff0c;可能是因为ECharts在初始化时没有正确…

Mac上提取应用APP的LOGO

1、找到想提取LOGO的应用&#xff0c;右键「显示包内容」 2、 双击【Contents】文件夹&#xff0c;再双击【Resources】文件夹 3、双击图标打开&#xff0c;选择最清晰的一帧&#xff0c;右键【导出为】 4、选择保存位置&#xff0c;格式注意选择常见格式&#xff0c;如png

【Ajax】Express 服务端框架

因为Ajax需要向服务端发送请求。Express框架比较简单&#xff0c;内容使用起来比较少&#xff0c;借助一个基本功能就可以了。 Express 基于 Node.js 平台&#xff0c;快速、开放、极简的 Web 开发框架 所以需要安装一下node.js 检查命名&#xff1a;node -v 安装 打开项目最外…

多线程面试题详解

总体概览 线程的基础知识 线程和进程的区别&#xff1f; 并行和并发有什么区别&#xff1f; 创建线程的方式有哪些&#xff1f; runable和callable有什么区别 run()和start()有什么区别 线程包括了那些状态&#xff1f;这些状态之间如何变化 新建T1,T2,T3三个线程&#xff0c;如…

C#内存不够解决方法

今天在使用C#程序的时候&#xff0c;出现了下图的问题&#xff1a; 注意下图中我用红框标出的位置&#xff0c;实际是一个三维数组。 但是出现这个问题和三维数组没有关系。 他是提示内存不足。 百度了一下&#xff0c;C#在生成的过程中如果是生成对应的32位系统&#xff0c…

VMware15.5版本虚拟机安装Linux Centos 7系统详细步骤

1.首先准备好Centos7.6安装文件&#xff0c;安装文件可百度搜索或在阿里镜像站中下载。 阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 2.新建虚拟机. 1选择自定义&#xff0c;点下一步。 2硬件兼容性选择15.x&#xff0c;&#xff0c;点下一步。 3选择稍后安装操作系统&…

自定义seg_decoder组件并创建Nios系统(一)

前面进行了数码管的显示 对Avalon总线协议进行了大概的学习 那么就可以 将数码管译码器模块封装成符合Avalon-MM接口的组件创建一个基于Nios Ⅱ处理器的系统 将数码管译码器组件添加至该系统中 通过用户应用程序控制数码管显示字符0~F 本文同数码管显示一样并不是完整项目&a…

JavaWeb_瑞吉外卖_项目优化Day12-前后端分离

JavaWeb_瑞吉外卖_项目优化Day12-前后端分离 前后端分离开发介绍开发流程前端技术栈 YapiSwagger介绍使用方式常用注解 项目部署部署架构部署环境说明部署前端项目部署后端项目 来源 前后端分离开发 介绍 开发流程 前端技术栈 开发工具 Visual Studio Codehbuilder 技术框架 …

【全栈开发指南】VUE前端路由设计及配置

我们在使用Vue.js时&#xff0c;创建单页面应用一定会用到路由&#xff0c;Vue Router 是 Vue.js 官方的路由管理器&#xff0c;我们在开发框架中过程中&#xff0c;需要结合Vue Router路由管理器提供的功能&#xff0c;设计和实现系统中菜单的配置。 一、实现原理 一级菜单r…

idea创建webapp文件夹

结果的图片&#xff1a; 第一步&#xff1a; file-》project structure 第二步&#xff1a; 修改路径&#xff0c;点击右侧“Deloyment descriptors”下面的笔进行修改。 // 增加了src\main // web修改为了webapp C:\Users\www12\Desktop\huwantiku2\src\main\webapp\WEB-IN…

计算机图形学 3D 渲染 笔记(二)

一、阴影 判断一个点是否被遮住&#xff0c;可以从该点像光源方向发射射线&#xff08;P tL&#xff09;&#xff0c;若射线被与物体发生相交&#xff0c;则说明它在阴影中。而这个物体由于要在 P 和 光源之间&#xff0c;在方向光场景下&#xff0c; t 的取值范围是 0 < …

vue3+vite+Ts 基于Antv/x6 绘制流程图

需求效果&#xff1a; 需求&#xff1a; 实现一个流程图&#xff0c;双击可对相应的组件进行一些功能操作&#xff1b; 工具栈&#xff1a; 这里使用antv/x6&#xff0c; 基于vue3vitets进行开发 官网地址&#xff1a; https://x6.antv.antgroup.com/examples/showcase/pra…

港联证券|dmi指标的用法和实战技巧?

DMI指标是一种技术分析工具&#xff0c;可用于评估股票、期货和外汇市场的趋势强度。DMI指标由三条线组成&#xff0c;分别是DI&#xff08;上升方向指标&#xff09;、-DI&#xff08;下降方向指标&#xff09;和ADX&#xff08;平均趋向指数&#xff09;。在使用DMI指标之前&…