-
镜像分层、容器数据卷理解
2019-09-02 14:40:33镜像分层:centos的镜像只有200M,但是tomcat的镜像却400多M,为什么?是因为镜像是分层结构,就像下图,tomcat的镜像中包含了其依赖的jdk、centos等资源,所以显得比较大。 容器数据卷理解 docker容器数据...镜像理解
镜像就像光盘,是个一系列文件的集合,包含了程序、配置及运行环境信息,属于联合文件系统。
镜像分层:centos的镜像只有200M,但是tomcat的镜像却400多M,为什么?是因为镜像是分层结构,就像下图,tomcat的镜像中包含了其依赖的jdk、centos等资源,所以显得比较大。
容器数据卷理解
docker容器数据卷可以看成使我们生活中常用的u盘,它存在于一个或多个的容器中,由docker挂载到容器,但不属于联合文件系统,Docker不会在容器删除时删除其挂载的数据卷。数据卷就是容器中的数据持久化的一种方式。
使用命令添加数据卷,需要参数v(volume的缩写),后接宿主机路径和容器路径的映射关系。
如果后跟ro,则表示只读。
docker -it -v /宿主机绝对路径:/容器内路径 镜像名 docker -it -v /宿主机绝对路径:/容器内路径:ro 镜像名
我们也可以使用DockerFile来添加容器卷,DockerFile就是对镜像模板的描述文件,如下描述了使用DockerFile添加容器卷的方法。
mkdir mydocker cd mydocker vim DockerFile #volume test FROM centos VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"] CMD echo "finished, ------------, success!" CMD /bin/bash docker build -f /mydocker/DockerFile -t haylen/centos . docker run -it haylen/centos docker inspect 运行的容器id
数据卷容器就是指挂在数据卷的容器,该容器可以作为父容器,被其他容器挂载,从而实现容器间数据的共享。
docker run -it --name dc01 haylen/centos docker run -it --name dc02 --volume-from dc01 haylen/centos docker run -it --name dc03 --volume-from dc01 haylen/centos
使用这种方式共享后,把dc01删除,其共享数据仍然存在。直至所有的dc都删除,否则容器卷都一直共享存在。
如果您喜欢这篇文章,别忘了点赞和评论哦!
-
Docker镜像分层和临时容器
2020-05-22 09:33:52镜像分层:对于已经构建过的镜像,修改Dockerfile文件后,再次构建只会对修改的部分进行执行,已经执行过的步骤并未修改的话会掠过。 临时容器:每执行一个步骤就会产生一个临时容器。镜像分层:对于已经构建过的镜像,修改Dockerfile文件后,再次构建只会对修改的部分进行执行,已经执行过的步骤并未修改的话会掠过。
临时容器:每执行一个步骤就会产生一个临时容器。
-
Docker 镜像分层 镜像文件系统 镜像大小 读写层 容器内进程
2020-07-05 12:29:15一个镜像可以创建N个容器 一个标准化的交付 一个不包含Linux内核而又精简的Linux操作系统 镜像层 镜像可以看成是由多个镜像层叠加起来的一个文件系统 ,镜像层也可以简单理解为一个基本的镜像,每个镜像层之间...镜像是什么?
- 一个分层存储的文件
- 一个软件的环境
- 一个镜像可以创建N个容器
- 一个标准化的交付
- 一个不包含Linux内核而又精简的Linux操作系统
镜像层
镜像可以看成是由多个镜像层叠加起来的一个文件系统 ,镜像层也可以简单理解为一个基本的镜像,每个镜像层之间通过指针的形式进行叠加。
根据上图,镜像层的主要组成部分包括镜像层ID、镜像层指针「指向父层」、元数据「Layer Metadata,包含了 Docker 构建和运行的信息和父层的层次信息」。只读层和读写层的组成部分基本一致,同时读写层可以转换成只读层「通过docker commit 操作实现」。
元数据(metadata)就是关于这个层的额外信息,它不仅能够让Docker获取运行和构建时的信息,还包括父层的层次信息。在docker主机中镜像层(image layer)的元数据被保存在名为”json”的文件中。
/var/lib/docker/graph/e809f156dc985.../json
镜像分层
镜像是一堆只读层的统一视角,镜像的大小 = 所有镜像层大小的总和,但镜像间可以共享相同的镜像层,因此docker时间占用的磁盘空间远远小于virtual size的总和。
镜像是分层构建的,Dockerfile中的每一条命令,都在Docker镜像中以一个独立镜像层的形式存在。例如以下Dockerfile:FROM ubuntu:14.04 ADD run.sh / VOLUME /data CMD ["./run.sh"]
通过docker build以上Dockerfile的时候。会在Ubuntu:14.04镜像基础上,加入三层独立的镜像,依次相应于三条不同的命令。镜像示意图如下:
在层级化管理的Docker镜像中。有不少层大小都为0。那些镜像层大小不为0的情况,归根结底的原因是:构建Docker镜像时,对当前的文件系统造成了改动更新。而改动更新的情况主要有两种:1. ADD或COPY命令:ADD或者COPY的作用是在docker build构建镜像时向容器中加入内容。如以上命令 [ ADD run.sh / ] ,新构建的那层镜像大小为文件run.sh的大小。
2. RUN命令:RUN命令的作用是在当前空的镜像层内执行一条命令,倘若执行的命令须要更新磁盘文件。那么全部的更新内容都在存储在当前镜像层中。例如:
[ RUN echo DaoCloud ] 命令不涉及文件系统内容的改动,故命令执行完之后当前镜像层的大小为0;
[ RUN wget http://abc.com/def.tar ] 命令会将压缩包下载至当前文件夹下,因此当前这一层镜像的大小为:对文件系统内容的增量改动部分,即def.tar文件的大小。联合文件系统
尽管终于镜像的大小是所有镜像层的累加,可是须要额外注意的是:Docker镜像的大小并不等于容器中文件系统内容的大小(不包含挂载文件,/proc、/sys等虚拟文件)。例如以下Dockerfile:
FROM ubuntu:14.04 ADD compressed.tar / RUN rm /compressed.tar ADD compressed.tar /
1.FROM ubuntu:镜像ubuntu:14.04的大小为200MB;
2.ADD compressed.tar /: compressed.tar文件为100MB,因此当前镜像层的大小为100MB,镜像总大小为300MB。
3.RUN rm /compressed.tar:删除文件compressed.tar,此时的删除并不会删除下一层的compressed.tar文件。仅仅会在当前层产生一个compressed.tar的删除标记,确保通过该层将看不到compressed.tar,因此当前镜像层的大小也为0。镜像总大小为300MB。
4.ADD compressed.tar /:compressed.tar文件为100MB,因此当前镜像层的大小为300MB+100MB。镜像总大小为400MB。
分析完成之后,我们发现镜像的总大小为400MB。可是假设执行该镜像的话,我们非常快能够发如今容器根文件夹下执行du -sh之后。显示的数值并不是400MB,而是300MB左右。基本的原因还是:联合文件系统的性质保证了两个拥有compressed.tar文件的镜像层,容器仅仅看到一个。
容器是什么?
容器(container)和镜像(image)的最主要区别就是容器加上了顶层的读写层。要点:容器 = 镜像 + 读写层,并且容器的定义并没有提及是否要运行容器。
COW技术
所有对容器的修改都发生在读写层,镜像并不会被修改,也即 COW(copy-on-write)技术。容器需要读取某个文件时,直接从底部只读层去读即可,而如果需要修改某文件,则将该文件拷贝到顶部读写层进行修改,只读层保持不变。
Running Container
运行状态的容器「Running Container」是由一个可读写的文件系统「静态容器」+ 隔离的进程空间和其中的进程构成的。
正是文件系统隔离技术使得Docker成为了一个前途无量的技术。一个容器中的进程可能会对文件进行修改、删除、创建,这些改变都将作用于可读写层(read-write layer)。
正如json文件一样,我们可以在主机的文件系统上找到这个新文件。docker run ubuntu touch happiness.txt
find / -name happiness.txt /var/lib/docker/aufs/diff/860a7b...889/happiness.txt
容器内进程
在容器内部我们可以使用 [ ps -ef ] 查看到容器内运行的进程,而在宿主机中也可以使用 [ docker container top containerId ] 在宿主机上查看到容器内的进程,只是他们的PID不同。
事实上,你在容器中看到的进程与你在宿主机中看到的进程其实是同一个。Docker项目帮助用户启动的进程是直接运行在主机OS中的,只不过在创建这些进程时,Docker为它们加上了各种各样的Namespace参数,使得他们只能看到和访问当前Namespace所限定的资源、文件、设备、状态,或者配置。参考文献
https://www.cnblogs.com/LangXian/p/10639936.html
https://www.cnblogs.com/claireyuancy/p/7029126.html
https://zhuanlan.zhihu.com/p/70424048
https://zhuanlan.zhihu.com/p/86890896
https://zhuanlan.zhihu.com/p/81683351 -
Docker容器的分层,镜像创建(基于已有镜像创建,基于本地模板创建,基于dockerfile创建),以及私有仓库的...
2020-12-01 00:19:29Docker容器的分层,镜像创建(基于已有镜像创建,基于本地模板创建,基于dockerfile创建),以及私有仓库的建立一,Docker镜像的分层二,Docker镜像的创建1,基于已有镜像创建2,基于本地模板创建3,基于dockerfile...Docker容器的分层,镜像创建(基于已有镜像创建,基于本地模板创建,基于dockerfile创建),以及私有仓库的建立
一,Docker镜像的分层
镜像制作必须要有一个基础镜像,不能直接去创建,然后添加一个执行脚本,再挂载一个数据卷,最后进行CMD指定容器运行的时候启动哪些指令。
镜像制作是一层一层堆叠上去的,分为四个阶段,每一层创建的时候会生成一个临时镜像,创建完成之后自动删除。如下所示:
- Dockerfile中的每个指令都会创建一个新的镜像层
- 镜像层将被缓存和复用
- 当dockerfile的指令修改了。复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效
- 某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效
- 镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件
二,Docker镜像的创建
- Docker镜像
- 应用发布的标准格式
- 支撑一个Docker容器的运行
- Docker镜像的创建方法
- 基于已有镜像创建
- 基于本地模板创建
- 基于dockerfile创建
删除镜像的时候如果镜像是在正在被使用,那么镜像是删除不了的,只有删除容器之后镜像才能被删除
1,基于已有镜像创建
- 将容器里面运行的程序及运行环境打包生成新的镜像
命令为:docker commit 选项 容器id/名称 仓库名称:标签
选项 含义 -m 说明信息 -a 作者信息 -p 生成过程中停止容器的运行 [root@tomcat1 ~]# docker ps -a //查看基于centos创建 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c21b520b7e79 centos:7 "/bin/bash" About a minute ago Up 2 seconds infallible_albattani [root@tomcat1 ~]# docker commit -m "new" -a "daoke" c21b520b7e79 daoke:new //创建 sha256:0e10c3b9843933deab3ed9aa580691d757de9e590cd7cd7606607bb6cfe472e1 [root@tomcat1 ~]# docker images //查看已创建 daoke REPOSITORY TAG IMAGE ID CREATED SIZE daoke new 0e10c3b98439 36 seconds ago 204MB nginx latest bc9a0695f571 32 hours ago 133MB tomcat latest e0bd8b34b4ea 7 days ago 649MB centos 7 8652b9f0cb4c 12 days ago 204MB [root@tomcat1 ~]# 不推荐此方式制作 查看已创建的镜像:docker images | grep daoke
2,基于本地模板创建
- 通过导入操作系统模板文件生成新的镜像
- 使用wget命令导入为本地镜像
wget
http://download.openvz.org/template
- 导入成功后可查看本地镜像信息
docker images | grep new
- 过程为:
1.导入本地镜像debian-7.0-x86-minimal.tar.gz 2.cat debian-7.0-x86-minimal.tar.gz | docker import - 镜像名:标签 3.docker images | grep 标签
cat debian-7.0-x86-minimal.tar.gz | docker import - daoke:debian
3,基于dockerfile创建
- dockerfile是由一组指令组成的文件
- dockerfile结构四部分
- 基础镜像信息
- 维护者信息
- 镜像操作指令
- 容器启动时执行指令
- Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以"#"号开头的注释
4,Dockerfile操作指令
指令 含义 FROM镜像 指定新镜像所基于的镜像,第一条指令必须为from指令,每创建一个镜像就需要一条FROM指令 MAINTAINER名字 说明新镜像的维护人信息 RUN命令 在所基于的镜像上执行命令,并提交到新的镜像中 CMD [ “要运行的程序”,“参数1",“ 参数2”] 指令启动容器时要运行的命令或者脚本,dockerfile只能有一条CMD命令,如果指定多条则只能最后一条被执行 EXPOSE端口号 指定新镜像加载到docker时要开启的端口 ENV 环境变量 变量值 指定一个环境变量的值,会被后面的RUN使用 ADD 源文件/目录 目标文件/目录 将源文件复制到目标文件,源文件要与dockerfile位于相同目录中,或者是一个URL COPY源文件/目录 目标文件/目录 将本地主机上的文件/目录复制到目标地点,源文件/目录要与dockerfile在相同的目录中 VOLUME[“目录“] 在容器中创建一个挂载点 USER用户名/UID 指定运行容器时的用户 WORKDIR路径 为后续的RUN、CMD、ENTRYPOINT指定工作目录 ONBUILD命令 指定所生成的镜像作为一个基础镜像时所要运行的命令 HEALTHCHECK 健康检查 过程为:
mkdir apache cd apache vim Dockerfile (Dockerfile名字不可更改) FROM centos:7 #维护镜像的用户信息 MAINTAINER This is chen #镜像操作指令安装apache软件 RUN yum -y update RUN yum -y install httpd #开启80端口 EXPOSE 80 #复制网址首页文件 ADD index.html /var/www/html/index.html #将执行脚本复制到镜像中 ADD run.sh /run.sh RUN chmod 755 /run.sh #启动容器时执行脚本 CMD ["/run.sh"] #########vim run.sh #和Dockerfile文件位于相同目录下 #!/bin/bash rm -rf /run/httpd/ * #删除进程文件 exec /usr/sbin/apachectl -D FOREGROUND #启动apache ########vim index.html #编辑首页文件 <h1>web test</h1> ######### 生成镜像 docker build -t httpd:centos . (注意别忘了末尾有".") ##########新镜像运行容器 docker run -d -p 1216:80 httpd:centos
最后测试;
三,私有仓库建立
######## 修改registries文件 docker pull registry // 创建私有仓库的前提,5000端口号 vim /etc/docker/daemon.json { "insecure-registries":["20.0.0.10:5000"], //添加 "registry-mirrors": ["https://pl01jex2.mirror.aliyuncs.com"] } systemctl restart docker docker create -it registry /bin/bash //创建registry容器 docker ps -a docker run -d -p 5000:5000 -v /data/resgistry:/tmp/resgistry registry //宿主机的/data/resgistry:/tmp/resgitry resgistry docker push 20.0.0.10:5000/httpd //更改标记为20.0.0.:5000/nginx docker push 20.0.0.10:5000/httpd //上传 curl -XGET http://20.0.0.10:5000/v2/_catalog //获取私有仓库列表查看日志文件 {"repositories":["httpd"]} docker pull 20.0.0.10:5000/nginx //测试私有仓库的下载
-
不会和容器一起启动_微服务中的容器技术Docker(二),Docker中的镜像分层
2021-01-15 13:37:15上一篇传送门《微服务中的容器技术---Docker(一),Docker的安装和使用》Docker镜像那么我们应该知道镜像和容器该如何区分了,这里就更形象地说明一下:Docker镜像是一个只读的Docker容器模板,含有启动Docker容器所需... -
理解Docker镜像分层
2020-07-09 14:58:40docker镜像的分层结构 容器的大小 修改时复制策略 copy-on-write (CoW) Copying makes containers efficient 关于base镜像 base 镜像有两层含义: 不依赖其他镜像,从 scratch 构建。 其他镜像可以之为基础进行扩展... -
Docker-(3)Docker容器的分层原理及镜像使用详解
2020-09-04 17:34:59一、什么是docker 镜像 就是把业务代码,可运行环境进行整体的打包 二、如何创建docker镜像: 现在docker官方共有仓库里面有大量的镜像,所以最基础的镜像,我们可以在公有仓库直接拉取,因为这些镜像都是原厂... -
【容器技术】Docker中的镜像分层技术详解
2016-11-16 13:27:53早在集装箱没有出现的时候,...并且到了另外一个码头需要转运的话,有了在集装箱以后,直接把它运送到另一个容器内即可,完全可以保证里面的货物是整体的搬迁,并且不会损坏货物本身。那么docker 镜像在IT行业中也扮演 -
Docker 什么是镜像以及镜像分层详解
2020-07-08 17:59:58镜像的分层结构 Docker 支持通过扩展现有镜像,创建新的镜像。实际上,Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的。比如我们现在构建一个新的镜像,Dockerfile 如下: ① ... -
容器学习 之 镜像的分层结构(六)
2018-11-30 16:15:06镜像的分层结构 Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的。比如我们现在构建一个新的镜像,Dockerfile 如下: 新镜像不再是从 scratch 开始,而是直接在 Debian base 镜像... -
第3天 Docker结构--华为云容器镜像服务构建构建镜像,下载镜像后docker容器运行镜像...
2018-12-06 21:53:00Docker结构 Docker的分层结构 ...用华为的容器镜像构建镜像并下载到云主机运行步骤 新建一个模板tank仓库 去华为云的容器镜像服务 https://console.huaweicloud.com/swr/?region=cn-north-1#/... -
Docker:镜像分层技术
2018-05-24 14:30:14每个镜像都可以分层很多个layer,每个layer都有它对应的ID和大小,比如一个ubuntu镜像有四层组成:镜像层都是只读的,不能往里面写数据。想写数据就需要在其上启动一层container layer,就是相当于把镜像启动成一个... -
如何理解Docker镜像分层?
2019-05-16 13:04:11docker镜像的分层结构 容器的大小 修改时复制策略 copy-on-write (CoW) Copying makes containers efficient 关于base镜像 base 镜像有两层含义: 不依赖其他镜像,从 scratch 构建。 其他镜像可以之为基础... -
Docker容器技术(三)——镜像的分层结构及构建
2020-05-07 12:08:22镜像的分层结构2. 镜像的构建 1. 镜像的分层结构 共享宿主机的kernel base镜像提供的是最小的Linux发行版 同一docker主机支持运行多种Linux发行版 采用分层结构的最大好处是:共享资源 2. 镜像的构建 docker commit ... -
企业12,Docker,的简单认识,镜像的倒入,容器的分层,镜像的构造,优化等。
2019-10-04 10:47:13[root@server1 Desktop]# docker history game2048:latest 分层结构,镜像构造的结构 IMAGE CREATED CREATED BY SIZE COMMENT 19299002fdbe 2 years ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "sed … 0B ... -
anaconda镜像源文件位置_由浅入深docker系列: (6)镜像分层
2020-12-28 10:21:29这篇文章我们简单聊聊 docker 的镜像分层。思考题在第四篇文章容器与虚拟机中,我们说到 docker 其实就是把可执行程序及其所有的依赖打包成镜像文件,然后调用宿主机内核接口运行容器。可以想象,像 ubuntu等基础... -
阿里云容器镜像服务:镜像层信息展示
2017-08-02 15:55:51容器镜像服务支持镜像层信息展示了,方便您观察Docker镜像的层列表以及镜像的层大小,更直观地了解您的镜像。 镜像 Docker镜像充分利用 Union FS 的技术,将其设计为分层存储的架构。所以严格来说,镜像并非是像一个... -
怎么修改docker镜像里的内容_由浅入深docker系列: (6)镜像分层
2020-11-20 12:15:02这篇文章我们简单聊聊 docker 的镜像分层。思考题在第四篇文章容器与虚拟机中,我们说到 docker 其实就是把可执行程序及其所有的依赖打包成镜像文件,然后调用宿主机内核接口运行容器。可以想象,像 ubuntu等基础... -
Docker容器镜像
2018-10-24 13:54:35如果想要开发一个基于python的应用,传统的开发方式中,首先要在本地操作系统中安装...image本身是一种分层的特殊格式文件,在取得安装了python运行时环境的基础层以后,按下来就是把我们自己开发的东西逐层打包进... -
镜像的分层结构 - 每天5分钟玩转容器技术(11)
2020-11-23 09:08:55镜像的分层结构 - 每天5分钟玩转容器技术(11) 原创CloudManCloudMan2017-05-06 第11篇 镜像的分层结构 Docker 支持通过扩展现有镜像,创建新的镜像。 实际上,Docker Hub 中 99% 的镜像都是通过在 base 镜像... -
大神教你如何构建 Fedora 容器镜像
2019-10-06 09:07:16随着容器和容器技术的兴起,...在看如何构建 Fedora 容器基础镜像(base image)之前,让我们定义基础镜像和分层镜像(layered image)。定义基础镜像的简单方法是没有父镜像层的镜像。但这具体意味着什么呢?这意味着基... -
Docker镜像与容器介绍,容器与镜像常用命令
2020-03-15 18:40:23目录: Docker镜像介绍 docker容器 ...docker镜像是一个分层存储的文件,一个镜像可以创建N个容器 可以这么理解,docker 镜像是 docker 容器的静态视角,docker 容器是 docker 镜像的运行状态。... -
Docker镜像(镜像的分层结构、构建、应用容器化及优化)
2021-01-25 22:51:50文章目录 1、salt-api 2、docker 安装 开启 配置 game2048 mario 3、镜像的分层结构 退出方式 分层 4、镜像的构建 构建镜像 dockerfile常用指令 5、应用容器化 镜像加速器 应用容器化 6、镜像的优化 1、salt-api ...
-
切场景,淡入淡出.rar
-
PHP题库1
-
智能驾驶新一轮芯片争夺战开启
-
为什么现在物质越来越丰富,人的幸福感反而越来越低?
-
纯手工生成 乡镇行政区划(街道行政区划) geojson 用于百度echart绘图 不断更新...
-
ARKit-CoreLocation:将AR的高精度与GPS数据的规模相结合-源码
-
在 Linux 上构建企业级 DNS 域名解析服务
-
Facebook产品设计总监:设计B端产品的4项基本原则
-
电影应用-源码
-
深信服负载均衡服务开发设计API接口文档.docx
-
时间序列数据库的秘密(二)——索引
-
基于Flink+Hudi构建企业亿级云上实时数据湖教程(PC、移动、小
-
SecureCRT 连接 GNS3/Linux 的安全精密工具
-
boostdesc_bgm,vgg_generated_48,qrcode.zip
-
Gradle入门
-
Amoeba 实现 MySQL 高可用、负载均衡和读写分离
-
如何把jupyter切换到其他配置好的conda虚拟环境和vscode导入conda环境
-
面试必备算法|图解堆排序(Python)
-
stm32C8T6串口通讯实验.zip
-
html2canvas.js