zoukankan      html  css  js  c++  java
  • Dockerfile详解

    一:Dockerfile文件简介

    1:什么是Dockerfile

    Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile来快速创建自定义的镜像。

    Docker通过对于在Dockerfile中的一系列指令的顺序解析实现自动的image的构建

      通过使用build命令,根据Dockerfiel的描述来构建镜像

      通过源代码路径的方式

      通过标准输入流的方式

    通过源代码路径

      Dockerfile需要放置在项目的根目录位置

      在构建的时候,Dockerfile client会把整个context打包发送到Docker Server端,然后由server端负责build镜像,在构建成功后,会删除context目录

      docker build -t {镜像名字} {项目路径可以是相对路径}

      docker利用Dockerfile来构建新镜像之前,先来了解一下Dockerfile创建中使用到的指令

    通过标准输入流:

      通过标准输入流的方式获取Dockerfile的内容

      client不会打包上传context目录,因此对于一些ADD、COPY等涉及host本地文件复制的操作不能够支持

      docker build -t {镜像名字} - < Dockerfile路径

    build cache:

      Dockerfile中的每一个指令执行完毕后,都会提交为一个image,这样保证了指令之间不会有影响

      Dockerfile会尽可能尝试重用之前已经构建的镜像

      可以通过在build命令中增加--no-cache的方式来禁用这个cache

    2:一个典型的Dockerfiler

    ############################################################

    # Dockerfile to build Nginx Installed Containers

    # Based on Ubuntu

    ############################################################

    # Set the base image to Ubuntu

    FROM ubuntu

    # File Author / Maintainer

    MAINTAINER Maintaner Name

    # Install Nginx

    # Add application repository URL to the default sources

    RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list

    # Update the repository

    RUN apt-get update

    # Install necessary tools

    RUN apt-get install -y nano wget dialog net-tools

    # Download and Install Nginx

    RUN apt-get install -y nginx

    # Remove the default Nginx configuration file

    RUN rm -v /etc/nginx/nginx.conf

    # Copy a configuration file from the current directory

    ADD nginx.conf /etc/nginx/

    # Append "daemon off;" to the beginning of the configuration

    RUN echo "daemon off;" >> /etc/nginx/nginx.conf

    # Expose ports

    EXPOSE 80

    # Set the default command to execute

    # when creating a new container

    CMD service nginx start

    3:Dockerfile指令:

      只支持Docker自己定义的一套指令,不支持自定义

      大小写不敏感,但是建议全部使用大写

      根据Dockerfile的内容顺序执行

    1)FROM:

      FROM {base镜像}

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

    2)MAINTAINER:

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

    3)RUN:

      每一个RUN指令都会是在一个新的container里面运行,并提交为一个image作为下一个RUN的base

      一个Dockerfile中可以包含多个RUN,按定义顺序执行

      RUN支持两种运行方式:

        RUN <cmd> 这个会当作/bin/sh -c “cmd” 运行

        RUN [“executable”,“arg1”,。。],Docker把他当作json的顺序来解析,因此必须使用双引号,而且executable需要是完整路径

      RUN 都是启动一个容器、执行命令、然后提交存储层文件变更。第一层 RUN command1 的执行仅仅是当前进程,一个内存上的变化而已,其结果不会造成任何文件。而到第二层的时候,启动的是一个全新的容器,跟第一层的容器更完全没关系,自然不可能继承前一层构建过程中的内存变化。而如果需要将两条命令或者多条命令联合起来执行需要加上&&。如:cd /usr/local/src && wget xxxxxxx

    4)CMD:

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

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

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

    CMD定义的三种方式:

      CMD <cmd> 这个会当作/bin/sh -c "cmd"来执行

      CMD ["executable","arg1",....]

      CMD ["arg1","arg2"],这个时候CMD作为ENTRYPOINT的参数

    5EXPOSE 声明端口

      格式为 EXPOSE <端口1> [<端口2>...]。

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

    entrypoint:

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

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

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

    entrypoint定义方式:

      entrypoint ["executable","arg1","arg2"],这种定义方式下,CMD可以通过json的方式来定义entrypoint的参数,可以通过在运行container的时候通过指定command的方式传递参数

      entrypoint <cmd>,当作/bin/bash -c "cmd"运行命令

    6)ADD & COPY:

      当在源代码构建的方式下,可以通过ADD和COPY的方式,把host上的文件或者目录复制到image中

      ADD和COPY的源必须在context路径下

      当src为网络URL的情况下,ADD指令可以把它下载到dest的指定位置,这个在任何build的方式下都可以work

      ADD相对COPY还有一个多的功能,能够进行自动解压压缩包

    7)ENV:

      ENV key value

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

      当创建基于该镜像的container的时候,会自动拥有设置的环境变量

    8)WORKDIR:

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

      当使用相对目录的情况下,采用上一个WORKDIR指定的目录作为基准

    9)USER:

      指定UID或者username,来决定运行RUN指令的用户

    10)ONBUILD:

      ONBUILD作为一个trigger的标记,可以用来trigger任何Dockerfile中的指令

      可以定义多个ONBUILD指令

      当下一个镜像B使用镜像A作为base的时候,在FROM A指令前,会先按照顺序执行在构建A时候定义的ONBUILD指令

      ONBUILD <DOCKERFILE 指令> <content>

    11)VOLUME:

      用来创建一个在image之外的mount point,用来在多个container之间实现数据共享

      运行使用json array的方式定义多个volume

      VOLUME ["/var/data1","/var/data2"]

      或者plain text的情况下定义多个VOLUME指令

    二:生成镜像

    1)先创建nginx.conf配置文件,和Dockerfile文件放置在同一个目录

    [root@localhost ~]# cat /opt/test/nginx.conf

    worker_processes 1;

    events { worker_connections 1024; }

    http {

         sendfile on;

         server {

             listen 80;

             location / {

                  proxy_pass http://httpstat.us/;

                  proxy_set_header X-Real-IP $remote_addr;

             }

         }

    }

    2)生成镜像

    [root@localhost test]# docker build -t myimage /opt/test

  • 相关阅读:
    Flutter开发环境搭建
    Android自定义View-圆形图片控件
    浅析对象的创建过程
    Java对象占用内存大小--Java对象的内存结构分析
    对AQS的简单理解及自定义锁的实现
    IntelliJ IDEA插件开发的简单流程
    IOC之运行时注入-实现Activity的布局注入+控件注入+事件绑定
    动态代理+注解+反射实现View的点击事件绑定
    Java中的注解和反射
    利用短信通知的方式在Tasker中实现收到Android手机短信自动转发到微信
  • 原文地址:https://www.cnblogs.com/ccshi/p/13154318.html
Copyright © 2011-2022 走看看