怎么使用dockerfile构建nginx镜像

发布时间 - 2023-05-14 00:00:00    点击率:

dockerfile介绍

docker通过读取dockerfile里面的内容可以自动build image,dockerfile是一个包含了build过程中需要执行的所有命令的文本文件。也可以理解为dockfile是一种被docker程序解释的脚本,由一条一条的指令组成,每条指令对应linux系统下面的一条命令,由docker程序将这些dockerfile指令翻译成真正的linux命令。dockerfile有自己书写格式和支持的命令,docker程序解决这些命令间的依赖关系,类似于makefile。

docker程序将读取dockerfile,根据指令生成定制的image。相比image这种黑盒子,dockerfile这种显而易见的脚本更容易被使用者接受,它明确的表明image是怎么产生的。有了dockerfile,当我们需要定制自己额外的需求时,只需在dockerfile上添加或者修改指令,重新生成image即可,省去了敲命令的麻烦。

docker构建镜像的方法: commit、dockerfile

  1、使用commit来构建镜像:

    commit是基于原有镜像基础上构建的镜像,使用此方法构建镜像的目的:保存镜像里的一些配置信息和修改的信息。相当于一个镜像的快照。

  2、使用dockerfile来构建镜像:

    dockerfile是快速构建所需(自定义)镜像。

dockerfile的指令:

  from:指定基础镜像(from是必备的指令,并且必须为第一条指令)。

  run: 用来执行命令行命令。其基本格式:

      shell格式: run ,输入在bash环境中的命令即可,一个dockerfile允许使用run不得超过127层,所以,使用一次run, 使用 ‘ \' 换行,使用‘ && '执行下一条命令。一般使用此种格式;

      exec格式: run ,此种方式像是函数调用中的格式;

  copy: 复制文件。 其基本格式:

      格式1:copy ...

      格式2:copy [“”,.....""]

  add: 更高级的复制文件,在copy的基础上增加了一些功能,如果复制的是压缩包的话,会直接解压,而不需要在使用run解压;

  cmd:容器启动命令。其基本格式:

      shell格式: cmd

      exec格式: cmd ["可执行文件", "参数1", "参数2"...]

      参数列表格式: cmd [“参数1”, “参数2”...],在指定了entrypoint指令后,用cmd指定具体的参数

  entrypoint: 入口点。其基本格式分为exec和shell,

      entrypoint的目的和cmd一样,都是在指定容器启动程序及参数。entrypoint在运行中可以替代,不过比cmd繁琐,需要通过docker run 的参数--entrypoint 来指定。当指定了entrypoint后,cmd的含义就发生了改变,不在是直接运行其命令,而是将cmd的内容作为参数传递给entrypoint指令。其执行时就变成了: ""

  env: 设置环境变量。(都可以使用这里使用的变量)其基本格式:

      格式1:env

      格式2:env ==...

  arg: 构建参数。构建参数和env的效果一样,都是设置环境变量,所不同的是arg所构建的环境变量在将来容器运行时是不存在的。其基本格式:

      格式1: arg [=]

      格式2: 该默认值可以在构建命令 docker build 中用 --build-arg = 来覆盖

  volume: 定义匿名卷。 其基本格式:

      格式1: volume ["", ""...]

      格式2: volume

  expose: 暴露端口。expose指令是声明运行时容器所提供的端口,在启动容器时不会在因为这个声明而开启端口。 其基本格式:

      格式1: expose [...]

  workdir: 指定工作目录。其基本格式:

      格式1: workdir

  user: 指定当前用户。user是帮助你切换到指定用户。 其基本格式:

      格式1: user

  healtcheck: 健康检查,判断容器的状态是否正常。 其基本格式:

      格式1: healtcheck [选项] cmd :设置检查容器健康状况的命令

      格式2: healtcheck none: 如果基础镜像有健康检查指令,使用此格式可以屏蔽掉其健康检查指令

构建nginx镜像:

创建一个目录,在该目录里编写dockerfile:

[root@docker ~]# mkdir mynginx
[root@docker ~]# cd mynginx/
[root@docker mynginx]# pwd
/root/mynginx
[root@docker mynginx]#

下载nginx源码包到创建的目录下(mynginx目录下):

[root@docker ~]# wget -p /root/mynginx/ http://nginx.org/download/nginx-1.15.2.tar.gz

编写dockerfile:

[root@docker mynginx]# vi dockerfile

其内容如下:

from centos
run ping -c 1 www.baidu.com
run yum -y install gcc make pcre-devel zlib-devel tar zlib
add nginx-1.15.2.tar.gz /usr/src/
run cd /usr/src/nginx-1.15.2 \
  && mkdir /usr/local/nginx \
  && ./configure --prefix=/usr/local/nginx && make && make install \
  && ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ \
  && nginx
run rm -rf /usr/src/nginx-1.15.2
expose 80

运行docker命令构建镜像:

[root@docker mynginx]# docker build -t nginx:v3 .
sending build context to docker daemon 1.029mb
step 1/7 : from centos
 ---> 5182e96772bf
step 2/7 : run ping -c 1 www.baidu.com
 ---> using cache
 ---> 2f70f8abaf2a
