当前位置:首页 >> 中医保健 >> 在 MacOS 上运行 Docker 太晚!

在 MacOS 上运行 Docker 太晚!

发布时间:2023-04-30

是name ephemeral busybox sh -c "sleep 300"d0b02322a9eef184ab00d6eee34cbd22466e7f7c1de209390eaaacaa32a48537➜ ~ # Inspect a container to find the host PID.➜ ~ docker inspect 便是format '{{ .State.Pid }}' d0b02322a9eef184ab00d6eee34cbd22466e7f7c1de209390eaaacaa32a48537515584➜ ~ # Find the host path of the container filesystem (in this case is a btrfs volume)➜ ~ sudo cat /proc/515584/mountinfo | grep subvolumes906 611 0:23 /@/var/lib/docker/btrfs/subvolumes/b237a173b0ba81eb0a60d35b59b0cc5ed[truncated]➜ ~ # Read the container filesystem from the host.➜ ~ sudo ls -ltr /var/lib/docker/btrfs/subvolumes/b237a173b0ba81eb0a60d35b59b0cc5ed7247423bed4b4dcbb5af57a1c3318ebtotal 4lrwxrwxrwx 1 root root 3 Nov 17 21:00 lib64 -> libdrwxr-xr-x 1 root root 270 Nov 17 21:00 libdrwxr-xr-x 1 root root 4726 Nov 17 21:00 bindrwxrwxrwt 1 root root 0 Dec 5 22:00 tmpdrwx便是便是便是 1 root root 0 Dec 5 22:00 rootdrwxr-xr-x 1 root root 16 Dec 5 22:00 vardrwxr-xr-x 1 root root 8 Dec 5 22:00 usrdrwxr-xr-x 1 nobody nobody 0 Dec 5 22:00 homedrwxr-xr-x 1 root root 0 Dec 10 18:37 procdrwxr-xr-x 1 root root 0 Dec 10 18:37 sysdrwxr-xr-x 1 root root 148 Dec 10 18:37 etcdrwxr-xr-x 1 root root 26 Dec 10 18:37 dev➜ ~ # Now write something from the container and see if it's reflected on the host filesystem.➜ ~ docker ps -lCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESd0b02322a9ee busybox "sh -c 'sleep 300'" 4 minutes ago Up 4 minutes ephemeral➜ ~ docker exec -it d0b02322a9ee touch hello-from-container➜ ~ sudo ls -ltr /var/lib/docker/btrfs/subvolumes/b237a173b0ba81eb0a60d35b59b0cc5ed7247423bed4b4dcbb5af57a1c3318eb | grep hello-rw-r便是r便是 1 root root 0 Dec 10 18:42 hello-from-container➜ ~ # Now write something from the host to see reflected on the container.➜ ~ sudo touch /var/lib/docker/btrfs/subvolumes/b237a173b0ba81eb0a60d35b59b0cc5ed7247423bed4b4dcbb5af57a1c3318eb/hello-from-the-host➜ ~ docker exec -it d0b02322a9ee sh -c "ls | grep hello-from-the-host"hello-from-the-host➜ ~ # Stop the container.➜ ~ docker stop d0b02322a9ee➜ ~ sudo ls -ltr /var/lib/docker/btrfs/subvolumes/b237a173b0ba81eb0a60d35b59b0cc5ed7247423bed4b4dcbb5af57a1c3318ebtotal 4lrwxrwxrwx 1 root root 3 Nov 17 21:00 lib64 -> libdrwxr-xr-x 1 root root 270 Nov 17 21:00 libdrwxr-xr-x 1 root root 4726 Nov 17 21:00 bindrwxrwxrwt 1 root root 0 Dec 5 22:00 tmpdrwx便是便是便是 1 root root 0 Dec 5 22:00 rootdrwxr-xr-x 1 root root 16 Dec 5 22:00 vardrwxr-xr-x 1 root root 8 Dec 5 22:00 usrdrwxr-xr-x 1 nobody nobody 0 Dec 5 22:00 homedrwxr-xr-x 1 root root 0 Dec 10 18:44 sysdrwxr-xr-x 1 root root 0 Dec 10 18:44 procdrwxr-xr-x 1 root root 148 Dec 10 18:44 etcdrwxr-xr-x 1 root root 26 Dec 10 18:44 dev-rw-r便是r便是 1 root root 0 Dec 10 18:45 hello-from-the-host➜ ~ # Filesystem still exists until it is just stopped, but now let's remove it.➜ ~ docker rm ephemeralephemeral➜ ~ sudo ls -ltr /var/lib/docker/btrfs/subvolumes/b237a173b0ba81eb0a60d35b59b0cc5ed7247423bed4b4dcbb5af57a1c3318ebls: cannot access '/var/lib/docker/btrfs/subvolumes/b237a173b0ba81eb0a60d35b59b0cc5ed7247423bed4b4dcbb5af57a1c3318eb': No such file or directory

