首页 > 编程知识 正文

docker构建镜像会覆盖吗,镜像分层概念

时间:2023-05-03 09:11:35 阅读:172666 作者:1601

在此,目录标题1、Docker镜像分层(1、Docker镜像Docker镜像的创建方法镜像分层原则镜像分层) 2、dockerfile结构) 3、dockerfile操作命令2、ssh dockerfile

一、 Docker镜像分层(1)概述Docker镜像APP联合发布的标准格式如何创建支持单个Docker容器的Docker镜像基于本地模板基于Docker文件的镜像分层策略创建了新的镜像层次镜像层,缓存为Dockerfil,并更改了发送的e命令。 复制的文件已更改,或者用于构建镜像的指定变量不同。 相应的镜像层将被禁用。 如果某个层的镜像缓存被禁用,后续的镜像层缓存也会被禁用。 如果将文件添加到一个层,然后在下一层将其删除,则镜像中将保留该文件

镜像层次1.(内核层)为由AUFS、LXC、bootfs )组成的上层镜像提供内核支持

AUFS是一种统一的文件系统,它使用同一Linux主机上的多个目录进行堆叠,以提供外部统一的文件系统。 AUFS利用这一特性,实现了Docker镜像分层的思想bootfs。 负责与内核进行交互的主要是内核的引导加载,在linux启动后立即加载bootfs文件系统,在Docker镜像的最底层加载bootfs。 此层次结构与经典的Linux/Unix系统类似,在完成boot加载程序和包含内核的boot加载后,整个内核都存在于内存中。 此时,内存使用权从bootfs传递给内核。 此时,系统将卸载引导文件系统(root file system )。 base images在bootfs上) base images (例如,在linux系统上包含/dev的/etc等标准目录和文件包含创建和启动操作系统所需的组件rootfs是lxc的早期内核引擎(如Ubuntu、CentOS等)与docker引擎对接并与之交互,docker提供了一些库文件和引导文件。 文件库本身内置了所需的lib库2.base image (基本/系统镜像层)。 创建运行镜像的操作系统环境

3.addimage (在其中执行run命令的镜像层)例如nginx镜像的yum安装模块或者nginx编译安装的命令使用镜像封装每个run并执行命令

4.Container (可读写执行层) )将以下镜像执行提供给文档客户端使用

总结

1.docker镜像层位于bootfs之上

2 .每一层的镜像可以是baseimage/back (操作系统环境变量) centos dbian等

3 .集装箱层(可写)位于顶层。 文档服务器提供给文档客户端

4 .容器层以下均为只读,docker将只读的FS层转换为image

为什么docker的centos镜像只有200M是因为它是小巧的操作系统。 rootfs可以很小。 我保证。 使用基础命令、工具和库就可以了。 因为基础是直接使用host的kernel,所以自己只需要提供rootfs继续。 由此可知,根据linux的检测版本,bootfs基本一致,rootfs存在差异,根据检测版本可以使bootfs通用化

补充

每当图发送到docker hub公共仓库时,只推送增量部分,因此在生产环境中执行镜像重新推送时增量部分只需控制在比较小的范围内即可

)二) dockerfileframework1.基本镜像信息(指定操作系统镜像是哪个镜像,哪个版本) )。

2 .维护者信息

3 .镜像操作命令

4 .启动容器时执行的命令

dockerfile每行支持一个指令,每个指令可以携带多个参数,并且支持使用以“#”开头的注释

