设为首页 收藏本站
查看: 1164|回复: 0

[经验分享] Linux Dockerfile & harbor

[复制链接]

尚未签到

发表于 2019-2-17 10:15:50 | 显示全部楼层 |阅读模式
  Linux Dockerfile & harbor
  时间: 20181113
  目录
  为何要使用Dockerfile文件
  Dockerfile
  dockerfile 制作原理
  About Dockerfile
  Dockerfile Format
  Dockerfile Instructions(FROM,LABEL,COPY,ADD,WORKDIR,VOLUME,EXPOSE,ENV,CMD
  RUN,ENTRYPOINT,USER,HEALTHCHECK,SHELL,ARG,ONBUILD)
  harbor(私有docker仓库)
  总结
  为何要使用Dockerfile文件
  官方所提供的镜像如何自定义其配置?
  容器的配置文件
  1. 在运行时使用docker run
  2. 将原镜像运行成container然后配置完成使用commit生成自定义镜像
  3. 在运行时为其传递参数环境变量 docker run -e
  4. 将配置文件放置于存储卷中,运行时添加此存储卷
  上述几种虽然可以提供配置文件,但是操作起来相当繁琐
  方便创建image时直接提供相应的配置,用来为image提供自定义的配置文件
  自定义image所
  Dockerfile
  FROM baseImage
  所有的文件必须在工作目录中
  一条指令加一个镜像层
  所指定的指令是baseImage所拥有的指令
  dockerfile 制作原理
  开启一个所指定的baseImage, 根据dockerfile所给定的指令 制作imagecontainer
  About Dockerfile
  Dockerfile is nothing but the source code for building Docker images
  Docker can build images automatically by reading the instructions
  from a Dockerfile
  
  A Dockerfile is a text document that contains all the commands a
  user could call on the command line to assemble an image
  Using docker build users can create an automated build that executes
  several command-line instructions in succession
  
  Dockerfile Format
  Format
  # Comment
  INSTRUCTION arguments
  
  The first instruction must be 'FROM' in order to specify the Base
  Image from which you are building.
  Docker runs instructions in a Dockerfile in order
  
  The instruction is not case-sensitive(字符大小写).
  However, convention is for them to be UPPERCASE to distinguish
  them from arguments more easily
  Environment replacement
  Environment variables (declared with the ENV statement) can also be
  used in certain instructions as variables to be interpreted by the
  Dockerfile
  
  Environment variables are notated in the Dockerfile either
  with $variable_name or ${variable_name}
  
  The ${variable_name} syntax also supports a few of the
  standard bash modifiers
  
  ${variable:-word} indicates that if variable is set then the result
  will be that value. If variable is not set then word will be the
  result.
  
  ${variable:+word} indicates that if variable is set then word will be
  the result, otherwise the result is the empty string.(用的较少)
  .dockerignore file
  Before the docker CLI sends the context to the docker daemon, it looks
  for a file named .dockerignore in the root directory of the context
  
  If this file exists, the CLI modifies the context to exclude files and
  directories that match patterns in it
  
  The CLI interprets the .dockerignore file as a newline-separated list of
  patterns similar to the file globs of Unix shells
  此文件里所写的文件列表不会被复制到所要构建的镜像中
  Dockerfile Instructions
  FROM
  FROM指令是最重的一个且必须为Dockerfile文件开篇的第一个非注释行,用于
  为映像文件构建过程指定基准镜像,后续的指令运行于此基准镜像所提供的运
  行环境
  
  实践中,基准镜像可以是任何可用镜像文件,默认情况下,docker build会在
  docker主机上查找指定的镜像文件,在其不存在时,则会从Docker Hub Registry
  上拉取所需的镜像文件,如果找不到指定的镜像文件,docker build会返回一个错误信息
  
  Syntax
  FROM [:] 或
  FROM @
  :指定作为base image的名称;
  :base image的标签,为可选项,省略时默认为latest;
  MAINTANIER (depreacted)
  用于让Dockerfile制作者提供本人的详细信息
  Dockerfile并不限制MAINTAINER指令可在出现的位置,但推荐将其放置于FROM指令之后
  
  Syntax
  MAINTAINER 可是任何文本信息,但约定俗成地使用作者名称及邮件地址
  MAINTAINER "winthcloud "
  The LABEL instruction adds metadata to an image
  Syntax: LABEL = = = ...
  
  The LABEL instruction adds metadata to an image.
  
  A LABEL is a key-value pair.
  
  To include spaces within a LABEL value, use quotes and backslashes as
   you would in command-line parsing.
  
  An image can have more than one label.
  You can specify multiple labels on a single line.
  
  COPY
  用于从Docker主机复制文件至创建的新映像文件
  Syntax
  COPY  ...  或
  COPY ["",... ""]
  :要复制的源文件或目录,支持使用通配符
  :目标路径,即正在创建的image的文件系统路径;建议为
  使用绝对路径,否则,COPY指定则以WORKDIR为其起始路径;
  注意:在路径中有空白字符时,通常使用第二种格式
  
  文件复制准则
  必须是build上下文中的路径,不能是其父目录中的文件
  如果是目录,则其内部文件或子目录会被递归复制,但目录自身不会
  被复制
  
  如果指定了多个,或在中使用了通配符,则
  必须是一个目录,且必须以/结尾
  
  如果事先不存在,它将会被自动创建,这包括其父目录路径
  
  ADD
  ADD指令类似于COPY指令,ADD支持使用TAR文件和URL路径
  Syntax
  ADD  ...  或
  ADD ["",... ""]
  操作准则
  
  同COPY指令
  
  如果为URL且不以/结尾,则指定的文件将被下载并直接被创建为
  ;如果以/结尾,则文件名URL指定的文件将被直接下载并保存为
  /
  
  如果是一个本地系统上的压缩格式的tar文件,它将被展开为一个目录,其行为
  类似于“tar -x”命令;然而,通过URL获取到的tar文件将不会自动展开;
  
  如果有多个,或其间接或直接使用了通配符,则必须是一个以/结尾的目
  录路径;如果不以/结尾,则其被视作一个普通文件,的内容将被直接写
  入到;
  WORKDIR
  用于为Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY和ADD指定设定工作目录
  
  Syntax
  WORKDIR
  
  在Dockerfile文件中,WORKDIR指令可出现多次,其路径也可以为相对路径,
  不过,其是相对此前一个WORKDIR指令指定的路径。另外,WORKDIR也可调用由
  ENV指定定义的变量
  
  例如
  WORKDIR /var/log
  WORKDIR $STATEPATH
  VOLUME
  用于在image中创建一个挂载点目录,以挂载Docker host上的卷或其它容器上的卷
  
  Syntax
  VOLUME  或 VOLUME [""]
  
  如果挂载点目录路径下此前在文件存在,docker run命令会在卷挂载完成后将此
  前的所有文件复制到新挂载的卷中,注意这里的VOLUME不支持绑定挂载
  EXPOSE
  用于为容器打开指定要监听的端口以实现与外部通信
  Syntax
  EXPOSE [/] [[/] ...]
  用于指定传输层协议,可为tcp或udp二者之一,默认为TCP协议
  
  EXPOSE指令可一次指定多个端口,例如
  EXPOSE 11211/udp 11211/tcp
  ENV
  用于为镜像定义所需的环境变量,并可被Dockerfile文件中位于其后的其它指令
  (如ENV、ADD、COPY等)所调用
  调用格式为$variable_name或${variable_name}
  
  Syntax
  ENV   或 ENV = ...
  
  第一种格式中,之后的所有内容均会被视作其的组成部分,因此,一次只
  能设置一个变量;
  
  第二种格式可用一次设置多个变量,每个变量为一个"="的键值对,如果
  中包含空格,可以以反斜线(\)进行转义,也可通过对加引号进行标识;另
  外,反斜线也可用于续行;
  
  定义多个变量时,建议使用第二种方式,以便在同一层中完成所有功能
  RUN
  用于指定docker build过程中运行的程序,其可以是任何命令
  Syntax
  RUN  或
  RUN ["", "", ""]
  
  第一种格式中,通常是一个shell命令,且以“/bin/sh -c”来运行它,
  这意味着此进程在容器中的PID不为1,不能接收Unix信号,因此,当使用
  docker stop 命令停止容器时,此进程接收不到SIGTERM信号;
  
  第二种语法格式中的参数是一个JSON格式的数组,其中为要运行的命令,
  后面的为传递给命令的选项或参数;然而,此种格式指定的命令不会以
  “/bin/sh -c”来发起,因此常见的shell操作如变量替换以及通配符(?,*等)
  替换将不会进行;不过,如果要运行的命令依赖于此shell特性的话,可以将其替换
  为类似下面的格式。
  
  RUN ["/bin/sh", "-c", "", ""]
  注意:json数组中,要使用双引号
  CMD
  类似于RUN指令,CMD指令也可用于运行任何命令或应用程序,不过,二者的运行时间点不同
  
  RUN指令运行于映像文件构建过程中,而CMD指令运行于基于Dockerfile构建出的新映像
  文件启动一个容器时
  
  CMD指令的首要目的在于为启动的容器指定默认要运行的程序,且其运行结束后,容器也
  将终止;不过,CMD指定的命令其可以被docker run的命令行选项所覆盖
  
  在Dockerfile中可以存在多个CMD指令,但仅最后一个会生效
  
  Syntax
  CMD  或
  CMD [“”, “”, “”] 或
  CMD ["",""]
  
  前两种语法格式的意义同RUN
  第三种则用于为ENTRYPOINT指令提供默认参数
  ENTRYPOINT
  类似CMD指令的功能,用于为容器指定默认运行程序,从而使得容器像是一个
  单独的可执行程序
  
  与CMD不同的是,由ENTRYPOINT启动的程序不会被docker run命令行指定的
  参数所覆盖,而且,这些命令行参数会被当作参数传递给ENTRYPOINT指定
  指定的程序
  
  不过,docker run命令的--entrypoint选项的参数可覆盖ENTRYPOINT指令指定的程序
  Syntax
  ENTRYPOINT
  ENTRYPOINT ["", "", ""]
  
  docker run命令传入的命令参数会覆盖CMD指令的内容并且附加到
  ENTRYPOINT命令最后做为其参数使用
  
  Dockerfile文件中也可以存在多个ENTRYPOINT指令,但仅有最后一个会生效
  USER
  用于指定运行image时的或运行Dockerfile中任何RUN、CMD或ENTRYPOINT
  
  指令指定的程序时的用户名或UID默认情况下,container的运行身份为root用户
  
  Syntax
  USER |
  需要注意的是,可以为任意数字,但实践中其必须为
  /etc/passwd中某用户的有效UID,否则,docker run命令将运行失败
  HEALTHCHECK
  The HEALTHCHECK instruction tells Docker how to test a container
  to check that it is still working.
  
  This can detect cases such as a web server that is stuck in an
  infinite loop and unable to handle new connections, even though the
  server process is still running.
  
  The HEALTHCHECK instruction has two forms:
  HEALTHCHECK [OPTIONS] CMD command (check container health by
  running a command inside the container)
  
  HEALTHCHECK NONE (disable any healthcheck inherited from the
  base image)
  The options that can appear before CMD are:
  --interval=DURATION (default: 30s)
  --timeout=DURATION (default: 30s)
  --start-period=DURATION (default: 0s)
  --retries=N (default: 3)
  
  The command’s exit status indicates the health status of the container.
  The possible values are:
  0: success - the container is healthy and ready for use
  1: unhealthy - the container is not working correctly
  2: reserved - do not use this exit code
  
  For example
  HEALTHCHECK --interval=5m --timeout=3s \
  CMD curl -f http://localhost/ || exit 1
  SHELL
  The SHELL instruction allows the default shell used for the shell
  form of commandsto be overridden.
  
  The default shell on Linux is ["/bin/sh", "-c"], and on Windows is
  ["cmd", "/S","/C"].
  The SHELL instruction must be written in JSON form in a Dockerfile.
  
  Syntax: SHELL ["executable", "parameters"]
  
  The SHELL instruction can appear multiple times.
  
  Each SHELL instruction overrides all previous SHELL instructions,
  and affects all subsequent instructions.
  ARG
  The ARG instruction defines a variable that users can pass at
  build-time to the builder with the docker build command using the
  --build-arg = flag.
  
  If a user specifies a build argument that was not defined in the
  Dockerfile, the build outputs a warning.
  
  Syntax: ARG [=]
  
  A Dockerfile may include one or more ARG instructions.
  
  An ARG instruction can optionally include a default value:
  ARG version=1.14
  ARG user=windy
  ONBUILD
  用于在Dockerfile中定义一个触发器
  
  Dockerfile用于build映像文件,此映像文件亦可作为base image被另一个Dockerfile
  用作FROM指令的参数,并以之构建新的映像文件
  
  在后面的这个Dockerfile中的FROM指令在build过程中被执行时,将会“触发”创
  建其base image的Dockerfile文件中的ONBUILD指令定义的触发器
  
  Syntax
  ONBUILD
  
  尽管任何指令都可注册成为触发器指令,但ONBUILD不能自我嵌套,且不会触发FROM和
  MAINTAINER指令
  
  使用包含ONBUILD指令的Dockerfile构建的镜像应该使用特殊的标签,
  例如ruby:2.0-onbuild
  
  在ONBUILD指令中使用ADD或COPY指令应该格外小心,因为新构建过程的上下文在缺少指
  定的源文件时会失败
  使用harbor创建安装配置
  到github.com下载harbor程序解压
  官方文档里有向导教如何修改配置文件,将其requirement段修改完成后运行install.sh
  里边有几个安装选项建议修改
  1. 仓库保存位置  secretkey_path = /data
  2. hostname
  3. harbor_admin_password =
  4. db_password =
  即可完成基本的harbor搭建
  此程序是从网上会下载一些image启动成容器用来响应用户的操作如上传下载image等
  用此可以配置docker不再默认使用https来连接registry,或者将harbor的https启用
  #vi /etc/docker/daemon.json
  {
      "insecure-registries": [":80"]
  }
  注意虽然这样也可以使用,但是每次pull, push都需要指定端口为80,
  最好还是配置证书做成https
  总结
  1. docker是一个文本文件,里边的指令是docker daemon可以识别的指令,通过这些指令
  docker daemon通过从网上下载文本中所指定的依赖镜像作为基础镜像,然后再在其之上
  加一层可写层,开启运行为容器,然后将后续所给指令依次执行,然后再将其封装成一个
  用户所定义的镜像。




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-673480-1-1.html 上篇帖子: 《00001》关于Linux的历史 下篇帖子: linux常见命令
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表