Docker 的镜像原理

镜像是一种轻量级、可执行的独立软件包,用来打包运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码,运行时,库,环境变量和配置文件。

官方解释

UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

镜像加载原理

1. Docker镜像加载原理:

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。

bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

平时我们安装进虚拟机的CentOS都是好几个G,为什么docker这里才200M??

对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供 rootfs 就行了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别, 因此不同的发行版可以公用bootfs。

2. 为什么要采用分层结构?

最大的好处就是共享资源

特点:

Docker镜像都是只读的

当容器启动时,一个新的可写层被加载到镜像的顶部。

这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。

Docker镜像commit操作补充

docker commit 提交容器副本使之成为一个新的镜像

docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]

案例演示

从Hub上下载tomcat镜像到本地并成功运行

docker run -it -p 8080:8080 tomcat

-p 主机端口:docker容器端口

-P 随机分配端口

i:交互

t:终端

docker 的容器数据卷

就是相当与移动硬盘

1. 是什么

有点类似redis 里面的rdb 和aof文件

2. 能干什么

卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:

数据卷可在容器之间共享或重用数据

卷中的更改可以直接生效

数据卷中的更改不会包含在镜像的更新中

数据卷的生命周期一直持续到没有容器使用它为止

容器的持久化

容器间继承 + 共享数据

3. 数据卷

1. 直接命令添加

命令

docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名

查看数据卷是否挂载成功

docker inspect 容器ID

容器和宿主机之间的数据共享

容器停止退出后,主机修改后数据是否同步

开机会自动同步

命令带权限

docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名

Dockerfile 添加

镜像模板的描述文件,特定docekr的编写方法

根目录下新建mydocker文件夹并进入

可在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷

File构建

build后生成镜像

获得一个新镜像zzyy/centos

run容器

通过上述步骤,容器内的卷目录地址已经知道对应的主机目录地址哪??

主机对应默认地址

上面的命令不能一对多,所以需要下面这个

mkdir mydocekr

vim Dockerfile

# volume test

FROM centos

VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]

CMD echo "finished,--------success1"

CMD /bin/bash

docker build -f /mydocker/dockerfile -t firewine/centos1

docker run -it firewine/centos1

**如果没有指定,会自动生成相对应的地址**

Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied

++解决办法:在挂载目录后多加一个–privileged=true参数即可++

4. 数据卷容器

通俗来说:就是活动硬盘上面加活动硬盘,实现数据传递和依赖

总体介绍

以上一步新建的镜像Firewine/centos为模板并运行容器dc01/dc02/dc03

它们已经具有容器卷

/dataVolumeContainer1

/dataVolumeContainer2

容器间传递共享(–volumes-from)

先启动一个父容器dc01docker run -it --name dc01 firewine/centos

在dataVolumeContainer2新增内容

dc02 /dc03 继承dc01docker run -it --name dc02 --volumes-from dc01 zzyy/centos

继承 并且也是相互共享

回到dc01可以看到02/03各自添加的都能共享了

删除dc01,dc02修改后dc03可否访问

删除dc02后dc03可否访问

新建dc04继承dc03后再删除dc03

结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止

dockerFile 的解析

通过这个文件,可以build 获得一个自定义的镜像

1. dockerfile 是什么

dockerfile

是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本

构建三步骤

编写dockerfile 文件

docker build

docker run

文件什么样

FROM scratch

MAINTAINER The CentOS Project

ADD c68-docker.tar.xz /

LABEL name="CentOS Base Image" \

vendor="CentOS" \

license="GPLv2" \

build-date="2016-06-02"

# Default command

CMD ["/bin/bash"]

2. DockerFile构建过程解析

1. dockerfile 内容基础知识

每条保留字指令都必须为大写字母且后面要跟随至少一个参数

指令按照从上到下,顺序执行

#表示注释

每条指令都会创建一个新的镜像层,并对镜像进行提交

2. Docker执行Dockerfile的大致流程

docker从基础镜像运行一个容器

执行一条指令并对容器作出修改