(三) dockerfile操作命令含义FROM镜像指定新镜像所基于的操作系统镜像。 第一个命令必须是FROM命令。 每次创建镜像时,都需要FROM命令MAINTAINER名称,以指示新镜像的维护信息RUN命令将在基础镜像上执行该命令。 提交到新镜像,并在每次写入命令时创建镜像层。 CMD [“要运行的程序”、“参数1”和“参数2”命令启动容器时执行的命令或脚本(例如CMD [“run.sh”]”),Dockerfile中有一个CMD命令如果指定了多个,则只能执行最后一个EXPOSE端口号。 如果通过指定新镜像加载到Docker时打开的端口ENV环境变量的值并设置一个环境变量的值,则以后的RUN将使用ADD源文件/目录重定目标文件/目录将源文件复制到目标文件中源文件位于与Dockerfile相同的目录中,或者是URL,如果源文件是压缩包,则解压缩COPY源文件/目录

+ 目标文件/目录将本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录中VOLUME + [“目录”]在容器中创建一个挂载点(VOLUME ["/目录"] )USER + 用户名/UID指定运行容器时的用户(在编写mysql es mg数据库镜像文件时可能需要时用对用户授权)WORKDIR + 路径为下一步的RUN、CMD、ENTRYPOINT指定工作目录,相当于是一个临时的"CD",否则需要使用绝对路径ONBUILD + 命令指定所生成的镜像作为一个基础镜像时所要运行的命令HEALTHCHECK健康检查

CMD与ENTRYPOINT的区别
ENTRYPOINT类似于 CMD 指令,但其不会被 docker run 运行容器并且执行的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程,CMD相反,会被docker run指定命令覆盖
CMD和ENTRYPOINT可以联合使用
COPY与ADD的区别

在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>,ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定 二、编写ssh dockerfile mkdir sshcd sshdvim DockerfileFROM centos:7RUN yum -y updateRUN yum -y install openssh* net-tool lsof telnet passwdRUN echo '123456' | passwd --stdin rootRUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_configRUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_keyRUN sed -i '/^sessions+requireds+pam_loginuid.so/s/^/#/' /etc/pam.d/sshdRUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.sshEXPOSE 22CMD ["/usr/s机智的洋葱/sshd","-D"]#生成镜像docker build -t sshd:v1 。#启动容器并修改root密码dockers run -d -P sshd:v1ssh localhost -p 端口 三、tomcat的dockerfile FROM centos:7ADD apache-tomcat-9.0.16.tar.gz /optADD jdk-8u201-linux-x64.rpm /optWORKDIR /optRUN rpm -ivh jdk-8u201-linux-x64.rpmENV JAVA_HOME /usr/java/jdk1.8.0_201-amd64ENV CLASSPATH $JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jarENV PATH /usr/java/jdk1.8.0_201-amd64/机智的洋葱:$PATHRUN mv apache-tomcat-9.0.16 /opt/tomcatCMD ["/opt/tomcat/机智的洋葱/catalina.sh","run"]docker -d run -p 8080:8080 tomcat:v1#开启容器



四、nginx的dockerfile及其优化(减小镜像的大小) (一)常规写法 方法一:[root@localhost ~]#cd nginx[root@localhost nginx]#lsDockerfile nginx-1.12.0.tar.gz[root@localhost nginx]#vim Dockerfile FROM centos:7ADD nginx-1.12.0.tar.gz /optRUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make &> /dev/nullRUN useradd -M -s /s机智的洋葱/nologin nginxWORKDIR /opt/nginx-1.12.0RUN ./configure --prefix=/usr/local/nginx --user=nginx --group=nginxRUN make &> /dev/null && make install &> /dev/nullEXPOSE 80CMD ["/usr/local/nginx/s机智的洋葱/nginx","-g","daemon off;"]方法二:FROM centos:7MAINTAINER gtRUN yum -y install pcre-devel zlib-devel gcc gcc-c++ makeRUN useradd -M -s /s机智的洋葱/nologin nginxADD nginx-1.12.0.tar.gz /opt/WORKDIR /opt/nginx-1.12.0WORKDIR nginx-1.12.0RUN ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module && make && make installEXPOSE 80EXPOSE 443RUN echo "daemon off;">>/usr/local/nginx/conf/nginx.confADD run.sh /run.shRUN chmod 755 /run.shCMD ["/run.sh"]#调用脚本#编写CMD中的nginx启动命令脚本[root@localhost nginx1]#lsDockerfile nginx-1.12.0.tar.gz run.sh[root@localhost nginx1]#vim run.sh#!/机智的洋葱/bash/usr/local/nginx/s机智的洋葱/nginx


(二)nginx —dockerfile优化

1.将不需要输出的指令放入/dev/null文件黑洞中
2.减少RUN指令
3.多阶段构建

[root@localhost ~]#cd nginx3[root@localhost nginx3]#lsDockerfile nginx-1.12.0.tar.gz[root@localhost nginx3]#vim Dockerfile [root@localhost nginx3]#vim Dockerfile FROM centos:7ADD nginx-1.12.0.tar.gz /optWORKDIR /opt/nginx-1.12.0RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make &> /dev/null && yum clean all &>/dev/null && useradd -M -s /s机智的洋葱/nologin nginx &> /dev/null && ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx &> /dev/null && make &> /dev/null && make install &> /dev/null && rm -rf /mnt/nginx-1.12.0EXPOSE 80CMD ["/usr/local/nginx/s机智的洋葱/nginx","-g","daemon off;"]



多阶段构建

FROM centos:7 as buildADD nginx-1.12.0.tar.gz /optWORKDIR /opt/nginx-1.12.0RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make &> /dev/null && yum clean all &>/dev/null && useradd -M -s /s机智的洋葱/nologin nginx &> /dev/null && ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx &> /dev/null && make &> /dev/null && make install &> /dev/null && rm -rf /mnt/nginx-1.12.0FROM centos:7EXPOSE 80COPY --from=build /usr/local/nginx /usr/local/nginx#使用之前构建的环境CMD ["/usr/local/nginx/s机智的洋葱/nginx","-g","daemon off;"]

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。