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

这篇具有很好参考价值的文章主要介绍了使用Dockerfile创建nginx+php镜像,采用分层。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是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

php dockerfile,Docker,nginx,php,运维

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

php dockerfile,Docker,nginx,php,运维
2. 利用Dockerfile生成镜像时需要用到docker build命令,使用-t选项可以设置标签等信息,后期可能会在此基础上修改并生成新的镜像,因此可以将构建镜像的命令写到脚本中

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

php dockerfile,Docker,nginx,php,运维

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

php dockerfile,Docker,nginx,php,运维
3. 验证镜像可用性
等待Dockerfile命令执行完毕,查看镜像时已经生成了指定tag的centos基础镜像
php dockerfile,Docker,nginx,php,运维
使用该镜像来启动一个容器,进入容器后,可以看到Dockerfile文件中指定的命令都已经完成了安装
php dockerfile,Docker,nginx,php,运维

第二步:制作nginx镜像

1.获取nginx源码包

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

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

cd /opt/dockerfile/web/nginx/
php dockerfile,Docker,nginx,php,运维

2.创建Dockerfile文件

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

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

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

6.配置文件修改内容

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

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

在nginx镜像Dockerfile文件所属目录下创建code/子目录,并创建对应的默认页面,打包后,后面添加到Dockerfile文件中
php dockerfile,Docker,nginx,php,运维
php dockerfile,Docker,nginx,php,运维
php dockerfile,Docker,nginx,php,运维

8.修改Dockerfile文件

根据以上配置文件的修改内容,需要在原有Dockerfile文件的基础上加入创建nginx用户、拷贝nginx配置文件和默认主页
php dockerfile,Docker,nginx,php,运维
9. 重新制作nginx镜像

由于Dockerfile中原有的命令并未发生变动,故重新构建nginx镜像时,只是针对新添加的命令做了变动
php dockerfile,Docker,nginx,php,运维
10.验证镜像可用性

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

启动容器自动开启nginx服务

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

12.修改Dockerfile文件

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

按照之前的方法重新构建nginx镜像
php dockerfile,Docker,nginx,php,运维
14.检测nginx镜像可用性

此时根据已制作的nginx镜像启动容器,进入容器可以看到80端口已经打开,通过浏览器是可以直接访问的,说明启动容器时即自动开启了nginx服务
php dockerfile,Docker,nginx,php,运维
php dockerfile,Docker,nginx,php,运维

第三步:制作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

php dockerfile,Docker,nginx,php,运维
2. 创建Dockerfile文件
php dockerfile,Docker,nginx,php,运维

3.制作php镜像

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

php dockerfile,Docker,nginx,php,运维
php dockerfile,Docker,nginx,php,运维
4. 验证镜像可用性
php dockerfile,Docker,nginx,php,运维
php dockerfile,Docker,nginx,php,运维
记得将 /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 dockerfile,Docker,nginx,php,运维
至此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都可以访问
php dockerfile,Docker,nginx,php,运维
php dockerfile,Docker,nginx,php,运维

2.重新生成php镜像
php dockerfile,Docker,nginx,php,运维
3.运行启动php
php dockerfile,Docker,nginx,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容器的项目代码
php dockerfile,Docker,nginx,php,运维php dockerfile,Docker,nginx,php,运维

5.检查镜像是否成功
php dockerfile,Docker,nginx,php,运维
6.运行启动nginx

运行nginx镜像

—link php738 : 与php容器互联
php dockerfile,Docker,nginx,php,运维

7.访问web http://172.16.185.160/index.php
php dockerfile,Docker,nginx,php,运维

至此nginx+php web访问已完成

第五步:phpr容器启动时,自动运行php-fpm

最终的php容器 => dockerfile , 主要是调整了 php-fpm.conf文件 使用前台运行,设置 daemonize = no
php dockerfile,Docker,nginx,php,运维

防止php容器断掉,加了一个 --restart=always 始终重启

docker run  --name php738  --restart=always  -d php7.3.8-base:v1

php dockerfile,Docker,nginx,php,运维

在这里最终贴一下 nginx容器 dockerfile文件
php dockerfile,Docker,nginx,php,运维

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

我这里只是案例

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

php dockerfile,Docker,nginx,php,运维文章来源地址https://www.toymoban.com/news/detail-769749.html

