『 云原生·Docker』Docker镜像分层与Docker镜像操作(二)

这篇具有很好参考价值的文章主要介绍了『 云原生·Docker』Docker镜像分层与Docker镜像操作(二)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

系列文章目录

本系列主要分为以下六大部分,正在更新中,尽请期待!

  • 『 云原生·生之门』
  • 『 云原生·前置知识』
  • 『 云原生·Docker』
  • 『 云原生·Kubernetes』
  • 『 云原生·KubeSphere』
  • 『 云原生·DevOps』

🚩点击关注本专栏


提示:已经更新的或正在更新的文章前面打勾了哈!


前言

镜像是Docker三大核心概念中最重要的,自 Docker诞生之日起镜像就是docker社区最为热门得关键词。

那么镜像为什么会有如此高的热度呢?

一、镜像分层

1.Base镜像

Linux 操作系统由内核空间和用户空间组成,如下图所示:
『 云原生·Docker』Docker镜像分层与Docker镜像操作(二)

内核空间是 kernel,用户空间的文件系统是 rootfs。

对于 base 镜像来说,底层直接用 Host 的 kernel,自己只需要提供 rootfs 就行了。

而对于一个精简的 OS来说,rootfs 可以很小,只需要包括最基本的命令、工具和程序库就可以了。

相比其他 Linux 发行版,CentOS 的 rootfs 已经算臃肿的了,alpine 还不到10MB。我们平时安装的 CentOS 除了 rootfs 还会选装很多软件、服务、图形桌面等,需要好几个 GB 就不足为奇了。

base 镜像提供的是最小安装的 Linux 发行版,支持运行多种 Linux OS

所以,能称作 base 镜像的通常都是各种 Linux 发行版的 Docker 镜像,比如 Ubuntu、Debian、CentOS 等。

不同 Linux 发行版的区别主要就是 rootfs。

比如 Ubuntu 14.04 使用 upstart 管理服务,apt 管理软件包,而 CentOS 7 使用 systemd和 yum。这些都是用户空间上的区别,Linux kernel 差别不大。

所以 Docker 可以同时支持多种 Linux 镜像,模拟出多种操作系统环境。

2.镜像的分层结构

Docker 支持通过扩展现有镜像来创建新的镜像。

实际上,Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的。
『 云原生·Docker』Docker镜像分层与Docker镜像操作(二)
我们可以镜像可以分层很多个layer,并且他们都有大小和ID,我们可以看到这里有4个layer ID号,最终这个镜像是由他们layer组合而成,并且这个镜像它是只读的,它不能往里面写数据,如果想写数据怎么办呢?

我们会在镜像上启一层contain layer,其实就是相当于把镜像启动成一个容器,那么在容器这一层,我们是可写的。Copy-on-Write(写时拷贝,按需拷贝的机制)

写时复制的思想(摘录自维基百科):

写入时复制(英语:Copy-on-write,简称COW)是一种计算机程序设计领域的优化策略。其核心思想是,如果有多个调用者(callers)同时请求相同资源(如内存或磁盘上的数据存储),他们会共同获取相同的指针指向相同的资源,直到某个调用者试图修改资源的内容时,系统才会真正复制一份专用副本(privatecopy)给该调用者,而其他调用者所见到的最初的资源仍然保持不变。这过程对其他的调用者都是透明的(transparently)。此作法主要的优点是如果调用者没有修改该资源,就不会有副本(private copy)被建立,因此多个调用者只是读取操作时可以共享同一份资源

下载的时候只会下载子镜像最上面的一层,因为其它层已经有了,那么它可以做到一个节约空间的作用。

新镜像是从 base 镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层。

镜像分层最大的一个好处就是共享资源
比如说有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;同时内存中也只需加载一份base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

如果多个容器共享一份基础镜像,当某个容器修改了基础镜像的内容,比如 /etc 下的文件,这时其他容器的 /etc 是不会被修改的,修改只会被限制在单个容器内。这就是容器Copy-on-Write 特性。

二、创建镜像

1.基于已有镜像的容器

