Docker 是开源软件,Docker Desktop 是一个漂亮的 GUI 应用程序,用于简化在 macOS 或 Windows 机器上安装 Docker。值得使用,因为使用 Docker 非常容易。但是,Docker Inc 已将 Docker 桌面应用程序更改为免费增值模式,这将导致一些人避免使用 Docker 桌面,转而寻求替代方法来避免支付费用。我们将讨论的是使用 Multipass 或其他虚拟机来避免这些费用。
image在 Docker 的旧时代,将其安装在 macOS 或 Windows 机器上是一项重大壮举。由于 Docker 在 Linux 上本地运行,因此可以安装 Linux 虚拟机并在其上安装 Docker Engine for Linux。在过去,这意味着使用 VirtualBox,这是一个重量级的虚拟机系统。使用 Docker Desktop 是一个巨大的简化,因为 Docker 的所有内容都作为普通应用程序安装。它带有一个很好的 GUI,用于通过单击鼠标来管理本地 Docker 实例。
纵观其历史,Docker Desktop 一直是免费的,但 2021 年 8 月,Docker Inc 宣布了新的免费增值模式。有关详细信息,请参阅:Docker Inc 从 Docker Desktop 和其他 Docker 工具中榨取资金。简而言之,超过一定规模的组织预计每月为每位开发人员支付 5 美元(左右)。费用还包括 Docker Hub 上的服务。
我们中的一些人可能会回避为 Docker Desktop 每月支付 5 美元(左右)。由于 Docker 提供了出色的商业价值,因此支付费用是一个很好的论据。但是,有些人想知道他们可以使用什么来代替 Docker 桌面。
需要注意的是,Docker 不再免费。Docker 仍然是免费的,但部分 Docker 生态系统需要付费。再次参见:Docker Inc 从 Docker Desktop 和其他 Docker 工具中榨取资金。
选择使用 Docker Desktop 受到另一个事实的影响。过去使用虚拟机在 macOS 或 Windows 上设置 Docker 很困难,现在很容易。换句话说,Docker Desktop 是值得的。值得探索和理解该替代方案。
在 macOS 或 Windows 上运行 Docker 而不使用 Docker Desktop 的游戏计划
Docker Desktop 产品内部是一个运行虚拟 Linux 实例的轻量级管理程序。在 Linux 内部是 Docker 引擎的 Linux 版本。Docker Desktop 的神奇之处在于管理程序对我们是不可见的。我们坐在命令行前打字docker pull
或docker build
不知道每个命令都在虚拟 Linux 实例中执行所有操作。
为了避免使用 Docker Desktop,我们需要回到安装运行 Linux 的虚拟机以安装 Docker Engine 的基础知识,然后以某种方式施展魔法。幸运的是,现在一切都比以前简单了。例如,Multipass 是一个轻量级的虚拟机平台,我们可以使用它轻松设置和运行 Ubuntu 实例。然后我们可以安装 Docker,我们甚至可以配置多个 Linux VM,每个都有一个 Docker 实例,这样我们就可以实现一个多节点集群来试验 Docker Swarm 或 Kubernetes。
我们的计划是这样的:
- 使用多道,从规范的轻量级虚拟机系统,并安装多克尔引擎Ubuntu的实例内。
- 对于 macOS,请
docker
通过 MacPorts 或 HomeBrew安装CLI。 - 对于 Windows,
docker
通过...安装CLI?似乎 Chocolatey 包管理器是首选。 - 配置 Docker 上下文以与托管在 Multipass 实例内的 Docker 引擎进行通信。
- 如果我们要实现 Docker Swarm 或 Kubernetes 集群,则可以通过启动多个 Multipass 实例来实现。
换句话说,该计划依赖于托管 Docker 实例的显式 Linux 管理程序。由于 Docker Context 功能以及 Multipass 如何轻松启动轻量级 Linux 虚拟机,这一次变得更简单。
在 Windows 或 macOS 上为 Docker 设置 Multipass 实例
要安装 Multipass,请访问https://multipass.run
并下载适用于您的操作系统的安装程序。运行安装程序,您将有一个multipass
可用的新命令。Multipass 网站有一些命令来熟悉它的使用。
我写了一篇关于使用 Multipass 设置多个 Docker 实例的文章,请参阅:在您的笔记本电脑上使用 Multipass 和 Ubuntu 20.04 创建 Docker Swarm ......我们在这里要做的是该过程的精简版本。
创建setup-instance.sh
包含:
sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get -y install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
sudo groupadd docker
sudo usermod -aG docker ubuntu
sudo systemctl enable docker
sudo curl -L "https://github.com/docker/compose/releases/download/v2.9.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
该脚本源自在 Ubuntu Linux 上安装 Docker 的官方说明。
接下来,创建一个名为init-instance.sh
包含的 shell 脚本:
NM=$1
multipass launch --name ${NM} focal
multipass transfer setup-instance.sh ${NM}:/home/ubuntu/setup-instance.sh
multipass exec ${NM} -- sh -x /home/ubuntu/setup-instance.sh
此脚本在 Multipass 上启动一个新的 Ubuntu 实例。然后它setup-instance.sh
在新实例内执行。
运行脚本如下: ./init-instance.sh docker1
这将设置 Multipass 实例,并初始化 Docker。要验证 Docker 是否正在运行,请键入以下命令:
$ multipass exec NAME -- docker run hello-world
这为您提供了一个 Docker 实例。我们可以在 Ubuntu 实例中运行 Docker 命令,但要与 Docker Desktop 相同,需要在我们主机系统的命令行中运行 Docker 命令。为此,我们需要对 Multipass 实例进行无密码 SSH 访问,然后设置 Docker 上下文。
设置对新创建的 Multipass 实例的无密码 SSH 访问
下一步是启用对 Multipass 实例的无密码 SSH 访问。我们需要它来设置一个上下文来控制 Docker 实例。请参阅:如何在 Multipass 内的 Ubuntu 20.04 上启用无密码 SSH 登录 如果您已设置远程 SSH 访问,则步骤很简单。只需将您的 SSH 密钥从~/.ssh
(例如~/.ssh/id_rsa.pub
)~/.ssh/authorized_keys
复制到 Ubuntu 实例内的文件中。
完成这些步骤后,您应该能够运行ssh -l ubuntu IP-ADDRESS
以在 Ubuntu 实例中获得 shell 提示。而且,你应该能够运行这个:
$ ssh -l ubuntu 192.168.64.21 docker run hello-world
我们现在已准备好设置 Docker 上下文来简化此操作,但首先我们需要在您的主机上安装开源 Docker 命令。
docker
在 Windows 和 macOS 上安装开源命令
我们中有多少人使用 Docker 桌面 GUI?我很少使用它,并且不会错过它。命令行docker
命令足以满足我的需要。
安装 Docker Desktop 为您提供命令行docker
命令。因此,您可能已经安装了它们。但是我们正在探索的是在docker
不依赖 Docker 桌面的情况下安装命令。
该docker
命令是开源的,并将始终保持开源。这意味着可以从 MacPorts 和 HomeBrew 等包管理系统获得包,提供docker
命令。
使用 MacPorts:
$ port search docker
...
docker @20.10.9 (devel)
The open-source application container engine
docker-compose @1.29.2 (python, devel)
Define and run multi-container applications with Docker
...
$ sudo port install docker
Password:
---> Fetching archive for docker
---> Attempting to fetch docker-20.10.9_0.darwin_19.x86_64.tbz2 from https://packages.macports.org/docker
---> Attempting to fetch docker-20.10.9_0.darwin_19.x86_64.tbz2.rmd160 from https://packages.macports.org/docker
---> Installing docker @20.10.9_0
---> Activating docker @20.10.9_0
---> Cleaning docker
---> Updating database of binaries
---> Scanning binaries for linking errors
---> No broken files found.
---> No broken ports found.
$ which docker
/opt/local/bin/docker
$ docker container ls
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
$ /Applications/Docker.app/Contents/Resources/bin/docker --version
Docker version 20.10.8, build 3967b7d
$ /Applications/Docker.app/Contents/Resources/bin/docker container ls
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
该docker
命令的安装与/opt/local/bin
MacPorts 管理的其他命令一样。为了比较,我们找到了docker
作为 Docker Desktop 一部分安装的命令,了解到当前版本是 20.10.8,而 MacPorts 安装的版本是 20.10.9。
使用 HomeBrew 时,情况大致相同:
$ brew install docker
==> Pouring docker--20.10.10.catalina.bottle.tar.gz
Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
Could not symlink bin/docker
Target /usr/local/bin/docker
already exists. You may want to remove it:
rm '/usr/local/bin/docker'
To force the link and overwrite all conflicting files:
brew link --overwrite docker
...
==> Summary
🍺 /usr/local/Cellar/docker/20.10.10: 12 files, 56.8MB
...
$ /usr/local/Cellar/docker/20.10.10/bin/docker --version
Docker version 20.10.10, build b485636f4b
$ /usr/local/Cellar/docker/20.10.10/bin/docker container ls
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
由于/usr/local/bin/docker
Docker Desktop 安装了现有的 Homebrew 安装失败。但是,它仍然安装在指定位置的地窖中。这大约与 MacPorts 版本一样最新。而且,请注意安装的版本 20.10.10,这意味着所有三个来源都是最新的。
在 Windows 上,应该有一个可通过 WinGet 命令使用的类似包。WinGet 是相当于我们刚刚检查的 macOS 包管理系统的 Windows。但是,docker
WinGet似乎没有合适的包可用。相反,Docker Desktop 和 Multipass 都通过 WinGet 进行管理。
Windows 上的一种选择是启动 WSL2 实例,并在docker
那里安装命令。
设置 Docker 上下文来控制在 Multipass 中运行的 Docker 实例
我们现在可以进入本文的重点,即将docker
主机系统上运行的命令与之前设置的 Ubuntu 实例中的 Docker 实例连接起来。
2019 年,Docker 团队添加了一个新功能Docker Context。这是设置 Docker 实例远程控制的最简单、最安全的方法。历史方法是公开暴露Docker TCP点,然后设置一些TLS证书等复杂步骤。使用 Docker 上下文,我们可以使用无密码 SSH 连接与远程 Docker 实例进行连接。
默认情况下,该docker
命令会尝试连接到在本地主机上运行的 Docker 引擎。但是,除非您的主机上运行着活动的 Docker 桌面,否则以下操作将失败:
$ docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
该docker
命令支持一组用于连接到远程 Docker 实例的环境变量。Docker Context 功能是一种更好的方法。使用 Docker Context,我们可以配置与数十个或数百个远程 Docker 实例中的任何一个的连接,甚至可以连接到 AWS 或 Azure 上的 Docker 部署。您可以在我的《[图片上传中...(image-6b1a3f-1639273187060-1)]
使用 Terraform 将 Docker 容器部署到 AWS:以简单的方式在 EC2 或 ECS 上运行 Docker(赞助)》一书中了解有关将其与 AWS 结合使用的更多信息 。
要为在 Multipass 中运行的 Ubuntu 设置上下文,请运行以下命令:
$ docker context create docker1 \
--docker "host=ssh://ubuntu@192.168.64.21"
docker1
Successfully created context "docker1"
我们创建了一个名为的上下文docker1
,该上下文使用此处显示的 SSH URL 进行连接。这就是我们设置无密码 SSH 访问的原因,以便 Docker 可以使用此 SSH URL。
$ docker context list
NAME DESCRIPTION DOCKER
default * Current DOCKER_HOST based configuration unix:///var/run/docker.sock
docker1 ssh://ubuntu@192.168.64.21
此命令列出了系统上当前可用的 Docker 上下文。该*
标记指示哪个上下文是当前活动。
$ docker context use docker1
docker1
Current context is now "docker1"
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$ docker run -it alpine sh
/ # uname -a
Linux a139bc7ff4f4 5.4.0-89-generic #100-Ubuntu SMP Fri Sep 24 14:50:10 UTC 2021 x86_64 Linux
/ # exit
这表明我们在 Multipass 内的 Ubuntu 中运行 Docker,并且我们可以使用docker
台式机/笔记本电脑上的命令控制 Docker 实例。
我们在docker
命令连接到docker1
上下文时这样做了。要了解这有什么不同,让我们更改我们正在使用的上下文。
$ docker context use default
default
Current context is now "default"
$ docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
该docker context use
命令是我们如何切换从一个上下文到另一个。该default
背景下,就是要在主机上。就我而言,我安装了 Docker Desktop,但它目前没有运行。default
在这种情况下,上下文指的是在 Docker 桌面处于活动状态时将运行的 Docker 引擎。
可以创建其他 Docker 上下文。例如,我在安装了 Docker 的 Web 托管服务提供商处有一个虚拟专用服务器 (VPS)。与该 Docker 实例交互如下所示:
$ docker context use host001
host001
Current context is now "host001"
我的上下文命名host001
提供了对我托管一些生产网站的 VPS 的远程控制。这些站点使用 Docker Swarm 进行管理。这意味着我可以运行这个命令:
$ docker stack ls
NAME SERVICES ORCHESTRATOR
backups 1 Swarm
db 1 Swarm
proxyman 2 Swarm
wordpress-ltp 1 Swarm
...
我可以轻松地使用它在该服务器上运行 Docker 命令,即使它位于数百英里之外。即使在这个距离,响应时间也非常好。
如果您更喜欢始终明确选择上下文,请运行如下命令:
$ docker --context CONTEXT-NAME ps
然后,如果您想关闭 Docker 服务(在 Multipass 中),只需运行以下命令:
$ multipass stop docker1
要再次启动它,请使用multipass start docker1
.
概括
我们已经学习了一种无需安装 Docker Desktop 即可在 macOS 或 Windows 机器上运行 Docker 的简单方法。所使用的 Docker 命令与 Docker Desktop 产品提供的命令一样是最新的。使用基于 Multipass 的 Docker 实例与使用 Docker Desktop 管理的实例之间的命令行用户体验是相同的。
正如我们之前所说,Multipass 可用于实现多节点 Docker 设置,例如试验 Docker Swarm 或 Kubernetes。要查看设置 Swarm 集群的说明,请按照在笔记本电脑上使用 Multipass 和 Ubuntu 20.04 创建 Docker Swarm 中的其余说明进行操作
之前使用的说明导致在 Multipass 中安装 Ubuntu 20.04。其他操作系统映像可用,您可以使用以下命令列出它们:
$ multipass find
Image Aliases Version Description
18.04 bionic 20211021 Ubuntu 18.04 LTS
20.04 focal,lts 20211021 Ubuntu 20.04 LTS
21.04 hirsute 20211025 Ubuntu 21.04
21.10 impish 20211014 Ubuntu 21.10
anbox-cloud-appliance latest Anbox Cloud Appliance
minikube latest minikube is local Kubernetes
请注意,Minikube 是可用的。这是一个用于简化在台式机/笔记本电脑上运行 Kubernetes 的工具。
https://techsparx.com/software-development/docker/docker-desktop/not-free.html
网友评论