以上信息真是明:

1. 盖子在接入和中断状态下,肠道但会为其分摊一个内存。

2. 删除盖子,关联的内存也但会被删除。

如今我们对 Docker 管理机构内存的方式为有了简洁了解,很非常容易看得出来如果能够合适的数据库发挥作用层,适用盖子就但会有非常大的风险,这就是我们适用卷的因素。

初始所谓挂有载

正如Docker文件格式的历史文献:“Docker 从一时期就开始背书初始所谓挂有载。与卷相比,初始所谓挂有载的基本功能受限。我们可以通过初始所谓挂有载,将肠道上的文件格式或数据库库挂有载到盖子。初始所谓挂有无需指定肠道上的绝对轨迹。相比之下,适用卷但会在肠道的 Docker 存储数据库库里面创设一个上新数据库库,并由 Docker 管理机构数据库库。”

如果想在盖子内初始所谓挂有载PC的数据库库,才可接入以下请求:

docker run -v :

后面,我们来看看初始所谓挂有载实际的接入持续性:

相信你已经注意到情况了:初始所谓挂有载容许在盖子内挂有载肠道的内存,你可以想象在普通用户和盖子错综复杂有一个API,这但会让一切都更加非常复杂。

初始所谓挂有载的管理机构工作方式为粗略如下:

当你从 Mac 挂有载某个轨迹时,实际上是在承诺 Linux API挂有载 Mac 上的网络对等内存的轨迹。

一般来真是,你不无需手动特设这个繁琐的配有,领域该软件可以想尽设法你自动完成。

你可以按照如右方式为查看挂有载到 Docker 桌面版上的文件格式或数据库库:

Preferences -> Resources -> File sharing

如上图所示,我们将本地轨迹 /Users 等挂有载到了 Linux 的API上,因此,我们也可以像本地数据库库一样挂有载 Mac 数据库库:

➜ ~ docker run 便是rm -it -v /Users/paolomainardi:$(pwd) alpine ash 2/ # ls -ltr 3total 60 4drwxr-xr-x 12 root root 4096 May 23 2022 var 5drwxr-xr-x 7 root root 4096 May 23 2022 usr 6drwxrwxrwt 2 root root 4096 May 23 2022 tmp 7drwxr-xr-x 2 root root 4096 May 23 2022 srv 8drwxr-xr-x 2 root root 4096 May 23 2022 run 9drwxr-xr-x 2 root root 4096 May 23 2022 opt10drwxr-xr-x 2 root root 4096 May 23 2022 mnt11drwxr-xr-x 5 root root 4096 May 23 2022 media12drwxr-xr-x 7 root root 4096 May 23 2022 lib13drwxr-xr-x 2 root root 4096 May 23 2022 home14drwxr-xr-x 2 root root 4096 May 23 2022 sbin15drwxr-xr-x 2 root root 4096 May 23 2022 bin16dr-xr-xr-x 13 root root 0 Dec 11 14:33 sys17dr-xr-xr-x 260 root root 0 Dec 11 14:33 proc18drwxr-xr-x 1 root root 4096 Dec 11 14:33 etc19drwxr-xr-x 5 root root 360 Dec 11 14:33 dev20drwxr-xr-x 3 root root 4096 Dec 11 14:33 Users21drwx便是便是便是 1 root root 4096 Dec 11 14:33 root22/ # ls -ltr /Users/paolomainardi/23total 424drwxr-xr-x 4 root root 128 Dec 18 2021 Public25drwx便是便是便是 4 root root 128 Dec 18 2021 Music26drwx便是便是便是 5 root root 160 Dec 18 2021 Pictures27drwx便是便是便是 4 root root 128 Dec 18 2021 Movies28drwxr-xr-x 4 root root 128 Dec 18 2021 bin29drwxr-xr-x 4 root root 128 Dec 31 2021 go30-rw-r便是r便是 1 root root 98 Apr 1 2022 README.md31drwxr-xr-x 5 root root 160 Apr 3 2022 webapps32drwx便是便是便是 6 root root 192 Nov 12 16:50 Applications33drwxr-xr-x 3 root root 96 Nov 28 21:23 Sites34drwxr-xr-x 14 root root 448 Nov 28 22:22 temp35drwx便是便是便是 105 root root

正如 Docker 文件格式历史文献:

卷是发挥作用所谓 Docker 盖子转换成和适用的数据库的除此以外机制。虽然初始所谓挂有载主要依赖于肠道的数据库库结构和操作该系统,但卷显然由 Docker 管理机构。与初始所谓挂有载相比,卷有几个低成本。

卷的几个低成本:

