一、Apple container是什么

container是苹果公司出的一款容器工具。以轻量级虚拟机方式创建、运行Linux容器。那么,Linux容器又是什么呢?

Linux容器是一种特殊的进程

进程是运行中的程序,而Linux容器是进程中的一种,那Linux容器的特殊是这个进程由命名空间和cgroups来创造出来了一个“边界”。

程序、进程又是什么

程序是指令和数据的集合。进程是运行中的程序,而程序在不运行时都是安安静静地存放在磁盘中的。

容器与虚拟机的对比图

相信大家可能在介绍容器的文章中已经见过下面这个图:

这个图,让我们对容器的理解停留在软件层面上,容器比虚拟机要轻量。然后就止步,不能深入理解了。

虚拟机与容器到底有什么区别

以运行在Ubuntu 20.04的Linux为例来深入理解虚拟机与容器的区别。

先看看在虚拟机上启动Ubuntu 20.04都做了什么:

  1. 用宿主机的虚拟化软件启动虚拟机。之后所有处理都在虚拟机上进行的。

  2. 启动GRUB等引导程序。

  3. 引导程序启动内核。

  4. 内核启动init程序。

  5. init进程(一般就是systemd)启动各种服务。

再来看在容器上启动Ubuntu 20.04。是怎样启动的,也就两步:

  1. 有一个叫容器运行时的进程,要它创建容器

  2. 启动第1号进程

没了。启动速度上,容器没有虚拟机步骤1到3;访问硬件速度上,也不需要像虚拟机需要把控制权交给物理机那样操作。

虚拟机启动时间要十几秒,容器启动时间在1秒内。差距太大了!这就是两者的真正区别。

命名空间

内核的命名空间(namespace)机制是用于实现容器。也就是说,容器是通过利用命名空间机制来实现的。

实际上,容器利用独立的命名空间,将一个个进程从其他进程的运行环境中分离出来,就创建了一个独立的运行环境。每个容器就有自己独立的pid ns、user ns、mount ns。

Cgroups

看容器启动Ubuntu 20.04的步骤2中,容器内的第1号进程只不过是PID namespace让我们见到的情形,可以说是个干扰我们的“障眼法”。实际上宿主机它作为第100号进程与其他进程之间也都是平等竞争关系的。也就是说,第100号进程可能被其他进程占用CPU、内存资源,也可能它把所有资源都吃光。这系统资源被进程抢来抢去的情况。一个命名空间机制是没法限制的,命名空间机制是“隔离”,而cgroups就是“限制”。

cgroup用于限制进程的系统资源(如CPU、内存)分配使用的上限。cgroup(全称:Linux control group)以进程的分组(group)为单位对各种资源进行控制(control),这样限制的。

Docker实例

对于Docker容器,在执行docker run命令的参数指定分配给容器的资源:

docker run -it --cpu-period=100000 --cpu-quota=20000 ubuntu /bin/bash

然后,查看cgroups文件系统下的CPU子系统中“docker”这个控制组里面的资源限制文件内容:

cat /sys/fs/cgroup/cpu/docker/5d5c9f67d/cpu.cfs_period_us
100000
cat /sys/fs/cgroup/cpu/docker/5d5c9f67d/cpu.cfs_quota_us
20000

这意味着Docker容器分配给CPU只能使用20%的带宽。

因此,实际上在Docker的底层利用了内核的cgroup。

二、container的安装和启动

从github发布页面下载container-0.3.0-installer-signed.pkg

安装完成后,在iTerm终端用命令启动服务:

container system start

下载Linux镜像并运行

我下载的是Ubuntu 20.04镜像:

container pull ubuntu:20.04

这是从Docker hub上拉取的官方镜像。

后台运行容器:

container run -d --name my-ubuntu ubuntu:20.04 tail -f /dev/null

进入容器终端:

container exec -it my-ubuntu /bin/bash

这样,就可以在容器内进行操作了。

三、了解就这么多,足够了

苹果的container与现有的Docker容器方案不一样,可以在每个容器运行自己轻量级虚拟机。这款容器工具只能在Mac芯片上运行,使用场景有些小众了。虽然足够安全,性能上也很强。但毕竟是6月10号才出来的,现在才0.3版。

大家有Mac芯片电脑的可以用来跑个Linux。而不用花个大几万去云上虚拟机跑Linux了。

感谢大家的阅读我豆爸写的文章,我们下一篇文章再见。

