zoukankan      html  css  js  c++  java
  • dockerfile

    由一系列用于根据基础镜像构建新的镜像文件的专用指令序列组成;

    指令字符不区分大小写,但约定俗成使用大写字符;

    FROM指令:必须是第一个非注释行;用于指定用到的基础镜像;
    一个dockerfile文件中可以有多个FROM指令,不过,尽量不要在一个dokcerfile文件中使用多个FROM指令;

    FROM <image>[:tag]
    FROM <image>@<digest>
    
    FROM busybox:latest
    FROM centos:6.8
    

    MAINTAINER指令:提供维护者信息。不限制其出现的位置,建议放在FROM指令之后;

    COPY指令:从宿主机复制文件至正在创建的镜像中;

    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>是dockerfile所在目录的相对路径;
    <src>如果是目录,会自动进行递归复制;如果有多个<src>,包括在<src>上使用了通配符的情形,则<dest>必须是目录,且必须以/结尾;
    <dest>目标路径不存在时,会被自动创建,包括其父目录;
    

    ADD指令:类似于COPY指令,额外支持复制tar文件(会自动展开),以及URL路径(下载文件);

    ADD <src> <dest>
    ADD ["<src>","<dest>"] 
    
    ADD haproxy.cfg /etc/haroxy/haroxy.cfg
    ADD logstash_*.cnf /etc/logstash/
    ADD http://www.keithtt.com/download/nginx/conf/nginx.conf /etc/nginx/
    
    注意:以URL格式指定的源文件,下载后其目标文件的权限为600;
    宿主机上的tar文件复制后会自动展开,但是,通过URL下载的文件如果是tar格式,则不会被展开;
    

    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选项来修改变量的值;
    
     -e, --env value:Set environment variables (default []). 
    

    USER指令:指定运行dockerfile文件中RUN/CMD/ENTRYPOINT指令指定的程序时的用户名或UID;

    USER <uid>
    USER <username>
    
    注意:<uid>应该使用已经存在的用户的UID,否则docker run会报错;
    

    WORKDIR指令:后续命令的执行路径,用于为dockerfile中的RUN/CMD/ENTRYPOINT/COPY/ADD指令指定工作目录;

    WORKDIR <dirpath>
    
    WORKDIR可出现多次。也可以使用相对路径,表示相对于前一个WORKDIR指令指定的路径;还可以调用ENV定义的环境变量;
    
    WORKDIR /var/log
    WORKDIR $statepath
    

    VOLUME指令:定义可以被挂载的目录,用于挂载主机上的卷或其它容器的卷;

    VOLUME <mountpoint>
    VOLUME ["<mountpoint>",...]
    
    如果mountpoint路径下事先有文件存在,docker run命令会在卷挂载完成后将文件复制到挂载的卷中(实际上是unionfs文件叠加);
    

    RUN指令:用于指定docker build过程中要运行的命令;

    RUN <command>
    RUN ["<executable>","<param1>","<param2>",...]
    RUN ["/bin/bash","-c","<executable>","<param1>","<param2>",...]
    
    RUN yum install -y iproute nginx && yum clean all
    

    CMD指令:用于指定在docker run时运行的程序;

    CMD <command> param1 param2      #以shell解释器运行;
    CMD ["<executable>","<param1>","<param2>",...]        #不以shell解释器运行;程序PID为1;
    CMD [<param1>","<param2>",...]        #为ENTRYPOINT指令指定的程序提供默认参数;
    
    每个dockerfile中只能有一个CMD,当指定多个时,只有最后一个生效;
    如果docker run启动容器时指定了运行的命令,则会覆盖掉CMD指定的命令;
    
    CMD ["/usr/sbin/httpd","-c","/etc/httpd/conf/httpd.conf"]  
    

    ENTRYPOINT指令:类似于CMD指令,但不会被docker run命令行参数指定运行的程序覆盖,而且这些命令行参数会被当作参数传递给ENTRYPOINT指定的程序;

    ENTRYPOINT <command> param1 param2      
    ENTRYPOINT ["<executable>","<param1>","<param2>",...]       
    
    每个dockerfile中只能有一个ENTRYPOINT,当指定多个时,只有最后一个生效;
    
    CMD ["-c"]
    ENTRYPOINT ["top","-c"]
    
    ENTRYPOINT ["/bin/echo"]
    docker run -it imageecho "this is a test"
    这里会输出"this is a test"字符串;
    

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

    EXPOSE <port>[/<protocol>]
    
      <protocol>为tcp或udp,默认为tcp;
    
    EXPOSE 11211/tcp 11211/udp
    
    在启动容器时,需要使用-P或者-p参数。
    

    ONBUILD指令:定义触发器;

    当前dockerfile构建出的镜像被用作基础镜像去构建其它镜像时,ONBUILD指令指定的操作才会被执行;
    
    ONBUILD <指令>
    
    注意:ONBUILD不会触发FROM和MAINTAINER指令,每个dockerfile都应该有自己的FROM和MAINTAINER指令;    
    

    示例一:

    # mkdir dockerfile
    # cd dockerfile
    # vim test.dockerfile
    
      FROM busybox:latest
      MAINTAINER keith <keithtt@163.com>
      COPY index.html /web/html/index.html
      EXPOSE 80
      CMD ["httpd","-f","-h","/web/html"]
    
    # vim index.html
      from test dockerfile                  
    
    # docker build --help
      Build an image from a Dockerfile.
      -f, --file:Name of the Dockerfile (Default is 'PATH/Dockerfile').
      -t, --tag=[]:Name and optionally a tag in the 'name:tag' format.    
    
    # docker build -f test.dockerfile -t busybox:web .
    # docker run -d --name test -P busybox:web
    # docker port test
      80/tcp -> 0.0.0.0:32768
    
    用浏览器访问
    http://121.42.184.143:32768/ 
    

    示例二:

    # mkdir docker-httpd
    # cd  docker-httpd/
    # vim httpd.dockerfile
    
      FROM centos:latest
      MAINTAINER keithtt <329640305@qq.com>
      RUN yum install -y httpd php php-mysql php-mbstring && yum clean all && echo -e '<?php
    	phpinfo();
    ?>' > /var/www/html/index.php
      EXPOSE 80
      CMD ["/usr/sbin/httpd","-f","/etc/httpd/conf/httpd.conf","-DFOREGROUND"]
    
    # docker build -f httpd.dockerfile -t httpd:test .  
    
    # docker images
    # docker run -d --name httpd -p 80:80 httpd:test
    # docker ps  
    
    用浏览器访问
    http://121.42.184.143/
    

    示例三:

    # vim pma.dockerfile
    
      FROM centos:latest
      MAINTAINER keithtt <329640305@qq.com>
      RUN yum install -y httpd php php-mysql php-mbstring && yum clean all && echo -e '<?php
    	phpinfo();
    ?>' > /var/www/html/index.php
      EXPOSE 80
      VOLUME /var/www/html
      CMD ["/usr/sbin/httpd","-f","/etc/httpd/conf/httpd.conf","-DFOREGROUND"]
    
    # docker build -f pma.dockerfile -t httpd:pma .
    
    # wget https://files.phpmyadmin.net/phpMyAdmin/4.4.15.5/phpMyAdmin-4.4.15.5-all-languages.zip
    # unzip phpMyAdmin-4.4.15.5-all-languages.zip
    # mkdir /web/html
    #mv phpMyAdmin-4.4.15.5-all-languages /web/html/pma
    # cd /web/html/pma
    # cp config.sample.inc.php config.inc.php
    
    # openssl rand --help
    # openssl rand -base64 20
      qW2C0TFAXu3S5FXV3TBgwSv5Cn4
    # vim /web/html/pma/config.inc.php
      $cfg['blowfish_secret'] = 'qW2C0TFAXu3S5FXV3TBgwSv5Cn4';  
      $cfg['Servers'][$i]['host'] = '121.42.184.143';
    
    # yum install -y mariadb-server
    # vim /etc/my.cnf.d/server.cnf
      [mysqld]
      skip_name_resolve = on
      innodb_file_per_table = on
    # systemctl start mariadb
    
    # mysql
    >grant all on *.* to 'root'@'%' identified by 'keithtt';
    >flush privileges;
    >exit;  
    
    # docker run -d --name pma -p 80:80 -v /web/html:/var/www/html httpd:pma
    
    用浏览器访问
    http://121.42.184.143/pma/
    
  • 相关阅读:
    Cgroup学习笔记
    基于dubbo框架下的RPC通讯协议性能测试
    More about dubbo
    基于nginx tomcat redis分布式web应用的session共享配置
    基于开源Dubbo分布式RPC服务框架的部署整合
    More about Tair (NoSql)
    MySql Replication配置
    Memcached、Redis OR Tair
    基于淘宝开源Tair分布式KV存储引擎的整合部署
    关于TbSchedule任务调度管理框架的整合部署
  • 原文地址:https://www.cnblogs.com/keithtt/p/6819379.html
Copyright © 2011-2022 走看看