【期末复习】Docker(4)

Docker期末复习-4

  • 4-1.写时复制(Copy on write)
  • 4-2.镜像和容器的转化
  • 4-2.生成镜像的方法
  • 4-3.Dockerfile及相关命令——大题
  • 4-4.端口映射

4-1.写时复制(Copy on write)

  1. 容器的工作流程与写时复制机制
    容器本身是一个基于内核的技术,在这上面会有一个最基础的镜像,下面会叠加很多层,比如这里有加Apache,会生成一个镜像,生成一个镜像以后,我们才会创建出这个容器也就是container,这个container是可以写的。
    这个就是镜像的分层:

    这个镜像分层所有的分层生成以后,它都是只读的,这些文件都是不允许修改的,如果想修改怎么去修改呢?你可以去上面累加。
    那么再累加的加这就是容器和镜像:
    生成容器以后,容器的这个层是可以进行读和写的,下面的这些层是不允许往里面写东西的,但是可以累加,就像累积木似的,一直加上去。

    最后就会生成这样的画面:
    容器是可写的,镜像是可读的。如果有很多镜像的话,比如本地主机有很多很多的镜像,很多的镜像有些层是可以共享的,可能,有些层他们之间是一样的,一样的话,这些层只会占用一个空间,这样比较节省空间。

    最终是这样的情况:
    Container and layers

    可以同个一个镜像,启动很多个容器,这些容器它共用的都是这一个镜像,它不像虚拟机似得,如果有一个虚拟机是500G,我又启动了一个,它又会占用500G,它的内存资源是非常消耗的,那么容器是共有这一个镜像,不会启动很多很多的容器,非常的省资源,这是docker容器的特点。
    这些就是Copy on write这个机制来实现的,就是往上面里加就会生成一个,然后再往上面叠加这样的情况。
  2. 写时复制小结:
    –多个容器共享镜像
    –启动不用单独复制镜像
    –只修改可读写层
    –减少对空间的占用和容器启动时间

4-2.镜像和容器的转化

【期末复习】Docker(4)_第1张图片

4-2.生成镜像的方法

  1. docker commit命令
    commit命令可以将一个容器固化为一个新的镜像。当需要制作特定镜像时,会进行修改容器的配置,如在容器中安装特定工具等,通过commit命令可以将这些修改保存起来,使其不会因为容器的停止而丢失。使用方法如下:
    docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
    提交保存时,只能选用正在运行的容器(即可以通过docker ps查看到的容器)来制作新的镜像。在制作特定镜像时,直接使用commit命令只是一个临时性的辅助命令,不推荐使用。官方建议用docker build命令结合Dockerfile创建和管理镜像。
  2. 使用dockerfile:build指令
    dockerfile其实本质是也是启动容器去commit,只是这些操作都是docker自动化去完成。

4-3.Dockerfile及相关命令——大题

基本结构
Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile来快速创建自定义的镜像。
Dockerfile由一行行命令语句组成,并且支持以#开头的注释行。
一般而言,Dockerfile主体内容分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
下面给出一个简单的示例:

# 指明所基于的镜像名称为centos
FROM centos
# 指定维护者的邮箱为[email protected]
MAINTAINER [email protected]
# 将复制nginx-1.12.2.tar.gz路径下的内容到容器中的/usr/local/src路径下
ADD nginx-1.12.2.tar.gz /usr/local/src
# 运行指定命令
RUN yum install -y gcc gcc-c++ glibc make
autoconf openssl openssl-devel
RUN yum install -y libxslt-devel -y gd gd-devel
GeoIP GeoIP-devel pcre pcre-devel
RUN useradd -M -s /sbin/nologin nginx

指令说明
Dockerfile中每一个指令就对应生成一个镜像,即每个指令对应一个镜像层。
Dockerfile的指令根据作用可以分为两种,构建指令和设置指令。构建指令用于构建image,其指定的操作不会在运行image的容器上执行;设置指令用于设置image的属性,其指定的操作将在运行image的容器中执行。

分类 指令 说明
配置/构建指令 ARG 定义创建镜像过程中使用的变量
FROM 指定所创建镜像的基础镜像
LABEL 为生成的镜像添加元数据标签信息
EXPOSE 声明镜像内服务监听的端口
MAINTAINER 指定维护者信息
ENV 指定环境变量
ENTRYPOINT 指定镜像的默认入口命令
VOLUME 创建一个数据卷挂载点
USER 指定运行容器时的用户名或UID
WORKDIR 配置工作目录
ONBUILD 创建子镜像时指定自动执行的操作指令
STOPSIGNAL 指定退出的信号值
HEALTHCHECK 配置所启动容器如何进行健康检查
SHELL 指定默认shell类型
操作/设置指令 RUN 运行指定命令
CMD 启动容器时指定默认执行的命令
ADD 添加内容到镜像
COPY 复制内容到镜像
  1. 配置/构建指令(配置镜像信息)
    ① FROM
    格式为FROM 或FROM :tag
    任何Dockerfile中第一条指令必须是FROM指令,且在同一个Dockerfile中创建多个镜像时,可以使用多个FROM指令。
    ② MAINTAINER
    格式为MAINTAINER
    指定维护者信息
    ③ ENV
    格式为:EVN
    用于指定环境变量,这些环境变量,后续可以被RUN指令使用,容器运行起来之后,也可以在容器中获取这些环境变量。
    例如
    ENV word hello
    RUN echo $word

  2. 操作/设置指令(具体执行操作)
    ① RUN
    格式为RUN 或 RUN [“executalbe”,“param1”,“param2”…]。注意后者指令会被解析为JSON数组,因此必须用双引号。前者默认在shell终端中运行命令,即/bin/sh -c;后者使用exec执行,不会启动shell环境。
    指定其他终端类型可以通过第二种方式实现,例如RUN ["/bin/bash","-c","echo hello"]
    ② CMD
    CMD用于指定容器启动时执行的命令。
    支持三种格式:
    CMD ["executable","param1","param2"]:使用exec执行,这是推荐的方式。
    CMD command param1 param2:在默认shell中执行,提供给需要交互的应用。
    CMD ["param1","param2"]:提供给ENTERYPOINT的默认参数。
    每个Dockerfile只能有一条CMD命令,多个CMD命令只执行最后一个。
    若容器启动时指定了运行的命令,则会覆盖掉CMD中指定的命令。
    ③ ADD
    添加内容到镜像。
    格式:ADD
    该命令将复制指定的路径下内容到容器中的路径中。
    其中可以是Dockerfile所在目录下的一个相对路径(文件或目录),也可以是一个URL或一个tar文件,tar文件会自动解压为目录。可以是镜像内绝对路径,或者相对于工作目录(WORKDIR)的相对路径。
    路径支持正则格式。
    ④ COPY
    复制内容到镜像。
    格式为:COPY
    复制本地主机的>(为Dockerfile所在目录下的一个相对路径,文件或目录)下内容到镜像中的。目标路径不存在时,会自动创建。
    路径同样支持正则格式。
    COPY与ADD指令功能相似,当使用本地目录为源目录时,推荐使用COPY。

4-4.端口映射

【期末复习】Docker(4)_第2张图片

你可能感兴趣的:(期末复习)