Skip to content

Dockerfile and Yaml Learning Report csd

YagoToasa edited this page Oct 19, 2019 · 1 revision

Dockerfile

参考资料:Dockerfile文件详解

Dockerfile 基本概念

  • docker可以通过读取Dockerfile中的指令来创建一个镜像文件;

  • Dockerfile是一个包含用于组合映像的命令的文本文件;

  • 用户可以使用``docker build -f /path/to/a/Dockerfile`根据Dockerfile中的命令自动构建一个镜像;

Dockerfile 基本结构

  1. 基础镜像信息
  2. 维护者信息
  3. 镜像操作指令
  4. 容器启动时执行指令

Dockerfile 常用指令

FROM

  • 指定基础镜像且必须为Dockerfile中的第一个命令
FROM <image>
# tag是某个特定版本的镜像
FROM <image>:<tag>
# digest是最新引入的一种ID,类似于唯一标识符
FROM <image>@<digest>

MAINTAINER

  • 维护者信息
MAINTAINER <name>

RUN

  • 构建镜像时执行的命令,每条RUN指令将在当前镜像的基础上执行命令,并提交为新的镜像
  • 可以使用\换行
  • RUN指令创建的中间镜像会被缓存,并在下一次构建中使用,若不像缓存可指定--no-cache
# 默认在shell终端中运行命令
# /bin/sh -c
RUN <command>
# 使用exec执行,不启动shell环境
RUN ["executable","param1","param2"]
# 在bash中运行
RUN ["/bin/bash","-c","echo hello"]
# 不缓存
docker build --no-cache

ADD

  • 将本地文件添加到容器中
  • tar类文件会自动解压,网络压缩资源不会被解压
  • 可以访问网络资源,与wget类似
# 不支持空格
# 源路径<src>可以是一个URL,也可以使用通配符
# 目标路径<dest>
ADD <src>... <dest>
# 用于支持包含空格的路径
ADD ["<src>",... "<dest>"] 

# 添加所有以myfile开头的文件
ADD myfile* /mydir/
# ?可匹配任意一个字符
ADD myfile?.txt /mydir/

# 相对路径
ADD myfile relativedir/
# 绝对路径
ADD myfile /absolutedir/

Copy

  • ADD类似但不会自动解压文件,也不能访问网络资源
COPY <src>... <dest>
COPY ["<src>",... "<dest>"]

CMD

  • 构建容器后调用/容器启动时执行的命令
# 执行可执行文件
CMD ["executable","param1","param2"]
# 执行shell命令
CMD command param1 param2
# 设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数
CMD ["param1","param2"]

ENTRYPOINT

  • 配置容器,使其可执行化,指定容器启动程序及参数
  • 配合CMD可省去"Application",只使用参数
  • docker run执行的命令不会覆盖ENTRYPOINT,而且docker run命令中指定的任何参数都会被当作参数再次传递给ENTRYPOINT
  • Dockerfile中只允许有一个ENTRYPOINT,当有多个时,只会执行最后的。
# 可执行文件
ENTRYPOINT ["executable", "param1", "param2"]
# shell内部命令
ENTRYPOINT command param1 param2

LABEL

  • 用于给镜像加元数据
LABEL <key>=<value> <key>=<value> <key>=<value> ...

# 一次指定多条,用空格分隔,以免生成多个中间镜像
LABEL version="1.0" description="这是一个Web服务器" by="IT笔录"

ENV

  • 设置环境变量
# 一次设置一个
ENV <key> <value>
# 一次设置多个
ENV <key>=<value> ...

EXPOSE

  • 指定和外界交互的端口
  • 仅声明容器打算使用什么端口,并不会自动在宿主机进行端口映射
EXPOSE <端口1> [<端口2>...] 

VOLUME

  • 用于指定持久化目录
VOLUME ["/path/to/dir"]
# 一个卷可以存在于一个/多个容器的指定目录
VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]

WORKDIR

  • 工作目录,类似于cd命令
  • 设置工作目录后,Dockerfile其后的命令都会在该目录下执行
  • 使用docker run运行时,可通过-w参数覆盖构建时所设置的工作目录
WORKDIR /path/to/workdir

USER

  • 指定运行容器时的用户名或UID,后续的RUN也会使用指定的用户
  • 使用docker run运行时,可通过-u参数覆盖所指定的用户
USER <user-name>:<group-id>

ARG

  • 用于指定传递给构建运行时的变量
ARG <name>[=<default value>]

ONBUILD

  • 用于设置镜像触发器
  • 当所构建的镜像被用作其他镜像的基础镜像,该镜像中的触发器将会被触发
ONBUILD [INSTRUCTION]

图解


Yaml

YAML:Yet Another Markup Language.

YAML文件后缀可为.yml也可为.yaml;

任何有效的JSON文件也都是一个有效的YAML文件;

YAML语法规则

  • 大小写敏感

  • 缩进表示层级关系,且允许使用空格

  • 相同层级元素左侧对齐

  • 注释用#开头;

  • 字符串无需引号标注;

  • map结构键值对用key:value表示,同一缩进的所有键值对属于同一个map;

  • 数组[]hash{}

  • 列表项- ,同一个列表中的多个项使用相同的缩进级别。

YAML结构类型(k8s)

  1. Lists
  2. Maps

Lists

apiVersion: v1
kind: Pod
metadata:
  name: kube-site
  labels: 
    app: web
spec: 
  containers:
  - name: front-end
    image: nginx
    ports: 
    - containerPort: 8080
  - name: flask-demo
    image: falskapp
    ports: 80

Maps

# labels、name、namespace同级
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    # 嵌套map
    k8s-app: kubernetes-dashboard
    addonmanger.kubernetes.io/mode: Reconcile
  name: kubernetes-dashboard
  namespace: kube-system

YAML格式Pod定义文件详解

  • 必要部分

    apiVersion:               # 版本号
    kind: Pod                 # 资源类型
    metadata:                 # 元数据
      name: String            # Pod名称
      namespace: String       # Pod所属的命名空间
    spec:                     # Pod的详细定义
      containers:             # Pod容器列表
      - name: String          # 容器名称
        image: String         # 容器的镜像名称
  • 完整定义

    apiVersion: v1                    #必选,版本号,例如v1
    kind: Pod                         #必选 可以是其他的类型比如Deployment、Service 但是下面的内容要自己改变
    metadata:                         #必选,元数据
      name: string                    #必选,Pod名称
      namespace: string               #必选,Pod所属的命名空间
      labels:                         #自定义标签
      - name: string                  #自定义标签名字
      annotations:                    #自定义注释列表
      - name: string
    spec:                             #必选,Pod中容器的详细定义
      containers:                     #必选,Pod中容器列表
      - name: string                  #必选,容器名称
        image: string                 #必选,容器的镜像名称
        imagePullPolicy: [Always | Never | IfNotPresent] #获取镜像的策略 Alawys表示下载镜像 IfnotPresent表示优先使用本地镜像,否则下载镜像,Nerver表示仅使用本地镜像
        command: [string]             #容器的启动命令列表,如不指定,使用打包时使用的启动命令
        args: [string]                #容器的启动命令参数列表
        workingDir: string            #容器的工作目录
        volumeMounts:                 #挂载到容器内部的存储卷配置
        - name: string                #引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名
          mountPath: string           #存储卷在容器内mount的绝对路径,应少于512字符
          readOnly: boolean           #是否为只读模式
        ports:                        #需要暴露的端口库号列表
        - name: string                #端口号名称
          containerPort: int          #容器需要监听的端口号
          hostPort: int               #容器所在主机需要监听的端口号,默认与Container相同
          protocol: string            #端口协议,支持TCP和UDP,默认TCP
        env:                          #容器运行前需设置的环境变量列表
        - name: string                #环境变量名称
          value: string               #环境变量的值
        resources:                    #资源限制和请求的设置
          limits:                     #资源限制的设置
            cpu: string               #Cpu的限制,单位为core数,将用于docker run --cpu-shares参数
            memory: string            #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
          requests:                   #资源请求的设置
            cpu: string               #Cpu请求,容器启动的初始可用数量
            memory: string            #内存清楚,容器启动的初始可用数量
        livenessProbe:                #对Pod内个容器健康检查的设置,当探测无响应几次后将自动重启该容器,检查方法有exec、httpGet和tcpSocket,对一个容器只需设置其中一种方法即可
          exec:                       #对Pod容器内检查方式设置为exec方式
            command: [string]         #exec方式需要制定的命令或脚本
          httpGet:                    #对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port
            path: string
            port: number
            host: string
            scheme: string
            HttpHeaders:
            - name: string
              value: string
          tcpSocket:                  #对Pod内个容器健康检查方式设置为tcpSocket方式
             port: number
           initialDelaySeconds: 0     #容器启动完成后首次探测的时间,单位为秒
           timeoutSeconds: 0          #对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
           periodSeconds: 0           #对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
           successThreshold: 0
           failureThreshold: 0
           securityContext:
             privileged:false
        restartPolicy: [Always | Never | OnFailure] #Pod的重启策略,Always表示一旦不管以何种方式终止运行,kubelet都将重启,OnFailure表示只有Pod以非0退出码退出才重启,Nerver表示不再重启该Pod
        nodeSelector: obeject         #设置NodeSelector表示将该Pod调度到包含这个label的node上,以key:value的格式指定
        imagePullSecrets:             #Pull镜像时使用的secret名称,以key:secretkey格式指定
        - name: string
        hostNetwork:false             #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
        volumes:                      #在该pod上定义共享存储卷列表
        - name: string                #共享存储卷名称 (volumes类型有很多种)
          emptyDir: {}                #类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值
          hostPath: string            #类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
            path: string              #Pod所在宿主机的目录,将被用于同期中mount的目录
          secret:                     #类型为secret的存储卷,挂载集群与定义的secre对象到容器内部
            scretname: string  
            items:     
            - key: string
              path: string
          configMap:                  #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
            name: string
            items:
            - key: string
              path: string

YAML格式Service定义文件详解

  • 必要部分

    apiVersion: v1              # 版本号
    kind: Service               # 资源类型
    metadata:                   # 元数据
      name: string              # Service名称
      namespace: string         # Service命名空间
    spec:                       # 详细描述
      selector: List            # Label Selector配置,选择具有指定label的Pod作为管理范围
      - key: value                     
      type: string              # Service类型
  • 完整定义

    apiVersion: v1                                     # 使用的对象描述规范版本
    kind: Service                                      # 对象类型为Service
    metadata:
      name: string                                     # 生成该Service对象的名称
      labels:                                          # 该Service对象具有的标签
        key: value
      namespace: string                                # 该Service所在的命名空间
    spec:                                             
      ports:                                           # 被选中Pod需要对外暴露的端口
      - port: int
        protocol: string                               # 端口所使用的协议
      selector:                                        # 选择后端Pod的标签依据
      - key: value

YAML格式Deployment定义文件详解

  • 完整定义

    apiVersion: v1                              # 版本号
    kind: Deployment                            # 资源类型
    metadata:                                   # 元数据
      name: string                              # Deployment名称
      labels:                                   # 自定义标签
      - name: string                            # 自定义标签名称
    spec:                                       # Deployment详细定义
      replicas: int                             # Pod的副本数量
      selector:
        matchLabels:
        - name: string
      template:                                 # Pod的模板
        ……