创建 Docker镜像的第一种方法是使用 docker commit命令。

可以将此想象为我们是在往版本控制系统里提交变更。我们先创建一个容器,并在容器里做出修改,就像修改代码一样,最后再将修改提交为一个新镜像。

我们修改了当前容器以后,可以把状态保存下来。这样就不用每次都创建一个新的容器,然后再次去安装。

需要注意的是,docker commit提交的只是创建容器的镜像与容器的当前状态之间有差异的部分,这使得该更新非常轻量。

练习:学习使用Commit定制一个镜像,要求学习者参照示例完成定制一个busybox:v1镜像,该镜像在busybox:latest的基础上,新增了一个hello.txt文件

# 新增了一个hello.txt文件
docker run --name container1 busybox touch hello.txt

#将对容器container1做出的修改提交为一个新镜像,镜像名为busybox:v1
docker commit container1 busybox:v1

2.基于本地模板导入

用户也可以直接从一个操作系统模板文件导入一个镜像,主要使用 docker import

要直接导入一个镜像,可以使用 OpenVZ提供的模板来创建,或者用其他已导出的镜像,或者用其他已经导出的镜像模板来创建。

附:OpenVZ模板下载地址:点击进入

例如,下载了ubuntu-18.04的模板压缩包,之后使用如下命令导入即可:

cat ubuntu-18.04-x86_64-minimal.tar.gz | docker import -ubuntu: 18.04

三、存入与载出镜像

1.存出镜像

如果要导出镜像到本地文件,可以使用 docker[ Image]save命令。

该命令支持 -o string- output string参数,导出镜像到指定的文件(stirng)中。

例如,导出本地的ubuntu:18.04镜像文件 ubuntu_18.04.tar,如下:

docker save -o ubuntu_18.04.tar ubuntu:18.04

之后,用户就可以通过复制 ubuntu18.04.tar文件将该镜像分享给他人。

2.载入镜像

可以使用 docker load将导出的tar文件再导入到本地镜像库。

支持-i string-input string选项,从指定文件(string)中读入镜像内容。

例如,从文件 ubuntu_18.04.tar导入镜像到本地镜像列表,如下所示:

docker load -i ubuntu_18.04.tar
或
docker load < ubuntu 18.04.tar

导入成功后,可以使用 docker images命令进行查看,与原镜像一致。

四、上传镜像

可以使用 docker push 命令上传镜像到仓库。

默认上传到 Docker Hub官方仓库(需要登录),用户在 Docker hub网站注册后可以上传自制的镜像。

例如,用户user上传本地的test:latest镜像,可以先添加新的标签user/test: latest,然后用docker push命令上传镜像。

#添加新的标签
docker tag test:latest user/test:latest
#上传镜像
docker push user/test:latest

第一次上传时,会提示输入登录信息或进行注册,之后登录信息会记录到本地~/. docker目录下。

看看本专栏文章有哪些吧!

本系列文章目录:

  • 『 云原生·生之门』
  • 『 云原生·前置知识』
  • 『 云原生·Docker』
  • 『 云原生·Kubernetes』
  • 『 云原生·KubeSphere』
  • 『 云原生·DevOps』

可以看出来本系列文章将会带你从-1到1的学习云原生的,一起加油吧!

总结

镜像是使用 Docker的前提,也是最基本的知识。所以大家一定要熟练镜像得相关基本操作,在后续章节,笔者将继续介绍 Docker镜像的操作技巧。文章来源地址https://www.toymoban.com/news/detail-459155.html