卷比初始所谓挂有载非常非常容易备份或迁至。

你可以适用 Docker CLI 请求或 Docker API 管理机构卷。

卷可用于 Linux 和 Windows 盖子。

卷可以非常确保地在多个盖子错综复杂对等。

卷驱动程序容许你将卷存储在远程PC或幽提供商上,以加密卷的内容或添加其他基本功能。

上新卷的内容可以由盖子预先填满。

Docker 桌面版上的卷比 Mac 和 Windows PC上的初始所谓挂有载具有非常高的机动性。

如上所述,卷相对于初始所谓挂有的劣势是显而易唯,尤其是终于一点,但其小得多的实用性是共同Linux玩游戏。卷的其设计初衷那时候就不是充分利用这个期望,因此适用它们来进行编程的高难度来得大。

后面,我们来演示一下如何适用卷,我将依序展示:

1.在 localhost 上顺利完成并接入一个用 node 付诸的 API;

2.在肠道上完成整个共同开发过程;

3.创设一个 Docker 卷;

4.适用 Docker 卷创设盖子;

5.在具有卷的盖子内推行共同开发管理机构工作处理过程。

你确实已经注意到了,卷小得多的实用性是盖子皆所来作的任何非常改都能够适用 docker cp 插入盖子内。

虽然在盖子里面配置 VI 可以减轻这个情况,但是这样就能够访问期间我自己的配有文件格式(以点开头的文件格式),也没人设法适用我喜欢的 VSCode。

卷与初始所谓挂有载

通过上述辩论,我们可以得出两个论点:

1.初始所谓挂有载是在盖子内行进文件格式时最纯净的方式为,但当 Docker 涡轮在API里面接入时,它们但会遇到内存对等导致的严重的机动性情况。

2.卷的机动性远超初始所谓挂有载,但共同开发的高难度较大(例如本地GUI能够注意到盖子皆的文件格式)。

来得显然符合

为了演示卷与初始所谓挂有载对机动性的阻碍有多大,我创设了一个有趣的次测试基本功能:在一个空概念其设计(create-react-app)上接入一些 npm install 次测试。

生态:

上层:macOS - Docker 桌面版 - 启用 virtioFS

上层:Linux

次测试(npm 配置):

1.PC上的原生节点;

2.能够初始所谓挂有载或卷的 Docker;

3.引入初始所谓挂有载的 Docker,但只有 node_modules 引入卷;

4.引入初始所谓挂有载的 Docker。

我们可以注意到机动性阻碍的结果:当仅适用初始所谓挂有载时,macOS 的加速但会增高 3.5 倍将近(适用 gRPC Fuse 时但会增高 10 倍),“罪魁祸首”是 node_modules 数据库库(只是一个什么都没人来作的 React 领域就有 3.7 万个文件格式,占有了 328M)。将此数据库库(node_modules)行进到卷里面,消耗的等待时间就与 Linux 不相上下了,约为 7.65 秒。

右边,我们以 Node 为例,但其他共同开发生态该系统受到的阻碍粗略相同,而对于还除此以外数十万个小文件格式的数据库库来真是,机动性大部分是灾难。

解决情况

以上,我们对各个组件及其管理机构工作方式为来作了有趣地解说,紧接著的情况是:为了在 Mac 上适用 Docker 时拿到较差机动性和共同Linux玩游戏,推荐方式为是什么?

现在来看,正确就是适用 Docker Desktop for Mac 加上 VirtioFS,这样可以在机动性和共同Linux玩游戏错综复杂的一个很好的折衷,虽然终于呈现的加速比 Linux 慢,但在大多数持续性下,二者的差异可以远大于。

在适用 Node 或 PHP 共同开发上新概念其设计时,你不但会每次都才行重上新配置 node_modules 或 vendor,这种持续性很少唯,如果真是遇到这种持续性,就无需花费非常多的等待时间。

不过无需记下以下几点:

这是一款腾讯公司上新产品;

你无需适用授权,显然一致取决于适用持续性;

由于这是一项非常一上新关键技术,因此即便如此实际上许多情况。

那么,我们确实有哪些并不需要呢?

初始所谓挂有载 + 卷

正如后面的结果所示,这是拿到吻合原生机动性的最佳方式,但但会给共同Linux玩游戏导致严重的情况。

让我们看一个例子:

我们能够从PC上注意到盖子正在加载的文件格式,这是一个很小的情况,因为它但会阻碍我们撰写该软件的方式为以及 IDE 阐释我们处理代码库的方式为。如何解决这个情况?显然一致亦同一个人的共同开发习惯而定。

端口GUI的普通用户

你只无需一个盖子,其里面还除此以外你所无需的GUI和领域该软件,然后挂有载文件格式和代码,就可以享受到近乎原生的玩游戏。