苹果容器Apple container是做什么用的?的更多相关文章

  1. Docker中的三个基本概念容器(container)、镜像(image)和仓库(registry)之间有什么关系?

    Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序.库.资源.配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷.环境变量.用户等).镜像不包含任何动态数据,其内容在构建之 ...

  2. 洛谷 P3003 [USACO10DEC]苹果交货Apple Delivery

    洛谷 P3003 [USACO10DEC]苹果交货Apple Delivery 题目描述 Bessie has two crisp red apples to deliver to two of he ...

  3. 【曹工杂谈】Maven底层容器Plexus Container的前世今生,一代芳华终落幕

    Maven底层容器Plexus Container的前世今生,一代芳华终落幕 前言 说实话,我非常地纠结,大家平时只是用Maven,对于内部的实现其实也不关心,我现在非要拉着大家给大家讲.这就有个问题 ...

  4. spring容器加载完毕做一件事情(利用ContextRefreshedEvent事件)转

    关键字:spring容器加载完毕做一件事情(利用ContextRefreshedEvent事件) 应用场景:很多时候我们想要在某个类加载完毕时干某件事情,但是使用了spring管理对象,我们这个类引用 ...

  5. Bootstrap 容器(Container)及网格说明-(二)

    1.容器(Container) 2.网格 来自为知笔记(Wiz)

  6. iOS 容器控制器 (Container View Controller)

    iOS 容器控制器 (Container View Controller) 一个控制器包含其他一个或多个控制器,前者为容器控制器 (Container View Controller),后者为子控制器 ...

  7. Docker 入门(Mac环境)- part 2 容器(container)

    part-2 容器(container) 简介 Docker架构有三个层面,从高到低如下: stack(栈) services(服务) containers(容器) 现在接触的这些在容器这一层里,类似 ...

  8. spring容器加载完毕做一件事情(利用ContextRefreshedEvent事件)

    关键字:spring容器加载完毕做一件事情(利用ContextRefreshedEvent事件) 应用场景:很多时候我们想要在某个类加载完毕时干某件事情,但是使用了spring管理对象,我们这个类引用 ...

  9. docker中宿主机与容器(container)互相拷贝传递文件的方法

    转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/71425077 本文出自[我是干勾鱼的博客] 前面讲解过如何进入.退出docker ...

  10. 洛谷P3003 [USACO10DEC]苹果交货Apple Delivery

    P3003 [USACO10DEC]苹果交货Apple Delivery 题目描述 Bessie has two crisp red apples to deliver to two of her f ...

随机推荐

  1. ctf知识积累

    (1)url解码: python解码函数: from urllib.parse import unquote(quote:编码) url_code="" url_code1=unq ...

  2. windows系统部署minio

    下载 在官网下载exe https://dl.min.io/server/minio/release/windows-amd64/ 创建文件夹 把minio.exe放到一个文件夹里,然后同目录里再新建 ...

  3. VS下进行CUDA编译时error MSB3721相关的原因之一

    报错:"1>D:\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\BuildCustomization ...

  4. 「Log」做题记录 2024.1.1-2024.1.28

    \(2024.1.1-2024.1.7\) \(\color{blueviolet}{P1501}\) LCT 板子,链加链乘查询链和,断边加边. \(\color{black}{P4332}\) L ...

  5. 常用Dockerfile注意事项

    Dockerfile添加PATH生效 # 注意不要写= ENV CONDA_DIR /opt/anaconda3 ENV PATH $CONDA_DIR/bin:$PATH Dockerfile添加普 ...

  6. STM32深度学习实战

    STM32深度学习实战 1. 前言 ​ 本文主要记录基于 tensorflow 的简单模型在 stm32 上运行测试的调试记录,开发人员应对深度学习基础理论和 tensorflow 框架基础操作有一定 ...

  7. 巧用指标平台DataIndex,五步法轻松实现指标管理

    开发部门在做指标加工的全流程中,是否经常出现如下问题: · 业务部门看指标数据的时候,看到两个名称相似的指标,不清楚两个指标的差异性,来咨询开发部门指标计算口径,开发部门配合业务部门翻找代码,找出指标 ...

  8. DTMO直播预告丨ChunJun 2022年开源规划&支持异构数据源DDL转换与自动执行

    ​  DTMO DTMO(DTstack Meetup Online)是袋鼠云数栈技术团队2022年的全新开源项目技术分享活动,我们秉承着开源共享的理念,旨在为大家分享大家分享袋鼠云大数据开源项目家族 ...

  9. C# 遍历Enum( 枚举)

    Type enumType = typeof(Domain.Models.Entitys.PermissionEntity.PermissionTypeEnum);                   ...

  10. .net 文件上传

    文件上传(页面端) 1.文件上传必须用post提交 2.必须修改表中提交数据时的组织方式,即enctype="multipart/form-data",数据是以分隔符的方式提交的 ...