docker容器4 :docker存储和dockerfile相关指令

目录

一,docker存储

二,dockerfile相关内容

三,docker相关指令

dockerfile常用指令:

RUN指令-运行命令:

CMD指令-指定容器启动时默认执行的命令:

LABEL指令-向镜像添加标记(元数据)

ENV指定-指定环境变量

COPY指令-将源文件复制到容器

ADD指令-将文件复制到容器

ENTRYPOINT指令——配置容器的默认入口:

VOLUME指令——创建挂载点

USER指令——设置运行镜像时使用的用户名

SHELL指令——指定命令的shell格式


一,docker存储

docker存储;
docker存储驱动与联合文件系统:联合文件系统是一种为linux,FreeBSD和NetBSD操作系统设计的,将其他文件系统合并到一个联合挂载点的文件系统。
联合文件系统实际上是由存储驱动实现的,相应的存储驱动有aufs,overlay,overlay2,deveicemapper,btrfs,zfs,vfs等。

选择docker存储驱动的总体原则:
在最常用的场合使用具有有最佳整体性能和稳定性的存储驱动。
如果内核支持多个存储驱动,则docker会提供要使用的存储驱动的优先级列表。
优先使用linux发行版默认的存储驱动。
一些存储驱动要求使用特定格式的底层文件系统,这可能会限制选择。
选择存储驱动还要取决于工作负载的特性和所需的稳定性级别。

主流的docker存储驱动:
对于当前支持的linux发行版,overlay2存储驱动是首选,centos和RHEL的最新版本现在已经支持overlay2存储驱动,并将overlay2作为推荐的存储驱动。
对于docker 18.06或更早的版本aufs存储驱动是首选。
devicemapper存储驱动用于生产环境是需要配置为direct-lvm模式。
btrfs和zfs存储驱动对底层文件系统有用。
vfs存储驱动用于测试,适合那些没有“写时拷贝”的文件系统。
存储驱动的选择可能受到docker版本操作系统内核和发行版本的限制。


docker版本所支持的存储驱动:
docker引擎企业版和docker EE:支持存储驱动的决定性资源是产品兼容性矩阵,建议用户迁移到overlay2存储驱动。
docker CE:只有部分配置被测试过,并且操作系统的内核不可能支持每个存储驱动,最佳配置是使用带有支持overlay2存储驱动的内核的现代linux发行版,并且对于大量的工作负载要使用docker卷写入,而不是将数据写入容器的可写层。
docker for Mac和 windows
这两个版本仅用于开发,而不能用于生产环境,不支持定义存储驱动。


选择存储驱动需要考虑的其他事项:
适合工作负载:aufs,overlay和overlay2存储驱动的所有操作都在文件级而不是在块级。
块级存储驱动,在写入繁重的工作负载时表现的更好。
btrfs和zfs存储驱动需要更多的内存。
zfs存储驱动是高密度工作负载的理想选择。


检查当前的存储驱动:使用docker info
更改存储驱动会使得现有的容器和镜像不可访问。


使用overlay2存储驱动的要求:
doker版本的要求:docker EE 17.06.02-ee5或者更高的版本支持。
虽然docker CE版本支持 overlay存储驱动,但是建议使用overlay2存储驱动。
linux内核版本要求:4.0或更高版本的linux内核。
            RHEL或centos可使用3.10.0-514或更高版本的内核
            如果使用更低版本的内核,则可使用overlay存储驱动,但不推荐这样做。
底层文件系统要求:
    ext4
    xfs,但仅限于启用d_type的情形

docker安装默认使用overlay2存储驱动的情形:
    从Ubuntu 14.04版本开始支持overlay2存储驱动
    从centoss7.4版本开始,安装过程中建立的xfs文件系统开始支持d_type,安装docker默认使用的就是overlay2存储驱动。


容器使用overlay2存储驱动的读写机制:
读取文件:
    文件不存在于容器层:果该文件并不在容器层中,则从镜像层中读取。
    文件已存在于容器层:如果该文件已经存在于容器层中,而不存在镜像层中,则直接 从容器中读取。
    文件同时存在于容器层和镜像层:将读取镜像层中的文件版本。