step 3/7 : run yum -y install gcc make pcre-devel zlib-devel tar zlib
 ---> using cache
 ---> dbdda4b7ae6f
step 4/7 : add nginx-1.15.2.tar.gz /usr/src/
 ---> using cache
 ---> 18ace6285668
step 5/7 : run cd /usr/src/nginx-1.15.2   && mkdir /usr/local/nginx   && ./configure --prefix=/usr/local/nginx && make && make install   && ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/   && nginx
 ---> using cache
 ---> 99629488ede9
step 6/7 : run rm -rf /usr/src/nginx-1.15.2
 ---> using cache
 ---> 869fbad71879
step 7/7 : expose 80
 ---> using cache
 ---> 384bed72ea6f
successfully built 384bed72ea6f
successfully tagged nginx:v3

输出两个successfully即为构建成功!

启动自定义镜像:

使用 docker images 查看构建的镜像:

启动自定义的镜像:

[root@docker ~]# docker run -dit -p 80:80 --name nginx nginx:v3
ecaafe1190447878b98dfb0198e92439db60ff7dab57a1674e0e9e7282a9c858
[root@docker ~]# docker ps -a
container id    image        command       created       status       ports        names
ecaafe119044    nginx:v3      "/bin/bash"     3 seconds ago    up 2 seconds    0.0.0.0:80->80/tcp  nginx

注:这时,你无论怎么启动这个容器,它还是一直处于exited状态。

经过各种解决,最终,终于知道问题出在了哪。 原来容器启动时,它是在后台对应着一个线程启动的,它在启动时是已经启动了,但它执行完命令后,就退出了,并没有在后台运行着,所以使用 -dit 参数让它在后台运行即可。

[root@docker ~]# docker run -dit -p 80:80 --name nginx nginx:v3
ecaafe1190447878b98dfb0198e92439db60ff7dab57a1674e0e9e7282a9c858
[root@docker ~]# docker ps -a
container id    image        command       created       status       ports        names
ecaafe119044    nginx:v3      "/bin/bash"     3 seconds ago    up 2 seconds    0.0.0.0:80->80/tcp  nginx

然而.......

此时又出现了问题,它虽然起来了,但nginx的web网页界面访问不了,显示拒绝连接!!!!

[root@docker ~]# curl 192.168.100.22
curl: (7) failed connect to 192.168.100.22:80; 拒绝连接
[root@docker ~]# elinks --dump 192.168.100.22
elinks: 拒绝连接

然后,又经过问百度,fq看谷歌,终于找到了问题的所在。原来只要使用 exec 进入到容器里启动nginx就可以了。

[root@docker ~]# docker exec -it nginx bash
[root@ecaafe119044 /]# nginx
[root@ecaafe119044 /]# exit
exit
[root@docker ~]# curl 192.168.100.22



welcome to nginx!



welcome to nginx!

if you see this page, the nginx web server is successfully installed and working. further configuration is required.

for online documentation and support please refer to nginx.org.
commercial support is available at nginx.com.

thank you for using nginx.


# nginx  # 镜像  # 自定义  # 的是  # 基础上  # 此种  # 启动时  # 都是  # 是一个  # 是在  # 是一种 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: iOS UIView常见属性方法小结  无锡营销型网站制作公司,无锡网选车牌流程?  Laravel如何创建自定义中间件?(Middleware代码示例)  进行网站优化必须要坚持的四大原则  Laravel如何实现用户密码重置功能?(完整流程代码)  南京网站制作费用,南京远驱官方网站?  如何实现javascript表单验证_正则表达式有哪些实用技巧  昵图网官方站入口 昵图网素材图库官网入口  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  香港服务器WordPress建站指南:SEO优化与高效部署策略  如何快速搭建高效香港服务器网站?  Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  java ZXing生成二维码及条码实例分享  如何利用DOS批处理实现定时关机操作详解  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  php增删改查怎么学_零基础入门php数据库操作必知基础【教程】  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载  如何快速搭建支持数据库操作的智能建站平台?  lovemo网页版地址 lovemo官网手机登录  Python文件操作最佳实践_稳定性说明【指导】  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  长沙企业网站制作哪家好,长沙水业集团官方网站?  香港服务器租用每月最低只需15元?  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  活动邀请函制作网站有哪些,活动邀请函文案?  在线制作视频网站免费,都有哪些好的动漫网站?  Angular 表单中正确绑定输入值以确保提交与验证正常工作  百度浏览器如何管理插件 百度浏览器插件管理方法  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  5种Android数据存储方式汇总  Laravel如何生成URL和重定向?(路由助手函数)  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  如何挑选高效建站主机与优质域名?  如何在不使用负向后查找的情况下匹配特定条件前的换行符  如何快速启动建站代理加盟业务?  JavaScript常见的五种数组去重的方式  如何快速生成专业多端适配建站电话?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  简单实现Android验证码  清除minerd进程的简单方法  详解阿里云nginx服务器多站点的配置  韩国服务器如何优化跨境访问实现高效连接?  Android滚轮选择时间控件使用详解  如何在宝塔面板中修改默认建站目录?  如何选择可靠的免备案建站服务器?