执行类似docker commit的操作提交一个新的镜像层

docker再基于刚提交的镜像运行一个新容器

执行dockerfile中的下一条指令直到所有指令都执行完成

三个区别

Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;

Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时,会真正开始提供服务;

Docker容器,容器是直接提供服务的

3. DockerFile体系结构(保留字指令)

FORM

基础镜像,当前新镜像是基于哪个镜像的

MAINTAINER

镜像维护者的姓名和邮箱地址

RUN

容器构建时需要运行的命令

EXPOSE

当前容器对外暴露出的端口

WORKDIR

指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点

ENV

用来在构建镜像过程中设置环境变量

ADD

将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包

COPY

类似ADD,拷贝文件和目录到镜像中。

将从构建上下文目录中 的文件/目录复制到新的一层的镜像内的 位置

VOLUME

容器数据卷,用于数据保存和持久化工作

CMD

指定一个容器启动时要运行的命令

Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换

ENTRYPOINT

指定一个容器启动时要运行的命令

ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数

ONBUILD

当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发

BUILD

Both

RUN

FROM

WORKDIR

CMD

MAINTAINER

USER

ENV

COPY

EXPOSE

ADD

VOLUME

RUN

ENTRYPOINF

ONBUILD

.dockerignore

4. 案例

1. mycentos

自动定义centos 支持 以下功能

默认路径

vim

ifconfig

from centos

env mypath /usr/local

workdir $mypath

run yum -y install vim

run yum -y install net-tools

expose 80

cmd echo "=======success------"

cmd /bin/bash

构建镜像

docker build -t 新镜像名字:TAG

列出镜像变更历史

docker history 镜像名

2. 自定义tomcat

新建一个目录

将jdk和tomcat的压缩包 copy进来

编写dockerfile文件

build 一个新镜像

运行

docker run -d -p 9080:8080 --name myt9 -v /zzyyuse/mydockerfile/tomcat9/test:/usr/local/apache-tomcat-9.0.8/webapps/test -v /zzyyuse/mydockerfile/tomcat9/tomcat9logs/:/usr/local/apache-tomcat-9.0.8/logs --privileged=true zzyytomcat9

测试

FROM centos

MAINTAINER author

#把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下

COPY c.txt /usr/local/cincontainer.txt

#把java与tomcat添加到容器中

ADD jdk-8u171-linux-x64.tar.gz /usr/local/

ADD apache-tomcat-9.0.8.tar.gz /usr/local/

#安装vim编辑器

RUN yum -y install vim

#设置工作访问时候的WORKDIR路径,登录落脚点

ENV MYPATH /usr/local

WORKDIR $MYPATH

#配置java与tomcat环境变量

ENV JAVA_HOME /usr/local/jdk1.8.0_171

ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8

ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8

ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

#容器运行时监听的端口

EXPOSE 8080

#启动时运行tomcat

# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.8/bin/startup.sh" ]

# CMD ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh","run"]

CMD /usr/local/apache-tomcat-9.0.8/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out

如果存在错误,请指出

