Docker Images:
docker commit
Dockerfile:文本文件,镜像文件构建脚本;

Dockerfile:由一系列用于根据基础镜像构建新的镜像文件的专用指令序列组成;
指令:选定基础镜像、安装必要的程序、复制配置文件和数据文件、自动运行的服务以及要暴露的端口等;

命令:docker build;

语法:指令行、注释行和空白行;
指令行:由指令及指令参数构成;
指令:其字符不区分大小写;约定俗成,要使用全大写字符;
注释行:#开头的行,必须单独位于一行当中;
空白行:会被忽略;

指令:
FROM指令:必须是第一个非注释行,用于指定所用到的基础镜像;

语法格式:
FROM <image>[:<tag>] 或
FROM <image>@<digest>

FROM busybox:latest
FROM centos:6.9

注意:尽量不要在一个dockerfile文件中使用多个FROM指令;

MAINTANIER指令:用于提供信息的指令,用于让作者提供本人的信息;不限制其出现的位置,但建议紧跟在FROM之后;

语法格式:
MAINTANIER <author's detail>

例如:
MAINTANIER MageEdu Linux Operation and Maintance Institute <mage@magedu.com>

COPY指令:用于从docker主机复制文件至正在创建的映像文件中;

语法格式:
COPY <src> ... <dest>
COPY ["<src>",... "<dest>"] (文件名中有空白字符时使用此种格式)

<src>:要复制的源文件或目录,支持使用通配符;
<dest>:目标路径,正在创建的镜像文件的文件系统路径;建立使用绝对路径,否则,则相对于WORKDIR而言;

所有新复制生成的目录文件的UID和GID均为0;

例如:
COPY server.xml /etc/tomcat/server.xml
COPY *.conf /etc/httpd/conf.d/

注意:
<src>必须是build上下文中的路径,因此,不能使用类似“../some_dir/some_file”类的路径;

<src>如果是目录,递归复制会自动行;如果有多个<src>,包括在<src>上使用了通配符这种情形,此时<dest>必须是目录,而且必须得以/结尾;

<dest>如果事先不存在,它将被自动创建,包括其父目录;

ADD指令:类似于COPY指令,额外还支持复制TAR文件,以及URL路径;


语法格式:
ADD <src> ... <dest>
ADD ["<src>",... "<dest>"]

示例:
ADD haproxy.cfg /etc/haproxy/haproxy.cfg
ADD logstash_*.cnf /etc/logstash/
ADD http://www.magedu.com/download/nginx/conf/nginx.conf /etc/nginx/

注意:以URL格式指定的源文件,下载完成后其目标文件的权限为600;

注意:
<src>必须是build上下文中的路径,因此,不能使用类似“../some_dir/some_file”类的路径;

如果<src>是URL,且<dest>不以/结尾,则<src>指定的文件将被下载并直接被创建为<dest>;如果<dest>以/结尾,则URL指定的文件将被下载至<dest>中,并保留原名;

如果<src>是一个host本地的文件系统上的tar格式的文件,它将被展开为一个目录,其行为类似于tar -x命令;但是,如果通过URL下载到的文件是tar格式的,是不会自动进行展开操作的;

<src>如果是目录,递归复制会自动行;如果有多个<src>,包括在<src>上使用了通配符这种情形,此时<dest>必须是目录,而且必须得以/结尾;

<dest>如果事先不存在,它将被自动创建,包括其父目录;

ENV指令:定义环境变量,此些变量可被当前dockerfile文件中的其它指令所调用,调用格式为$variable_name或${variable_name};

语法:
ENV <key> <value> 一次定义一个变量
ENV <key>=<value> ... 一次可定义多个变量 ,如果<value>中有空白字符,要使用\字符进行转义或加引号;

例如:
ENV myName="Obama Clark" myDog=Hello\ Dog \
myCat=Garfield

等同于:
ENV myName Obama Clark
ENV myDog Hello Dog
ENV myCat Garfield

ENV定义的环境变量在镜像运行的整个过程中一直存在,因此,可以使用inspect命令查看,甚至也可以在docker run启动此镜像时,使用--env选项来修改指定变量的值;

USER指令:指定运行镜像时,或运行Dockerfile文件中的任何RUN/CMD/ENTRYPOINT指令指定的程序时的用户名或UID;

语法格式:
USER <UID>|<Username>

注意:<UID>应该使用/etc/passwd文件存在的用户的UID,否则,docker run可能会出错;

WORKDIR指令:用于为Dockerfile中所有的RUN/CMD/ENTRYPOINT/COPY/ADD指令指定工作目录;

语法格式:
WORKDIR <dirpath>

注意:WORDIR可出现多次,也可使用相对路径,此时表示相对于前一个WORKDIR指令指定的路径;WORKDIR还可以调用由ENV定义的环境变量的值;

例如:
WORKDIR /var/log
WORKDIR $STATEPATH

VOLUME指令:用于目标镜像文件中创建一个挂载点目录,用于挂载主机上的卷或其它容器的卷;

语法格式:
VOLUME <mountpoint>
VOLUME ["<mountpoint>", ...]

注意:
如果mountpoint路径下事先有文件存在,docker run命令会在卷挂载完成后将此前的文件复制到新挂载的卷中;

RUN指令:用于指定docker build过程中要运行的命令,而不是docker run此dockerfile构建成的镜像时运行;

语法格式:
RUN <command> 或
RUN ["<executeable>", "<param1>", "<param2>", ...]

RUN ["/bin/bash", "-c", "<executeable>", "<param1>", "<param2>", ...]

例如:
RUN yum install iproute nginx && yum clean all

CMD指令:类似于RUN指令,用于运行程序;但二者运行的时间点不同;CMD在docker run时运行,而非docker build;
CMD指令的首要目的在于为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束;不过,CMD指令指定的程序可被docker run命令行参数中指定要运行的程序所覆盖。

语法格式:
CMD <command> 或
CMD ["<executeable>", "<param1>", "<param2>", ...] 或
CMD [ "<param1>", "<param2>", ...]

第三种为ENTRYPOINT指令指定的程序提供默认参数;

注意:如果dockerfile中存在多个CMD指令,仅最后一个生效;

CMD ["/usr/sbin/httpd", "-c","/etc/httpd/conf/httpd.conf"]

ENTRYPOINT指令:类似于CMD指令,但其不会被docker run的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给ENTRYPOINT指令指定的程序;
但是,如果运行docker run时使用了--entrypoint选项,此选项的参数可当作要运行的程序覆盖ENTRYPOINT指令指定的程序;

语法格式:
ENTRYPOINT <command> 或
ENTRYPOINT ["<executeable>", "<param1>", "<param2>", ...]

例如:
CMD ["-c"]
ENTRYPOINT ["top", "-b"]

EXPOSE指令:用于为容器指定要暴露的端口;

语法格式:
EXPOSE <port>[/<protocol>] [<port>[/<protocol>]] ...

<protocol>为tcp或udp二者之一,默认为tcp;

例如:
EXPOSE 11211/tcp 11211/udp

ONBUILD指令:定义触发器;
当前dockerfile构建出的镜像被用作基础镜像去构建其它镜像时,ONBUILD指令指定的操作才会被执行;

语法格式:
ONBUILD <INSTRUCTION>

例如:
ONBUILD ADD my.cnf /etc/mysql/my.cnf

注意:ONBUILD不能自我嵌套,且不会触发FROM和MAINTAINER指令;

示例1:
FROM busybox:latest
MAINTAINER MageEdu <mage@magedu.com>

COPY index.html /web/html/index.html

EXPOSE 80/tcp

CMD ["httpd","-f","-h","/web/html"]

WORKDIR: /tmp/busybox-web
index.html
busybox-web.df

~]# docker build -f /tmp/busybox-web/busybox-web.cf -t busybox:web /tmp/busybox
~]# docker images







示例2:httpd

练习:
(1)构建一个基于centos的httpd镜像,要求,其主目录路径为/web/htdocs,且主页存在,并以apache用户的身份运行,暴露80端口;
(2)进一步地,其页面文件为主机上的卷;
(3)进一步地,httpd支持解析php页面;
(4)构建一个基于centos的maridb镜像,让容器间可互相通信;
(5)在httpd上部署wordpress;


容器导入和导出:
docker export
docker import

镜像的保存及装载:
docker save -o /PATH/TO/SOMEFILE.TAR NAME[:TAG]

docker load -i /PATH/FROM/SOMEFILE.TAR

回顾:
Dockerfile指令:
FROM,MAINTAINER
COPY,ADD
WORKDIR, ENV
USER
VOLUME
EXPOSE
RUN
CMD,ENTRYPOINT
ONBUILD

Dockerfile(2)
示例2:httpd

FROM centos:latest
MAINTAINER MageEdu "<mage@magedu.com>"

RUN sed -i -e 's@^mirrorlist.*repo=os.*$@baseurl=http://172.16.0.1/cobbler/ks_mirror/$releasever/@g' -e '/^mirrorlist.*repo=updates/a enabled=0' -e '/^mirrorlist.*repo=extras/a enabled=0' /etc/yum.repos.d/CentOS-Base.repo && \
yum -y install httpd php php-mysql php-mbstring && \
yum clean all && \
echo -e '<?php\n\tphpinfo();\n?>' > /var/www/html/info.php

EXPOSE 80/tcp

CMD ["/usr/sbin/httpd","-f","/etc/httpd/conf/httpd.conf","-DFOREGROUND"]

【Linux】【Services】【Docker】Docker File的更多相关文章

  1. 【Linux&amp;Unix--open/close/write/read系统调用】

    个人学习整理.如有不足之处,请不吝不吝赐教. 转载请注明:@CSU-Max 系列博文:      Linux&Unix学习第一弹 -- 文件描写叙述符与权限  Linux&Unix学习 ...

  2. 【linux之设备,分区,文件系统】

    一.设备 IDE磁盘的设备文件采用/dev/hdx来命名,分区则采用/dev/hdxy来命名,其中x表示磁盘(a是第一块磁盘,b是第二块磁盘,以此类推), y代表分区的号码(由1开始,..3以此类推) ...

  3. 【linux之挂载,Raid,LVM】

    一.挂载,卸载 挂载:将新的文件系统关联至当前根文件系统卸载:将某文件系统与当前根文件系统的关联关系移除 cat /etc/mtab 存储着已经挂载的文件系统 (跟 mount 一样) mount:显 ...

  4. 【linux之进程管理,系统监控】

    一.进程管理 前台进程:一般是指占据着标准输入和/或标准输出的进程后台进程:不占据默认开启的进程都是前台进程ctrl+C 中断ctrl+z 从前台转入后台bg 后台进程编号 让其在后台运行ls -R ...

  5. 【Linux磁盘优化管理--RAID和LVM】

    在现阶段的企业环境中,为了数据的安全性及完整性必须要有一个合理的存储方案.面对着每秒可能产生超过几TB的数据,考虑到磁盘能不能实现 热冗余,及扩容,缩容.Linux给出了RAID(磁盘阵列)以及LVM ...

  6. 【Linux 内核网络协议栈源码剖析】网络栈主要结构介绍(socket、sock、sk_buff,etc)

    原文:http://blog.csdn.net/wenqian1991/article/details/46700177 通过前面的分析,可以发现,网络协议栈中的数据处理,都是基于各类结构体,所有有关 ...

  7. 【linux之链接,函数,随机数】

    一.链接 硬链接(hard link):同一个文件使用了多个别名.新建文件是已经存在的一个别名,,当原文件删除时,新建的文件仍然可以使用.硬链接和原来的文件没有什么区别,而且共享一个inode号.通过 ...

  8. 【Linux运维-集群技术进阶】Nginx+Keepalived+Tomcat搭建高可用/负载均衡/动静分离的Webserver集群

    额.博客名字有点长.. . 前言 最终到这篇文章了,心情是有点激动的. 由于这篇文章会集中曾经博客讲到的全部Nginx功能点.包含主要的负载均衡,还有动静分离技术再加上这篇文章的重点.通过Keepal ...

  9. 5.2【Linux 内核网络协议栈源码剖析】socket 函数剖析 ☆☆☆

    深度剖析网络协议栈中的 socket 函数,可以说是把前面介绍的串联起来,将网络协议栈各层关联起来. 应用层 FTP SMTP HTTP ... 传输层 TCP UDP 网络层 IP ICMP ARP ...

  10. 【Linux下安装使用virtualenv与virtualenvwrapper】

    virtualenv virtualenv是一个可以帮助我们管理不同Python环境的绝好工具. virtualenv是一个可以在系统中建立多个不同且相互不干扰的虚拟环境. 下面的步骤将创建两个独立的 ...

随机推荐

  1. jenkins-发送allure邮件测试报告

    1.安装插件 allure-jenkins-plugin  2.在全局工具配置中,配置allure命令行 3.全局工具配置中,添加JDK配置 4.配置slave节点工具(JDK+Allure)-配置在 ...

  2. 菜鸡的Java笔记 第六 - java 方法

    前提:现在所讲解的方法定义格式,只属于JAVA 方法定义的其中一种组成方式.而完整的组成方式将随着学习逐步渗透. 1.方法的基本定义 方法(Method)在一些书中也会有人将其说是  函数(Funct ...

  3. 14-2-Unsupervised Learning ----Word Embedding

    Introduction 词嵌入(word embedding)是降维算法(Dimension Reduction)的典型应用 那如何用vector来表示一个word呢? 1-of-N Encodin ...

  4. SQL中单引号和双引号

    比如说: String sql = "select * from clients where logname='" + name + "'and password='&q ...

  5. Python科普系列——类与方法(下篇)

    书接上回,继续来讲讲关于类及其方法的一些冷知识和烫知识.本篇将重点讲讲类中的另一个重要元素--方法,也和上篇一样用各种神奇的例子,从原理和机制的角度为你还原一个不一样的Python.在阅读本篇之前,推 ...

  6. [atARC121E]Directed Tree

    令$b_{a_{i}}=i$,那么问题即要求$i$不是$b_{i}$的祖先,也即$b_{i}$不严格在$i$的子树中 显然$a_{i}$和$b_{i}$一一对应,因此我们不妨统计$b_{i}$的个数 ...

  7. [luogu4259]寻找车位

    考虑一个分治的做法:按行分治,将所有区间分为两类--经过分割线的.在左/右区间内部,后者显然可以递归下取,考虑前者 先求出出该行上每一列向上和向下的最大长度,记作$up_{i}$和$down_{i}$ ...

  8. [atARC105F]Lights Out on Connected Graph

    记$G[S]$表示图$G$在点集$S$上的导出子图,即$G[S]=(S,{(x,y)|x,y\in S且(x,y)\in E})$ 定义$g(S)$为所有$E'$(满足$E'\subseteq G[S ...

  9. 文本分类:Keras+RNN vs传统机器学习

    摘要:本文通过Keras实现了一个RNN文本分类学习的案例,并详细介绍了循环神经网络原理知识及与机器学习对比. 本文分享自华为云社区<基于Keras+RNN的文本分类vs基于传统机器学习的文本分 ...

  10. 【.NET 与树莓派】MPD 的 Mini-API 封装

    在前面的水文中,一方面,老周向各位同学介绍了通过 TCP 连接来访问 MPD 服务:另一方面,也简单演示了 ASP.NET Core 的"极简 API"(Mini API).本篇老 ...