热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

docker入门教程(三)Docker镜像

ps:镜像是Docker容器的基石,容器是镜像的运行实例,有了镜像才能启动容器。1.11hello-world-------最小的镜像hello-world是Docker

ps:镜像是Docker容器的基石,容器是镜像的运行实例,有了镜像才能启动容器。

 

1.11 hello-world ------- 最小的镜像

hello-world 是 Docker 官方提供的一个镜像,通常用来验证Docker是否安装成功

通常来说,我们希望镜像能提供一个基本的操作系统环境,用户可以根据需要安装和配置软件。

这样的镜像我们称作 base 镜像。

1.12 base镜像

base 镜像有两层含义:(1)不依赖其它镜像,从secrch 构建;

                                     (2)其他镜像可以以之为基础进行扩展;

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

我们以 CentOS 为例考察 base 镜像包含哪些内容。

下载镜像

docker pull centos 

查看镜像信息:如图

镜像大小不到200MB.

平时我们安装一个CentOS至少几个GB,怎么才200MB! 下面我们来解释这个问题

Linux操作系统由内核空间和用户空间组成,如图

1.rootfs

内核空间是kernel,Linux刚启动时会加载 bootfs 文件系统,之后 bootfs 会被卸载掉。

用户空间的文件系统是 rootfs,包含我们熟悉的 /dev ,proc,/bin 等目录。

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

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

2.base 镜像提供的是最小安装的 Linux 发行版

CentOS 镜像的 Dockerfile 的内容如下

FROM scratch

ADD centos-7docker.tar.xz /

CMD ["/bin/bash"]

第二行 ADD 指令添加到镜像的tar包就是CentOS 7 的rootfs。在制作镜像时,这个tar包会自动解压到 / 目录下,生成/dev,/proc,/bin 等目录

3.支持运行多种 Linux OS

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

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

所以 Docker 可以同时支持多种 Linux 镜像,模拟初多种操作系统环境,如下图所示

上图 Debian 和 BusyBox(一种嵌入式 Linux)上层提供各自的 rootfs,底层共用 Docker Host 的 Kernel。

这里需要说明的是:

1)base镜像只是在用户空间与发行版一致,Kernel 版本与发行版本是不同的。
例如 CentOS 7 使用3.x.x的kernel,如果Docker Host 是 Ubuntu 16.04,那么在 CentOS容器中使用的实际上是Host 4.x.x的kernel
root@ubuntu: ~# uname -r
4.4.0-31-generic    ①
root@ubuntu: ~#
root@ubuntu: ~# docker run -it centos    ②
[root@231ad31 /]# cat /etc/redhat-release 
CentOS Linux release 7.5.1804 (Core)    ③
 [root@231ad31 /]# uname -r
4.4.0-31-generic

①.Host Kernel 4.4.0-31
②.启动并进入容器。
③.验证容器是 CentOS 7。
④.容器的 Kernel 版本与 Host 一致
(2)容器只能使用 Host 的 Kernel,并且不能修改
ps:所有容器都共用 host 的 Kernel,在容器中没办法对nKernel 升级

3.1.3 镜像的分层结构

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

实际上,Docker Hub中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的。比如我们现在构建一个新的镜像,Dockerfile如下

FROM debian    ①
RUN apt-get install emacs    ②
RUN apt-get install apache2    ③
CMD ["/bin/bash"]    ④
①.新镜像不再是从 scratch 开始,而是直接在 Debian base 镜像上构建。
②.安装 emacs
③.安装 apache2.
④.容器启动时运行 bash

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

 为什么Docker镜像要采用这种分成结构呢?

 最大的一个好处就是:共享资源。

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

 如果多个容器共享一份基础镜像,当某个容器修改了基础镜像的内容,比如/etc 下的文件,这是其他容器的 /etc 是否也会被篡改?

 答案是不会!!! 

 修改会被限制在单个容器内

 容器的 Copy-on-Write特性:

 可写的容器层

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

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

所有对容器的改动,无论添加,删除,还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。

下面我们深入讨论容器层的细节。

镜像层数量可能会很多,所有镜像层会联合在一起组成一个统一的文件系统。如果不同层中有一个相同路径的文件,比如 /a,上层的 /a 会覆盖下层的 /a,也就是说用户只能访问到上层中的文件 /a。在容器层中,用户看到的是一个叠加之后的文件系统
(1.) 添加文件。在容器中创建文件时,新文件被添加到容器层中。
(2.) 读取文件。在容器中读取某个文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,打开并读入内存
(3.) 修改文件。在容器中修改已存在的文件时,Docker 会从上往下依次在各个镜像层中查找此文件。一旦找到,立即将其复制到容器层,然后修改之
(4.) 删除文件。在容器中删除文件时,Docker 也是从上往下依次在镜像层中查找此文件。找到后,会在容器层中记录下此删除操作。
只有当需要修改时才复制一份数据,这种特性被称作 Copy-on-write。可见,容器层保存的时镜像变化的部分,不会对镜像本身进行任何修改
这样就解释了之前的问题,容器层记录对镜像的修改,所有镜像层都是只读的,不会被容器修改,所以镜像可以被多个容器共享