> docker run 便是rm -v $HOME/.vimrc:/home/node/.vimrc -v $PWD:/usr/src/app node:lts bash

GUI GUI/IDE 普通用户

这类普通用户的持续性将非常加复杂。桌面该软件都初始所谓到了各自的操作该系统,一般来真是它们能够阐释很多上层抽象,比如 Docker 盖子里面的内存。

由于此时的情况是我们能够从 Docker 卷读取文件格式或向从 Docker 卷加载文件格式,因此我们无需一个并不需要来进行这种双向定时的领域该软件,最常唯的高效率之一是 Mutagen。

你可以借助 Mutagen 付诸肠道与盖子错综复杂的双向定时文件格式。本来适用领域该软件并不太非常容易,因为它除此以外一个主某种程度、一个 CLI 领域该软件和一些配有文件格式。它那时候背书 Composer,其后该基本功能成了Docker 桌面版的一个实验者功用,后正因如此用,又被 Mutagen 的所写游离带进 Docker 桌面版的扩展。终于除此以外的是,它也得到了 DDEV 概念其设计的背书和录入。

但是,如果我们没法配置额皆的该软件该怎么办?能不会将 GUI GUI作为 Docker 盖子接入,以便访问期间文件格式吗?在 Linux 上接入 GUI GUI很非常容易,但我们能够现成的高效率在 macOS 上接入 Linux GUI 该软件, 除非你配置 XQuartz,并适用一些小技巧。

出乎意料是,赛门铁克为 Windows 付诸了一个 Wayland 合成器,并不需要接入原生 Linux GUI 该软件:WSLg。然而,这并不是适用GUI的常唯方式为,而且基本功能非常受限,与操作该系统的录入度也极低。

最好的高效率是在本地该系统上接入 IDE,而且还并不需要适用 Docker 盖子,鱼与熊掌兼得。那么,我们无需撰写这样的领域该软件吗?正确是不无需,因为我们已有现成的领域该软件:共同开发盖子()。

共同开发盖子

共同开发盖子(Development Container)是一个中断使用规约,它为盖子添加了一些备有于共同开发的内容和特设。

共同开发盖子容许你将盖子作为基本功能齐全的共同开发生态。你可以借助它接入该软件,并与代码库所需的领域该软件、库或接入时相适应,而且还能辅助持续录入和次测试。共同开发盖子可以在私有幽或公共幽里面接入,既可以在本地接入,也可以通过远程接入。

这个概念其设计是赛门铁克创设的,规约在 CC4 授权下发布。非常有趣的“背书领域该软件”年表,请参唯这里()。可以注意到,大部分所有的赛门铁克编辑领域该软件和幽免费都得到了背书,当然也除此以外 Visual Studio Code 和 GitHub Codespaces。

然而,这个概念其设计也有一些竞争对手:

Gitpod

GCP 幽管理机构嵌入式

AWS Cloud9

Docker 共同开发生态

如何适用共同开发盖子

你无需在概念其设计的根数据库库下创设一个文件格式 .devcontainer/devcontainer.json,供 VsCode 适用。

总的来真是,这个概念其设计的整体思路非常好,并且由于它是一个中断使用标准,因此可以很非常容易地被其他供应商引入,例如:

Gitpod

Jetbrains

nVIM

论述要点:

一切都是基于盖子的。

我们可以图标 VSCode 扩展,定义一个可在小组成员错综复杂对等的共同开发生态。

通过共同开发盖子,在盖子内适用 Docker 和 Docker-compose。

SSH 完整版即用(能够顺利完成并接入 ssh-agent)。

在本地或幽里面重用显然相同的配有。

论述

文本的主要目的是辩论如何提升在 macOS 上接入 Docker 的机动性,但我看来首先我们无需充分阐释一些出发点,因为这些出发点是阐释和充分借助该系统的基础。

有人确实想问,为什么不实际上适用 Linux?

日常管理机构工作我确实适用 Linux,我普遍认为 Linux 可以作为最佳共同开发生态。但我们能够再考虑硬件生态该系统,都有是苹果芯片已港交所,它们在机动性、电池组寿命和免费方面都有非常不错的展现。

因此,我想鱼与熊掌兼得。如今的机器足够强大,可以无缝接入它们。还有一些创造力的组合成方式为,比如将 macOS 和 NixOS 组合成在一起。我们可以适用自己喜欢的硬件,并寻找最适合自己的管理机构工作处理过程。

《2022-2023 里面国共同Linux大调查》接连顺利完成,欢迎扫描右方二维码,参与问卷调研,非常有 iPad 等精良大典等你拿!

☞。

宝宝不吃饭怎么调理
先声药业英太青
喝冷饮拉肚子怎么改善
经常胃酸烧心是怎么回事
迈普新
标签:
友情链接: