zoukankan      html  css  js  c++  java
  • 【Linux】【Services】【Docker】Docker File

    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 phpinfo(); ?>' > /var/www/html/info.php

    EXPOSE 80/tcp

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

  • 相关阅读:
    GoF 23种设计模式概述
    设计模式总篇
    面向对象软件开发六大原则
    StarUML类图相关——关联、聚合、组合、泛化、依赖、实现
    Java8集合框架——ArrayList源码分析
    Q6:ZigZag Conversion
    Python基础学习-列表基本操作
    Python基础学习之字符串(1)
    Python基础学习之序列(2)
    Python基础学习之序列(1)
  • 原文地址:https://www.cnblogs.com/demonzk/p/7793871.html
Copyright © 2011-2022 走看看