写入或者修改文件:
    首次写入文件:容器首次写入现有文件,该文件不会存在于容器层,overlay2存储驱动执行一个copy_up操作将文件从镜像层复制到容器层。容器将更改的部分写入容器层中该文件的一个新复制。
    删除文件或目录:容器中一个文件被删除时,会在容器层中创建一个白化文件。
               容器中一个目录被删除时,会才容器层中创建一个不透明目录。
重命名目录:只有源和目的路径都位于顶层时才能对目录进行重命名,否则会返回EXDEV错误。

docker目录:docker根目录就是docker中存放镜像和容器的目录,默认是:/var/lib/docker
解决docker根目录所在磁盘空间和饱和问题通常采用docker根目录迁移这适合不同的docker存储驱动。
(1)停止docker
(2)在一个可用空间 足够大的磁盘或逻辑卷中创建新的docker存储目录/
(3)迁移/var/lib/docker 目录下的文件到/home/docker/lib目录。
(4)编辑docker服务单元文件/usr/lib/systemd/system/docker.service    
    在[service]节中的ExecStart定义语句末尾增加选项 --graph=/home/docker/lib
(5)重新加载systemd单元文件
(6)重新启动docker
(7)执行docker info命令查看当前docker的信息

默认在容器中创建的所有文件保存在可写的容器中这类存储的问题如下:
    此类存储只在容器的生命周期内存在,会随着容器的删除而被删除。
    如果主机上的其他进程需要访问容器中的数据,则会很难从容器中获取数据。
    容器的可写层与运行容器的主机紧密耦合,无法轻松地将数据转移到其他地方。
    写入容器的可写层需要docker存储驱动来管理文件系统。
卷有助于解决这些问题:
卷本质上是docker主机文件系统中的目录或文件,能够直接被挂载到容器的文件系统中。
对卷的读写操作会绕过存储驱动,并以本地主机的运行速度运行。

二,dockerfile相关内容

dockerfile:
dockerfile是由一系列指令和参数构成的脚本文件,每一条指令构建一层。
镜像的定制实际上是定制每一层所要添加的配置和文件/
dockerfile的格式:
#Comment
INSTRUCTION arguments
    INSTRUCTION 表示指令,不区分大小写,但是建议大写,arguments表示指令的参数。
    dockerfile文件必须以FROM指令开头,定义构建镜像的基础镜像。
    以“#” 开头的行都视为注释。
    docker可使用解析器指令escape设置转移符。

什么是构建上下文:
    上下文是由路径(本地文件系统上的目录)或一个URL(git仓库的位置)定义的一组文件。
    构建上下文以递归的方式处理,本地路径包括其中的任何子目录。URL包括仓库及其子模块。
    使用当前目录作为上下文的简单构建命令:
                            docker build.
镜像构建过程:
    构建过程中一开始将整个上下文递归地发送给守护进程。
    docker守护进程逐一运行docker中地指令,每条指令被独立执行并创建一个新镜像。
    只要可能,docker将重用过程中的中间镜像(缓存),以加速构建过程。

三,docker相关指令

dockerfile常用指令:


FROM指令:设置基础镜像:3种格式
FROM <image> [AS <name>]
FROM <image> [:<tag>] [AS <name>]
FROM  <image> [@<digest>] [AS <name>]
FORM指令为后续指令设置基础镜像,可以在同一个dockerfile文件中多次出现,以创建多个镜像层。
image参数指定任何有效的镜像,特别是可以从公有仓库拉取的镜像

RUN指令-运行命令:

2种格式
RUN <command>
RUN ["executable","param1","param2"]
第一种是shell格式,命令唉shell环境中运行
第二种是exec格式,不会启动shell环境。
RUN指令将当前镜像顶部的新层中执行命令,并提交结果。
exec格式可以避免shell字符转换
shell格式中的默认shell可以使用SHELL命令更改。

CMD指令-指定容器启动时默认执行的命令:

3种格式
CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2
第一种是首选的exec格式。
第二种提供给ENTRYPOINT指令的默认参数。
第三种是shell格式

LABEL指令-向镜像添加标记(元数据)