到了这里,关于『 云原生·Docker』Docker镜像分层与Docker镜像操作(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Docker 镜像解密:分层存储与构建原理多角度解析

    🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬

    2024年02月16日
    浏览(32)
  • 【Docker】Docker比虚拟机快的原因、ubuntu容器、镜像的分层概念和私有库的详细讲解

    🚀欢迎来到本文🚀 🍉个人简介:陈童学哦,目前学习C/C++、算法、Python、Java等方向,一个正在慢慢前行的普通人。 🏀系列专栏:陈童学的日记 💡其他专栏:C++STL,感兴趣的小伙伴可以看看。 🎁希望各位→点赞👍 + 收藏⭐️ + 留言📝 ​ ⛱️万物从心起,心动则万物动🏄

    2024年02月14日
    浏览(32)
  • 万字长文深入理解Docker镜像分层原理、容器数据卷、网络通信架构(Docker系列第2章,共3章)

    在执行docker pull时,会发现多个Pull complete 字样,就能体现分层,如果是一个文件,只会有一个Pull complete 。 概念:文件系统是计算机系统中用于组织和管理数据存储的一种方式。它定义了数据如何存储、命名、访问和修改的方式。 举例:如Windows自带的NTFS、FAT32、EXFAT,和L

    2024年04月14日
    浏览(26)
  • 云原生Docker镜像管理

    docker是一个go语言开发的应用容器引擎。 ①运行容器里的应用; ②docker是用来管理容器和镜像的一种工具。 #容器 与 虚拟机 的区别? 容器 虚拟机 所有容器共享宿主机内核 每个虚拟机都有独立的操作系统和内核 使用namespace隔离资源,使用cgroup限制资源的最大使用量 完全隔

    2024年02月08日
    浏览(24)
  • 【云原生】Docker镜像的创建

    创建镜像有三种方法,分别为【基于已有镜像创建】、【基于本地模板创建】以及【基于Dockerfile创建】。 (1)首先启动一个镜像,在容器里做修改  docker run -it --name web centos:7 /bin/bash     #启动容器  ​  yum install -y epel-release  #安装epel源  yum install -y nginx         #安装ng

    2024年02月03日
    浏览(28)
  • 【云原生丶Docker】Docker镜像常用命令大全

    镜像是Docker中最为核心也是最具创造性的概念!在理解Docker的核心概念文章中,我们理解了镜像的含义,下面让我们一起操作一些镜像,包括拉取、推送镜像等操作。 通过 docker image help 查看 Docker 支持的镜像命令有哪些。 通过 docker pull 命令拉取镜像。 镜像由镜像名字和标签

    2024年02月11日
    浏览(43)
  • 【云原生】Docker 详解(三):Docker 镜像管理基础

    镜像可以理解为应用程序的集装箱,而 Docker 用来装卸集装箱。 Docker 镜像含有启动容器所需要的文件系统及其内容,因此,其用于创建并启动容器。 Docker 镜像采用分层构建机制,最底层为 bootfs ,其上为 rootfs 。 bootfs :用于系统引导的文件系统,包括 bootloader 和 kernel ,容

    2024年02月13日
    浏览(69)
  • 【云原生 | Docker篇】Docker镜像(image)与服务

    镜像是Docker的三大组件之一。 Docker运行容器前需要本地存在对应的镜像,如果本地不存在,Docker会从镜像仓库下载。 下面主要从以下几个方面来了解docker镜像: 从仓库获取镜像 管理本地仓库的镜像 Docker命令使用 获取命令行帮助信息直接在命令行内输入docker命令后敲回车

    2024年02月02日
    浏览(29)
  • 【云原生】Docker基本原理及镜像管理

    目录 一、Docker概述 1.1 IT架构的演进: 1.2 Docker初始 1.3 容器的特点 1.4 Docker容器与虚拟机的区别 1.5 容器在内核中支持2种重要技术 1.6 Docker核心概念 1)镜像 2)容器 3)仓库 二、安装Docker 2.1 Yum安装Docker 2.2 查看Docker信息 三、Docker的镜像管理命令 3.1 搜索镜像 3.2 获取镜像(下

    2024年02月12日
    浏览(30)
  • 【云原生】Docker镜像的创建,Dockerfile

    创建镜像有三种方法,分别为【基于已有镜像创建】、【基于本地模板创建】以及【基于Dockerfile创建】。  通过导入操作系统模板文件可以生成镜像,模板可以从OPENVZ 开源项目下载,下载地址为:   openvz.org/ Download/template/precreated  联合文件系统(UnionFS )  Union文件系统是

    2024年02月15日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包