热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

八、Dockerfile使用

dockerfile方式创建容器最简单的dockerfile创建镜像使用此镜像运行一个容器dockerfile基本要素dockerfile指令FROM:FROM{base镜像}

dockerfile方式创建容器

最简单的dockerfile

创建镜像

使用此镜像运行一个容器


dockerfile基本要素


dockerfile指令

FROM:

  FROM {base镜像}

  必须放在DOckerfile的第一行,表示从哪个baseimage开始构建 

MAINTAINER:

可选的,用来标识image作者的地方

RUN 

RUN都是启动一个容器、执行命令、然后提交存储层文件变更。

第一层 RUN command1 的执行仅仅是当前进程,一个内存上的变化而已,其结果不会造成任何文件。

而到第二层的时候,启动的是一个全新的容器,跟第一层的容器更完全没关系,自然不可能继承前一层构建过程中的内存变化。

而如果需要将两条命令或者多条命令联合起来执行需要加上&&

如:cd /usr/local/src && wget xxxxxxx

CMD:

  CMD的作用是作为执行container时候的默认行为(容器默认的启动命令)

  当运行container的时候声明了command,则不再用image中的CMD默认所定义的命令

一个Dockerfile中只能有一个有效的CMD,当定义多个CMD的时候,只有最后一个才会起作用

EXPOSE

EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

entrypoint:

entrypoint的作用是,把整个container变成可执行的文件,且不能够通过替换CMD的方法来改变创建container的方式。但是可以通过参数传递的方法影响到container内部

每个Dockerfile只能够包含一个entrypoint,多个entrypoint只有最后一个有效

当定义了entrypoint以后,CMD只能够作为参数进行传递

ADD & COPY:

  host上的文件或者目录复制到image中(能够进行自动解压压缩包)  

ENV:

  用来设置环境变量,后续的RUN可以使用它所创建的环境变量 

WORKDIR:

  用来指定当前工作目录(或者称为当前目录) 

USER:

  运行RUN指令的用户 

VOLUME:

  用来创建一个在image之外的mount point


nginx镜像制作实战

编译/安装nginx

mkdir一个目录,在此目录内下载nginx源码包

wget  http://nginx.org/download/nginx-1.13.2.tar.gz

 

并创建一个Dockerfile文件,文件内制作一系列nginx的编译安装流程,内容如文件:

其中,每一个RUN就是增加一个镜像层文件,一层层的RUN命令最终形成一系列镜像层

 

运行build指令(注意最后的.代表当前路径),制作镜像

docker build -t cent-ngx2  .

 

我们查看一下这个镜像的层次历史

可看到,此镜像层基本与dockerfile文件的RUN是一一对应的

 

使用制作的nginx镜像,创建一个容器。

因此镜像无前台命令,因为必须指定启动命令 :/usr/local/nginx/sbin/nginx -g "daemon off;"

为镜像指定环境变量,挂载目录,默认启动命令

在上一版镜像的基础上,我们新加配置

执行:docker build -t cent-ngx3

查看镜像的历史,可看到比ngx2的镜像多了几个层

ngx3的镜像创建容器,已经不需要再指定cmd命令了

可执行命令自行校验:docker run -d --name ng2 cent-ngx3

 



推荐阅读
  • 本文探讨了如何通过预处理器开关选择不同的类实现,并解决在特定情况下遇到的链接器错误。 ... [详细]
  • 本文深入探讨了UNIX/Linux系统中的进程间通信(IPC)机制,包括消息传递、同步和共享内存等。详细介绍了管道(Pipe)、有名管道(FIFO)、Posix和System V消息队列、互斥锁与条件变量、读写锁、信号量以及共享内存的使用方法和应用场景。 ... [详细]
  • 本文详细探讨了Java命令行参数的概念、使用方法及在实际编程中的应用,包括如何通过命令行传递参数给Java程序,以及如何在Java程序中解析这些参数。 ... [详细]
  • 本文详细介绍了Java的安装、配置、运行流程以及有效的学习方法,旨在帮助初学者快速上手Java编程。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 本文详细探讨了Java中的ClassLoader类加载器的工作原理,包括其如何将class文件加载至JVM中,以及JVM启动时的动态加载策略。文章还介绍了JVM内置的三种类加载器及其工作方式,并解释了类加载器的继承关系和双亲委托机制。 ... [详细]
  • Java 中重写与重载的区别
    本文详细解析了 Java 编程语言中重写(Override)和重载(Overload)的概念及其主要区别,帮助开发者更好地理解和应用这两种多态性机制。 ... [详细]
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
  • 本文介绍如何使用MFC和ADO技术调用SQL Server中的存储过程,以查询指定小区在特定时间段内的通话统计数据。通过用户界面选择小区ID、开始时间和结束时间,系统将计算并展示小时级的通话量、拥塞率及半速率通话比例。 ... [详细]
  • 全面解析运维监控:白盒与黑盒监控及四大黄金指标
    本文深入探讨了白盒和黑盒监控的概念,以及它们在系统监控中的应用。通过详细分析基础监控和业务监控的不同采集方法,结合四个黄金指标的解读,帮助读者更好地理解和实施有效的监控策略。 ... [详细]
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
  • 如何使用Ping命令来测试网络连接?当网卡安装和有关参数配置完成后,可以使用ping命令来测试一下网络是否连接成功。以winXP为例1、打开XP下DOS窗口具体操作是点击“开始”菜 ... [详细]
  • 本文详细介绍了8051系列微控制器的中断系统,特别是C51编译器中interrupt和using关键字的作用及其使用方法。通过深入分析这两个关键字的功能,帮助开发者更好地理解和优化中断程序的设计。 ... [详细]
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • 并发编程 12—— 任务取消与关闭 之 shutdownNow 的局限性
    Java并发编程实践目录并发编程01——ThreadLocal并发编程02——ConcurrentHashMap并发编程03——阻塞队列和生产者-消费者模式并发编程04——闭锁Co ... [详细]
author-avatar
mobiledu2502860093
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有