到了这里,关于使用Dockerfile创建nginx+php镜像,采用分层的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot项目 使用Dockerfile创建镜像与容器

    这里我使用的是云服务器,Centos7-Linux操作系统 需要以下环境支持 1、maven环境 2、java环境 3、springboot项目 maven环境 可以去我这个博客了解\\\'\\\'配置MAVEN环境-CSDN博客\\\'\\\' java环境 可以去\\\'\\\' java环境变量配置-CSDN博客\\\'\\\' springboot项目 先来简单创建一个springboot项目 一、进入IDEA的终端 使用

    2024年03月28日
    浏览(44)
  • Docker:使用dockerFile创建镜像(war包和jar包)

    1、使用war包打镜像 (1)在war的当前路径下,新建一个文件——Dockerfile (2)编辑Dockerfile文件    vim Dockerfile Dockerfile文件内容: FROM java:8                # 选择项目中要求的版本 MAINTAINER ylb             # 作者 WORKDIR /穿件文件夹的路径    # 选择项目中要求的

    2024年02月15日
    浏览(45)
  • 案例:Docker 镜像的创建及使用(commit与dockerfile方式)

    我要将一个包含nginx的容器做成一个镜像,供其他人使用,这样其他人就不必再执行nginx安装等操作。 首先,还是启动一个容器: 命名为n1。 然后在容器内部安装nginx: 这里yum源出现问题: 解决看这里 安装成功并启动运行: 在另一个终端,查看nginx情况: 然后看到 ip是 17

    2024年02月14日
    浏览(34)
  • 【云原生】Docker镜像的创建 Dockerfile 多阶段构建原理和使用场景

    创建镜像有三种方法,分别为【基于已有镜像创建】、【基于本地模板创建】以及【基于Dockerfile创建】。 (1)首先启动一个镜像,在容器里做修改  docker run -it --name web centos:7 /bin/bash     #启动容器  ​  yum install -y epel-release  #安装epel源  yum install -y nginx         #安装ng

    2024年02月12日
    浏览(54)
  • 【Docker】初识 Docker,Docker 基本命令的使用,Dockerfile 自定义镜像的创建

    在部署大型项目时,常常面临多组件、复杂的依赖关系和不同环境之间的差异,这些因素可能导致以下问题: 复杂的依赖关系: 由于项目组件众多,各个组件之间的依赖关系变得复杂,容易出现版本不匹配或兼容性问题。 兼容性问题: 项目在不同的环境中可能会遇到兼容性

    2024年02月05日
    浏览(60)
  • dockerfile 构建nginx镜像

    http://ip:80

    2024年01月20日
    浏览(50)
  • Dockerfile制作Nginx应用镜像

    创建Dockerfile 创建镜像 上传镜像-harbor 修改hosts文件 修改daemon.json 重启DOCKER 登录并上传 测试镜像

    2024年02月12日
    浏览(39)
  • Docker在windows下使用教程,通过Dockerfile创建镜像/容器,以YOLO系列为例

     通过可视化界面将极大的降低学习难度。  1.1、Docker Desktop下载  下载地址:Docker Desktop: The #1 Containerization Tool for Developers | Docker 应当是这个界面,选择下载即可 1.2、下载完成后需打开window自带的虚拟机       将Hyper-V勾选即打开,勾选后需重启。  1.3、下载WSL,由于是在

    2024年02月05日
    浏览(65)
  • 基于Dockerfile创建镜像

    创建镜像有三种方法: 1.基于已有镜像创建、 2.基于本地模板创建 3.基于Dockerfile创建。 首先启动一个镜像,在容器里做修改  然后将修改后的容器提交为新的镜像,需要使用该容器的 ID 号创建新镜像 联合文件系统(UnionFS) 镜像加载原理 为什么Docker里的centos的大小才200M

    2024年02月08日
    浏览(39)
  • Dockerfile创建镜像

    创建镜像有三种方法,分别为【基于已有镜像创建】、【基于本地模板创建】以及【基于Dockerfile创建】。 通过导入操作系统模板文件可以生成镜像,模板可以从OPENVZ 开源项目下载,下载地址为:openvz.org/ Download/template/precreated 1.3.1 联合文件系统(UnionFS ) UnionFS(联合文件系统

    2024年02月11日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包