-
Notifications
You must be signed in to change notification settings - Fork 0
Dockerfile and Yaml Learning Report csd
YagoToasa edited this page Oct 19, 2019
·
1 revision
参考资料:Dockerfile文件详解
-
docker可以通过读取Dockerfile中的指令来创建一个镜像文件;
-
Dockerfile是一个包含用于组合映像的命令的文本文件;
-
用户可以使用``docker build -f /path/to/a/Dockerfile`根据Dockerfile中的命令自动构建一个镜像;
- 基础镜像信息
- 维护者信息
- 镜像操作指令
- 容器启动时执行指令
- 指定基础镜像且必须为Dockerfile中的第一个命令
FROM <image>
# tag是某个特定版本的镜像
FROM <image>:<tag>
# digest是最新引入的一种ID,类似于唯一标识符
FROM <image>@<digest>
- 维护者信息
MAINTAINER <name>
- 构建镜像时执行的命令,每条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
- 将本地文件添加到容器中
- 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/
- 与ADD类似但不会自动解压文件,也不能访问网络资源
COPY <src>... <dest>
COPY ["<src>",... "<dest>"]
- 构建容器后调用/容器启动时执行的命令
# 执行可执行文件
CMD ["executable","param1","param2"]
# 执行shell命令
CMD command param1 param2
# 设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数
CMD ["param1","param2"]
- 配置容器,使其可执行化,指定容器启动程序及参数
- 配合CMD可省去"Application",只使用参数
-
docker run
执行的命令不会覆盖ENTRYPOINT
,而且docker run
命令中指定的任何参数都会被当作参数再次传递给ENTRYPOINT
。 - Dockerfile中只允许有一个
ENTRYPOINT
,当有多个时,只会执行最后的。
# 可执行文件
ENTRYPOINT ["executable", "param1", "param2"]
# shell内部命令
ENTRYPOINT command param1 param2
- 用于给镜像加元数据
LABEL <key>=<value> <key>=<value> <key>=<value> ...
# 一次指定多条,用空格分隔,以免生成多个中间镜像
LABEL version="1.0" description="这是一个Web服务器" by="IT笔录"
- 设置环境变量
# 一次设置一个
ENV <key> <value>
# 一次设置多个
ENV <key>=<value> ...
- 指定和外界交互的端口
- 仅声明容器打算使用什么端口,并不会自动在宿主机进行端口映射
EXPOSE <端口1> [<端口2>...]
- 用于指定持久化目录
VOLUME ["/path/to/dir"]
# 一个卷可以存在于一个/多个容器的指定目录
VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]
- 工作目录,类似于
cd
命令 - 设置工作目录后,Dockerfile其后的命令都会在该目录下执行
- 使用
docker run
运行时,可通过-w
参数覆盖构建时所设置的工作目录
WORKDIR /path/to/workdir
- 指定运行容器时的用户名或UID,后续的RUN也会使用指定的用户
- 使用
docker run
运行时,可通过-u
参数覆盖所指定的用户
USER <user-name>:<group-id>
- 用于指定传递给构建运行时的变量
ARG <name>[=<default value>]
- 用于设置镜像触发器
- 当所构建的镜像被用作其他镜像的基础镜像,该镜像中的触发器将会被触发
ONBUILD [INSTRUCTION]
YAML:Yet Another Markup Language.
YAML文件后缀可为.yml
也可为.yaml
;
任何有效的JSON文件也都是一个有效的YAML文件;
-
大小写敏感;
-
缩进表示层级关系,且只允许使用空格;
-
相同层级元素左侧对齐;
-
注释用
#
开头; -
字符串无需引号标注;
-
map结构键值对用
key:value
表示,同一缩进的所有键值对属于同一个map; -
数组用
[]
、hash用{}
; -
列表项用
-
,同一个列表中的多个项使用相同的缩进级别。
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
# 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
-
必要部分
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
-
必要部分
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
-
完整定义
apiVersion: v1 # 版本号 kind: Deployment # 资源类型 metadata: # 元数据 name: string # Deployment名称 labels: # 自定义标签 - name: string # 自定义标签名称 spec: # Deployment详细定义 replicas: int # Pod的副本数量 selector: matchLabels: - name: string template: # Pod的模板 ……