苹果容器Apple container是做什么用的?

一、Apple container是什么

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

Linux容器是一种特殊的进程

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

程序、进程又是什么

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

容器与虚拟机的对比图

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

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

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

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

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

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

  2. 启动GRUB等引导程序。

  3. 引导程序启动内核。

  4. 内核启动init程序。

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

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

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

  2. 启动第1号进程

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

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

image

命名空间

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

实际上,容器利用独立的命名空间,将一个个进程从其他进程的运行环境中分离出来,就创建了一个独立的运行环境。每个容器就有自己的PID(进程ID)、NET(网络)、IPC(进程内通信)、user(用户)、MNT(文件系统/挂载)、UTS。这些命名空间组成了我们所说的容器。
image

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

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

拉取Linux镜像后,通过Dockerfile安装必要的软件

编写Dockerfile(无后缀),内容如下:

FROM ubuntu:20.04

# 设置非交互模式
ENV DEBIAN_FRONTEND=noninteractive

# 更新包列表并安装必要软件工具
RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list && \
    apt update && \
    apt install -y \
    binutils build-essential sysstat

RUN apt install -y \
    golang python3-pil fio

RUN apt install -y --no-install-recommends python3-matplotlib

RUN apt install -y \
    qemu-kvm virt-manager libvirt-clients virtinst jq

RUN apt install -y \
    docker.io containerd libvirt-daemon-system

RUN adduser `id -un` libvirt
RUN adduser `id -un` libvirt-qemu
RUN adduser `id -un` kvm

# 容器启动时运行bash
CMD ["/bin/bash"]

构建Linux镜像:

container build -t my-ubuntu:1.0 .

运行容器:

container run -d --name ubuntu-container my-ubuntu:1.0

进入容器终端:

container exec -it ubuntu-container /bin/bash

这样,可以在 Ubuntu 20.04镜像中预装所必需的软件工具,并通过exec进入交互的环境来操作终端。
然后继续安装Linux软件工具了:

apt install strace

还有pstree:

apt install psmisc

挂载宿主机目录到容器内

在运行容器时,可以用-v--volume参数指定要挂载卷的路径映射:

container -d --name my-ubuntu -v ~/Projects:/app/code ubuntu:20.04 tail -f /dev/null

宿主机的~/Projects以读写模式挂载到容器中/app/code,也就是说容器可修改宿主机的文件。这样就解耦了。

下次怎样再进容器镜像

如果Mac电脑重启了,或者是退出了Linux终端,想再进Linux容器镜像,怎样再进呢?

container ls -a命令来查看所有容器,主要是查看容器的状态。

container ls -a
ID                IMAGE                                               OS     ARCH   STATE    ADDR
buildkit          ghcr.io/apple/container-builder-shim/builder:0.6.0  linux  arm64  running  192.168.64.2
ubuntu-container  my-ubuntu:1.0                                       linux  arm64  stopped

如果是stopeed的状态,执行启动的命令:container start ubuntu-container,然后再进容器镜像里面去:

container exec -it ubuntu-container /bin/bash

这样之前预装的软件包工具以及进行的用户设置都存在了,直接在终端操作就可以了。

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

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

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

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

posted on 2025-08-12 02:58  豆豆の爸爸  阅读(385)  评论(1)    收藏  举报