推荐阅读
  • Docker网络基础探讨了如何通过高效的技术手段实现跨主机容器间的顺畅通信与访问。本文深入分析了Docker网络架构,特别是其在多主机环境下的应用,为Go语言开发者提供了宝贵的实践指导和理论支持。 ... [详细]
  • 本文探讨了将PEBuilder转换为DIBooter.sh的方法,重点介绍了如何将DI工具集成到启动层,实现离线镜像引导安装。通过使用DD命令替代传统的grub-install工具,实现了GRUB的离线安装。此外,还详细解析了bootice工具的工作原理及其在该过程中的应用,确保系统在无网络环境下也能顺利引导和安装。 ... [详细]
  • 如何将PHP文件上传至服务器及正确配置服务器地址 ... [详细]
  • 本文介绍了在Windows 10系统下使用VirtualBox虚拟机环境部署CentOS 7.2,并在其上安装Docker的具体步骤。针对宝塔面板在Docker容器中磁盘空间限制为8GB的问题,提供了详细的解决方案和优化建议,确保用户能够高效利用有限的存储资源。 ... [详细]
  • 深入探索Node.js新框架:Nest.js第六篇
    在本文中,我们将深入探讨Node.js的新框架Nest.js,并通过一个完整的示例来展示其强大功能。我们将使用多个装饰器创建一个基本控制器,该控制器提供了多种方法来访问和操作内部数据,涵盖了常见的CRUD操作。此外,我们还将详细介绍Nest.js的核心概念和最佳实践,帮助读者更好地理解和应用这一现代框架。 ... [详细]
  • RancherOS 是由 Rancher Labs 开发的一款专为 Docker 设计的轻量级 Linux 发行版,提供了一个全面的 Docker 运行环境。其引导镜像仅 20MB,非常适合在资源受限的环境中部署。本文将详细介绍如何在 ESXi 虚拟化平台上安装和配置 RancherOS,帮助用户快速搭建高效、稳定的容器化应用环境。 ... [详细]
  • 在Linux环境中,通过编写Shell脚本来实现自定义命令的创建与激活,能够极大地简化服务器上多个子系统的管理操作。例如,通过简单的命令如“tt”,即可快速查看各个应用程序的名称及其运行状态,从而提高系统维护的效率和便捷性。 ... [详细]
  • 前言: 网上搭建k8s的文章很多,但很多都无法按其说明在阿里云ecs服务器成功搭建,所以我就花了些时间基于自己成功搭建k8s的步骤写了个操作手册,希望对想搭建k8s环境的盆友有所帮 ... [详细]
  • 掌握 esrally 三步骤:高效执行 Elasticsearch 性能测试任务
    自从上次发布 esrally 教程已近两个月,期间不断有用户咨询使用过程中遇到的各种问题,尤其是由于测试数据托管在海外 AWS 上,导致下载速度极慢。为此,本文将详细介绍如何通过三个关键步骤高效执行 Elasticsearch 性能测试任务,帮助用户解决常见问题并提升测试效率。 ... [详细]
  • 在Ubuntu 20.04 Linux系统中部署Git的详细步骤与最佳实践
    在Ubuntu 20.04 Linux系统中部署Git时,首先确保您的操作系统版本正确,并已以具备sudo权限的用户身份登录。推荐使用APT软件包管理器进行安装,这是最简便且可靠的方法。此外,遵循最佳实践,如定期更新Git版本和配置全局设置,可以进一步提升使用体验和安全性。 ... [详细]
  • 本文介绍了使用 Python 编程语言高效抓取微博文本和动态网页图像数据的方法。通过详细的示例代码,展示了如何利用爬虫技术获取微博内容和动态图片,为数据采集和分析提供了实用的技术支持。对于对网络数据抓取感兴趣的读者,本文具有较高的参考价值。 ... [详细]
  • 在稀疏直接法视觉里程计中,通过优化特征点并采用基于光度误差最小化的灰度图像线性插值技术,提高了定位精度。该方法通过对空间点的非齐次和齐次表示进行处理,利用RGB-D传感器获取的3D坐标信息,在两帧图像之间实现精确匹配,有效减少了光度误差,提升了系统的鲁棒性和稳定性。 ... [详细]
  • 如何在Ubuntu系统中直接使用Snap安装软件
    Canonical与Opera Software近日宣布,基于Chromium的Opera浏览器现已作为Snap包提供给Ubuntu用户,显著提升了在Linux操作系统上的安装便捷性和兼容性。通过Snap,用户可以在Ubuntu系统中轻松安装和更新Opera浏览器,享受更流畅的浏览体验。此外,Snap的容器化特性还确保了应用的安全性和稳定性,为用户提供更加可靠的软件环境。 ... [详细]
  • 从用户转型为开发者:一场思维升级的旅程 | 专访 StarRocks Committer 周威
    从用户转变为开发者,不仅是一次角色的转换,更是一场深刻的思维升级之旅。本次专访中,StarRocks Committer 周威分享了他如何在这一过程中逐步提升技术能力与思维方式,为开源社区贡献自己的力量。 ... [详细]
  • Java 零基础入门:SQL Server 学习笔记(第21篇)
    Java 零基础入门:SQL Server 学习笔记(第21篇) ... [详细]
author-avatar
琳宝灬幸福
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有