dockerfile 执行原理_docker笔记2_原理解析和dockerfile简单理解相关推荐

  1. 工作小笔记——对MLE和MAP的简单理解

    文章目录 前言 1. 问题描述 1.1 MLE 1.2 MAP 2. 简单通信系统的例子 2.1 MLE解调 2.2 MAP解调 3. 数据拟合 3.1 MLE的推导及其与最小二乘的关系 3.2 MA ...

  2. 自控原理学习笔记-反馈控制系统的动态模型(4)-频率特性函数Nyquist图及Bode图

    自控原理学习笔记 自控原理学习笔记专栏 文章目录 1.频率特性函数 1.1 图形表示方法: 1.2 零极点位置和暂态增益图 1.2.1 复轨迹曲线 1.2.3 例子 1.3 计算系统响应 2.开环频率 ...

  3. 自控原理学习笔记-系统稳定性分析(2)-环路分析及Nyquist-Bode判据

    自控原理学习笔记 自控原理学习笔记专栏 文章目录 3. 环路分析 3.1环路分析基本思想: 3.2 稳定程度的性能指标(相对稳定) 3.3 环路整形 4.Nyquist判据 4.1 与幅角原理关系 4 ...

  4. linux运维笔记:DNS解析IP地址的过程(dns解析的原理 )

    linux运维笔记:DNS解析IP地址的过程(dns解析的原理 ) 1.首先:说一下dns解析的流程,大家都知道,计算机之间只能通过ip相互通信,因为ip不好记,于是才使用dns服务器把域名解析为相应 ...

  5. Golang底层原理学习笔记(一)

    LCY~~Golang底层原理学习笔记 1 源码调试 go源代码地址:GitHub - golang/go: The Go programming language 1.1 源码编译 现在的go语言大 ...

  6. 斯坦福大学CS143编译原理课程笔记:1.编译器与解释器简介

    目录 前言 第一节课:编译器与解释器简介 线上与线下的概念 线上 线下 编译器与解释器的区别 编译器 解释器 FORTRAN 1结构 它包含五个阶段 1.词法 分析 2.语法解析 3.语义分析 4.优 ...

  7. Spring5底层原理 学习笔记(二)AOP篇

    文章目录 AOP实现之ajc编译器 AOP实现之agent类加载 AOP实现之动态代理 jdk动态代理 演示 模拟实现动态代理 动态生成代理类需要使用到asm的api,这里就不展开了 Jdk对于反射调 ...

  8. 计算机网路原理复习笔记

    计算机网路原理复习笔记 未看: 前两章 第四章路由聚合 第四章最长前缀匹配 SDN 3. 数据链路层 3.1 基本概念和功能概述 3.1.1 链路:是一条无源的点到点的物理线路段,中间没 有任何其他的 ...

  9. 朱娜斐编译原理复习笔记-北京工业大学软件学院

    朱娜婓编译原理学习笔记 说明 笔记大部分内容来自参考资料[1], 看了B站上中科大华保健老师的编译原理课视频(参考资料[2]),补充完善了DFA的代码表示.Hopcroft 算法.文法重写.LL(1) ...

最新文章

  1. 揭秘人工智能面试内容:8家国际巨头机器学习面试题目整理
  2. 智能车竞赛相关资料获取
  3. 请写出sfr和sbit的语句格式_单片机c语言的sbit和sfr
  4. Python常用模块之logging模块
  5. 没有调查就没有发言权
  6. Citrix VDI攻略之三:DDC安装及配置
  7. 在Eclipse中配置Tomcat7.0
  8. linux mint cinnamon_2019年最佳的8个Linux发行版
  9. 直接拿来用!盘点四款优秀的开源协作文本编辑器
  10. 写歌词的技巧和方法,写歌词的基本要求,歌词创作基本知识及注意事项,创作歌词的要点
  11. C语言实现输出九九乘法表
  12. Hololens开发笔记
  13. DataBricks从开源到商业化踩过的坑
  14. Anko Commons 教程
  15. python爬虫练习-爬取暖心小故事并实现定时邮箱发送
  16. 香港举办首个轮椅花车巡游 特首冀提升香港通达程度
  17. RK3588 实现温控风扇之pwm驱动调试(二)
  18. Lam/MPI 的使用简记
  19. 【SQL查询系列】子查询经典案例
  20. 日常检查和维护数据库

热门文章

  1. 面了十几家公司测试岗,无非就是这些老套路!
  2. 车牌识别应用搭建(含模型和源码)
  3. 论文已提交,如何添加或修改作者名单?(附信件模板)
  4. observer debugger 启动不了; erlang R17
  5. JS获取当前时间戳(10位数)
  6. 什么样的产品都会被山寨,最近和陌生人聊天很流行!!!Omegle
  7. android之设计模式六大原则
  8. 中国移动:中国5G产业发展与投资报告
  9. 计算机综合成绩怎么算6,高考分数是通过电脑阅卷怎么样算出成绩的
  10. 因特尔CPU i5和i7的区别在哪里,你知道ma?