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容器中的内容方法

    修改已有docker容器中的内容方法

    这篇文章主要介绍了修改已有docker容器中的内容方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • docker中的环境变量使用与常见问题解决方案

    docker中的环境变量使用与常见问题解决方案

    这篇文章主要给大家介绍了关于docker中环境变量使用与常见问题解决方案的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用docker具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • 使用minikube安装k8s单节点集群方式

    使用minikube安装k8s单节点集群方式

    本文主要介绍了minikube的使用方法,包括安装、启动、镜像管理等步骤,minikube是一个专注于让Kubernetes更易于学习和开发的本地Kubernetes环境,支持在macOS、Linux和Windows上快速设置本地Kubernetes集群
    2024-10-10
  • Docker安装Oracle19c史上最全步骤

    Docker安装Oracle19c史上最全步骤

    本文主要介绍了Docker安装Oracle19c,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • Docker Compose详细介绍

    Docker Compose详细介绍

    Docker Compose是一个用于定义和运行多个Docker容器的工具。它可以让用户轻松地定义和管理多个容器的配置,并且可以通过简单的命令来启动、停止和重启这些容器。在本文中,我们将详细介绍Docker Compose的使用和功能
    2023-04-04
  • docker拉取乌班图并且ssh连接方式

    docker拉取乌班图并且ssh连接方式

    文章介绍了如何在Docker中拉取Ubuntu镜像并使用SSH连接到容器,首先,确保容器正在运行,然后使用`docker exec`进入容器,接着,安装并配置OpenSSH服务器,设置root密码,并配置SSH允许root登录,最后,映射端口以便从宿主机连接到容器的SSH服务
    2025-03-03
  • Docker容器网络更改的实现

    Docker容器网络更改的实现

    本文主要介绍了Docker容器网络更改的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • docker交叉编译工具链解读

    docker交叉编译工具链解读

    使用Docker容器进行交叉编译具有环境隔离、一致性、可移植性和简化配置等优势,以下是一个示例的Dockerfile,用于创建一个包含C++11 ARM交叉编译工具链的Docker容器,构建完成后,可以在容器中进行ARM交叉编译
    2024-12-12
  • docker-compose中的环境变量问题

    docker-compose中的环境变量问题

    这篇文章主要介绍了docker-compose中的环境变量问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Centos7下安装Docker Engine

    Centos7下安装Docker Engine

    这篇文章主要介绍了Centos7下安装Docker Engine的相关资料,非常不错,具有参考借鉴价值,需要的朋友参考下
    2016-12-12

最新评论