如何在没有 docker 桌面的 macOS 中安装 docker-engine?

如何在没有 docker 桌面的 macOS 中安装 docker-engine?

最近,Docker 宣布 Docker Desktop 将不再对某些类型的用户免费。请参阅公告博客文章

我不需要 Docker Desktop® 独有的任何功能。我在一台装有 debian 的笔记本电脑上使用了 docker,这个版本对我来说已经足够了。

有没有办法在macOS上安装linux版本的docker?我需要引擎和 cli 工具,仅此而已。我运行构建命令、推送、标记、运行、docker-compose 等。

答案1

docker还有一个替代方案,那就是播客

  1. 安装:brew install podman
  2. 下载并准备虚拟机:podman machine init
  3. 打开虚拟机:podman machine start
  4. 作为码头工人使用:podman run -d -p 8000:80 nginx
  5. 验证容器:podman ps
  6. 与其互动:curl localhost:8000

它用QEMU用于下面的虚拟化,并设置一台机器Fedora Core操作系统默认情况下。

要在安装后访问默认计算机和虚拟化环境的详细信息:

cat ~/.config/containers/podman/machine/qemu/podman-machine-default.json

答案2

在我的 Macbook 上,我通过 homebrew 安装了 docker

brew install docker docker-compose docker-machine xhyve docker-machine-driver-xhyve

(虽然这是在 docker 桌面变得非免费之前的事情,但我认为它仍然可以工作)

它使用 xhyve 作为虚拟机,因此基本上是在 xhyve 中运行 Linux 发行版,然后在该 Linux 发行版中运行 Docker。

你需要做一些配置,我跟着本文

我创建虚拟机的命令行是

docker-machine create default --driver xhyve --xhyve-experimental-nfs-share=true --xhyve-disk-size "40000"

答案3

据我所知,docker 在功能上与 MacOS 不兼容。我的 Macbook 上运行着 docker 桌面,据我所知,这是通过 docker 桌面创建一个 Linux 虚拟机并在其中运行 Docker 引擎来实现的。

这解释了为什么docker桌面有分配资源的概念,包括“磁盘映像大小”,与docker引擎本身无关。


有没有办法在macOS上安装linux版本的docker?

不,没有 Linux 虚拟机就不行。这是因为 Docker 是一个包装器命名空间cgroups这都是 Linux 概念,在 MacOS 内核中没有实现。

由于这两个功能是容器技术的核心,因此您不太可能找到其他非 Docker 解决方案(包括 Podman)可以工作......除非你使用Linux虚拟机。


我不需要 Docker Desktop® 独有的任何功能

可能是这样,不知道你的需求。但请注意,您可能正在使用 docker 桌面的某些功能,但您没有意识到这些功能是“功能”。例如,docker 绑定挂载是 docker 中的核心概念,但是为了让它们在 Mac 上工作,docker 桌面还必须负责弥合 MacOS 和 Linux 虚拟机之间的差距。


要运行您自己的虚拟机,您可以考虑使用虚拟机管理程序,例如虚拟盒在 Mac 上运行您自己的 Linux 虚拟机。

答案4

当 Docker 宣布 Docker Desktop 将不再免费时,我对替代方案进行了一些研究,并弄清楚了如何在 Debian VM 中运行 Docker Engine,同时在 macOS 主机上使用 Docker CLI。我在题为“Mac M1”的文章中记录了在 Mac M1 上执行此操作的说明在 macOS M1 Arm64 上设置 Docker 以使用 Debian 10.4 Docker 引擎

最初,我只是使用 4.0 版之前的免费 Docker Desktop 附带的 Docker CLI,但在 2022 年 11 月,它现在已经是一个非常旧且过时的 CLI,因此要在没有 Docker Desktop 的情况下安装 Docker CLI,请使用brew:

$ brew install docker docker-compose

之后,我需要某种虚拟机来运行 Linux。如果您使用的是 Intel Mac,则有 VirtualBox 等多种选择,但在 ARM M1 Mac 上,当时最好的免费解决方案是UTM。我下载了一个来自模板库的 Debian VM然后按照 Docker 网站上的说明进行操作在 Debian 上安装 Docker 引擎:

删除旧的 Docker 组件和安装存储库 - 在 Debian VM 中运行它

$ sudo apt-get remove docker docker-engine docker.io containerd runc

$ sudo apt-get update

$ sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

$ sudo mkdir -p /etc/apt/keyrings

$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

在 Debian VM 中安装 Docker Engine 和 Docker Compose

最后一步是在 Linux 上安装最新版本的 Docker:

$ sudo apt-get update -y && sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

在虚拟机上安装 openssl-server

要将主机 CLI 连接到虚拟机,我必须使用 SSH 端口转发将主机上的套接字连接到 /var/run/docker.sock。您需要在 Debian 服务器上安装和配置 SSH,并从 UTM 设置中打开一个端口,以便主机可以通过网络连接到 VM 的 SSH 端口。在 UTM 中,我将主机端口 22022 转发到访客端口 22,因此在以下步骤中,您将看到对端口 22022 的引用。

从 Debian 虚拟机:

$ sudo apt-get update -y && sudo apt-get install openssl-server

将主机 CLI 连接到 VM 并运行容器

以这种方式运行 Docker 时,我在主机和虚拟机之间创建了一个 SSH 隧道,并将 DOCKER_HOST 设置为指向已连接的套接字:

在 macOS 主机上运行:

$ ssh [email protected] -p 22022 -N -L/tmp/docker-on-debian.sock:/var/run/docker.sock ssh://[email protected]

$ export DOCKER_HOST=unix:///tmp/docker-on-debian.sock

每当您重新启动虚拟机以重新建立连接时,都必须执行此步骤。我们可以使用 bash 脚本将其自动化。我在此创建了一系列bash脚本dockerdeb用于此目的的存储库。

另一件不会自动发生的事情是打开容器正在侦听的端口。您可以通过虚拟机执行此操作,但我发现再次使用 SSH 端口转发更方便,这样我就不需要关闭虚拟机来重新配置它。

例如,如果我想运行一个侦听端口 4444 的容器,我还需要创建一个隧道:

在 macOS 主机上运行:

$ ssh [email protected] -p 22022 -N -L4444:127.0.0.1:4444

然后运行容器。

在 macOS 主机上运行:

$ docker run --rm -it -p 4444:4444 --shm-size 2g seleniarm/standalone-chromium:latest

为了确认端口已打开,我可以curl -L http://localhost:4444/status检索 200 OK 响应。

免责声明

对于很多事情,我使用 podman 和 podman-machine 没有太多问题。然而,这个 Docker/Debian VM 设置在 Podman 崩溃的情况下派上了用场。例如,我更喜欢使用 Docker 的 buildx 构建多架构容器,因为它是我们在 CI 服务器上使用的容器。因此,在本地工作时,我将这个 Docker 设置与 UTM VM 结合使用,以便进行同类比较。

我不认为这是在 Mac 上运行 Docker 的最简单方法。对于许多常见用例,其他答案之一可能就足够了。但是,如果您想了解 Docker 在幕后如何工作,请尝试在虚拟机中自己运行它,我保证您会得到更好的理解。

相关内容