格式:
    LABEL <key>=<value> <key>=<value> <key>=<value> ...    
    每个标记(元数据)以键值对的形式表示。要在其中包含空格,应使用引号和反斜杠。
    一个镜像可以有多个标记。可以将多个标记合并到单个LABEL指令中以减少层数。
    基础镜像或父镜像中包含的标记会被镜像继承。

EXPOSE指令-声明容器运行时侦听的网络端口
格式:EXPOSE <port> [<port> ...]
EXPOSE 指令通知Docker容器在运行时侦听指定的网络端口。
EXPOSE指令不会发布端口,只是起到声明作用。


ENV指定-指定环境变量


ENV指令两种格式:
        ENV <key> <value>
        ENV <key>=<value> ...
        ENV指令以键值对的形式定义环境变量。
        第1种格式将单个变量设置为一个值。
        第2种格式允许一次设置多个变量,可以使用等号(=),而第1种形式不使用

COPY指令-将源文件复制到容器

    COPY指令的用法有以下两种格式:
        COPY [--chown=<user>:<group>] <src>... <dest>
        COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
    --chown选项只能用于构建Linux容器,不能在Windows容器上工作。
    COPY指令将指定的源路径(由<src>参数指定)的文件或目录复制到容器文件系统中指定的目的路径(由    <dest>参数指定)。
        可以指定多个源路径,但文件和目录的路径将被视为相对于构建上下文的源路径。
        目的路径是绝对路径,或者是相对于工作目录(由WORKDIR指令指定)路径。

ADD指令-将文件复制到容器

        ADD指令的用法有以下两种格式:
        ADD [--chown=<user>:<group>] <src>... <dest>
        ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
    它与COPY指令的功能基本相同,不同之处有两点:
        源可以使用URL指定。
        归档文件在复制过程中能够被自动解压缩。
        如果源是具有可识别的压缩格式的本地Tar归档文件,则将其解包为目录。来自远程URL的资源不会被解压缩。

ENTRYPOINT指令——配置容器的默认入口:

        ENTRYPOINT指令的用法有以下两种格式:
        ENTRYPOINT ["executable", "param1", "param2"]
        ENTRYPOINT command param1 param2
        第1种是首选的exec格式。
        第2种是shell格式。
    ENTRYPOINT指令用于配置容器运行的可执行文件。
    在Dockerfile中只有最后一个ENTRYPOINT指令会起作用。

VOLUME指令——创建挂载点

  VOLUME指令的语法格式如下:
        VOLUME ["/data"]
        VOLUME指令创建具有指定名称的挂载点,并将其标记为从本机主机或其他容器保留外部挂载的卷。

WORKDIR指令——配置工作目录
    WORKDIR指令的语法格式如下:
        WORKDIR /path/to/workdir
        WORKDIR指令为Dockerfile中的任何RUN、CMD、ENTRYPOINT、COPY和ADD指令设置工作目录。
        可以在一个Dockerfile文件中多次使用该指令。

USER指令——设置运行镜像时使用的用户名

USER指令的用法有以下两种格式:
    USER <user>[:<group>] or
    USER <UID>[:<GID>]
    USER指令设置运行镜像时使用的用户名(或UID)和可选的用户组(或GID)。
    用户没有主要组时,镜像(或下一条指令)将以root组的身份运行。

ARG指令——定义变量
    ARG指令的语法格式如下:
        ARG <name>[=<default value>]
        ARG指令定义一个变量(可称为构建时变量。
        一个Dockerfile文件可以包括一个或多个ARG指令。

SHELL指令——指定命令的shell格式

    SHELL指令的语法格式如下:
        SHELL ["executable", "parameters"]
        SHELL指令用于指定命令的shell格式以覆盖默认的shell。
        SHELL指令可以多次出现。每个SHELL指令覆盖所有先前的SHELL指令,并影响所有后续指令。

创建nginx镜像实例:

首先创建目录:mkdir dockerfile     cd dockerfile

vim dockerfile

vim index.html

 docker build -t mynginx .

  docker images

docker run -itd -P mynginx

docker ps -a

curl 192.168.10.1:32768

web界面访问:192.168.10.1:32768

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值