Docker 镜像分层及dockerfile 编写技巧

 更新时间:2022年01月17日 11:59:01   作者:一只小毛驴 呀  
Docker镜像是由特殊的文件系统叠加而成,镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件,这篇文章主要介绍了Docker 镜像分层及dockerfile 编写,需要的朋友可以参考下

docker镜像分层

分层介绍

Dockerfile中的每个指令都会创建一个新的镜像层

镜像层将被缓存和复用

当Dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效

某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效

镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件

Docker镜像原理

  • Docker镜像是由特殊的文件系统叠加而成
  • ·最底端是bootfs,并使用宿主机的bootfs
  • ·第二层是root文件系统rootfs,称为base image
  • ·然后再往上可以叠加其他的镜像文件
  • ·统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了 一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。
  • ·一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像成为基础镜像。
  • ·当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器。

1.base image:基础镜像
2.image:固化了一个标准运行环境,镜像本身的功能-封装一组功能性的文件,通过统一的方式,文件格式提供出来(只读)
3.container:容器层(读写)
4.docker-server 端
5.呈现给docker-client (视图)

镜像分层模型 

 dockerfile 编写

dockerfile操作指令

序号指令含义
1FROM 镜像指定新镜像所基于的镜像,第 条指必须为from指令,每创建一个镜像就需要一条from指令
2MAINTAINER 名字说明新镜像的维护人信息
3RUN 命令在所基于的镜像上执行命令,并提交到新的镜像中;docker内每执行一条命令都是run开头
4CMD["要运行的程序","参数1","参数2"]指令启动容器时要运行的命令或者脚本,Dockerfile只能有一条CMD命令, 如果指定多条则只能最后一条被执行
5EXPOSE 端口号指定新镜像加载到Docker时要开启的端口
6ENV 环境变量 变量值设置一个环境变量的值,会被后面的run使用
7ADD 源文件、目录 目标文件/目录具体识别压缩格式并且自动解压,将源文件复制到目标文件,源文件要与dockerfile位于相同目录中,或者一个URL
8COPY 源文件/目录 目标文件/目录将本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录中
9VOLUME ["目录"]在容器中创建一个挂载点
10USER 用户名/UID指定运行容器时的用户
11WORKDIR 路径为后续的RUN、CMD、ENTRYPOINT指定工作目录
12ONBUILD 命令指定所生成的镜像作为一个基础镜像时所要运行的命令
13HEALTHCHECK健康检查

ADD和copy区别

              ①Dockerfile中的COPY指令和ADD指令都可以将主机上的资源复制或加入到容器镜像中,都是在构建镜像的过程中完成的
              ②copy只能用于复制(节省资源)
              ③ADD复制的同时,如果复制的对象时压缩包,ADD还可以解压(消耗资源)
              ④COPY指令和ADD指令的唯一区别在于是否支持从远程URL获取资源。COPY指令只能从执行docker build所在的主机上读取资源并复制到镜像中。而ADD指令还支持通过URL从远程服务器读取资源并复制到镜像中
              ⑤满足同等功能的情况下,推荐使用COPY指令。ADD指令更擅长读取本地tar文件并解压缩

CMD和entrypoint区别

   一般还是会用entrypoint的中括号形式作为docker 容器启动以后的默认执行命令,里面放的是不变的部分,可变部分比如命令参数可以使用cmd的形式提供默认版本,也就是run里面没有任何参数时使用的默认参数。如果我们想用默认参数,就直接run,否则想用其他参数,就run 里面加参数。

尝试编写dockerfile文件 部署nginx


mkdir nginx
cd nginx/
vim Dockerfile 
 
FROM centos:7      #基于基础镜像
MAINTAINER nginx   #用户信息
RUN yum -y update   #安装依赖关系
RUN yum install -y pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx                     #创建用户
ADD nginx-1.12.0.tar.gz /usr/local/src                    #将源文件复制到目标文件,源文件要与 
                                                            Dockerfile位于相同目录中,或者是 
                                                             一个URL
 
VOLUME ["/usr/local/nginx/html"]                        #在容器中创建一个挂载点
WORKDIR /usr/local/src                                  #指定工作目录
WORKDIR nginx-1.12.0
RUN ./configure \
--prefix=/usr/local/nginx \--user=nginx \--group=nginx \--with-http_stub_status_module && make && make install
ENV PATH /usr/local/nginx/sbin:$PATH
EXPOSE 80                                                   #暴露端口
RUN echo "demon off;" >>/usr/local/nginx/conf/nginx.conf
CMD nginx

docker运行nginx为什么要使用 daemon off

docker运行nginx为什么要使用 daemon off

到此这篇关于Docker 镜像分层及dockerfile 编写的文章就介绍到这了,更多相关Docker 镜像分层内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Docker中数据卷(volume)管理的两种方式

    Docker中数据卷(volume)管理的两种方式

    数据卷有两种形式,一种是容器中的某个目录,它可以被别的容器引用,只要有一个容器引用了这个数据卷,数据就不会被删除;另一种数据卷是将容器中的数据卷和宿主机的目录进行挂载。 数据卷可以在多个容器之间共享,修改数据卷不会影响镜像
    2021-07-07
  • 部署OceanBase-ce全过程

    部署OceanBase-ce全过程

    这篇文章主要介绍了部署OceanBase-ce全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • Docker安装部署完全流程使用指南(Linux通用版)

    Docker安装部署完全流程使用指南(Linux通用版)

    Docker 是一种流行的开源容器化平台,它能够将应用程序及其依赖打包进轻量级、可移植的容器中运行,这篇文章主要介绍了Linux系统下Docker安装部署完全流程使用指南,需要的朋友可以参考下
    2026-04-04
  • docker中的volume和bind mount区别讲解

    docker中的volume和bind mount区别讲解

    这篇文章主要介绍了docker的volume和bind mount区别,介绍了volume 相对于bind mount的优点及volume操作,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • Docker镜像的导入导出的实现方法

    Docker镜像的导入导出的实现方法

    这篇文章主要介绍了Docker镜像的导入导出的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • docker-compose部署配置jenkins的详细教程

    docker-compose部署配置jenkins的详细教程

    这篇文章主要介绍了docker-compose部署配置jenkins的详细教程,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Docker 限制容器的 Block IO使用

    Docker 限制容器的 Block IO使用

    本篇文章主要介绍了Docker 限制容器的 Block IO使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-08-08
  • 解决使用Docker Compose管理容器的问题

    解决使用Docker Compose管理容器的问题

    在Docker Compose中,根据一个配置文件,将所有与应用系统相关的应用和对应的容器进行配置,再根据Docker Compose提供的命令进行启动,就可以解决上面说的多容器之间的复杂问题,感兴趣的朋友跟随小编一起看看吧
    2021-09-09
  • Docker部署前后端的实现步骤

    Docker部署前后端的实现步骤

    本文主要介绍了Docker部署前后端的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-04-04
  • 亲手教你Docker Compose安装DOClever的详细过程

    亲手教你Docker Compose安装DOClever的详细过程

    DOClever是一个可视化免费开源的接口管理工具,DOClever前后端全部采用了javascript来作为我们的开发语言。这篇文章主要介绍了Docker Compose安装DOClever的详细过程,需要的朋友可以参考下
    2021-09-09

最新评论