假设有两台docker主机A和B,A机器上有一个docker镜像xyz,我想从A机器部署到B机器,该怎么做?
我知道可以通过如下设置 DOCKER_HOST 来远程操作容器,但这似乎需要 docker 映像 xyz 已存在于机器 B 上。此外,从映像 xyz 创建一个 tar 文件并将其复制到机器 B,然后在机器 B 上运行它是另一种方法。我想知道有没有办法可以直接在A机上完成?谢谢!
docker -H“ssh://my-user@machine-b”运行-i - t xyz
正如 David 提到的,移动图像的标准方法是使用注册表。您可以自行托管(例如Docker 的注册表)、使用 Hub 等 SaaS 产品或云供应商之一(例如 ECR、GCR)。与发送导出相比,注册表的优点是对图层进行重复数据删除,当您的图像在版本之间仅发生微小变化时,可以节省带宽。此功能也通过推送和拉取命令内置于 docker 引擎中。
使用保存和加载方法,您可以用两个命令来完成此操作,通过管道传输输出,但正如之前提到的,即使您只有很小的更改,这也会传输所有层:
docker save ${image} | docker -H ssh://${user}@${host} load
我为此使用 Portainer Agent。在机器 A 上的端口 9000 或 9443 上本地设置 Portainer。然后在端口 8000 上使用 Portainer Agent 添加机器 B 环境。打开机器 B 环境。然后,您将能够从机器 A-> 机器 B 创建容器、拉取镜像、部署堆栈,无论您需要什么。这是迁移容器的好方法。
正如 BMitch 提到的,您可以运行自己的注册表。 (详情请参阅上面的文档链接⬆️)
以下是在 Linux 上执行此操作的命令。这是开发用例的基本示例:
⚠️以这种方式运行 docker 注册表是不安全,请阅读文档。
在 Ubuntu 22.04 上使用 docker 版本 24.0.6 进行测试
在您开发人员的笔记本电脑上
sudo mkdir /var/lib/my_docker_registry
docker run -d -p 5050:5000 \
--restart=always \
-v /var/lib/my_docker_registry:/var/lib/registry \
--name registry \
registry:2
# grab a container or build your own
docker pull busybox
# tag it and push the image into the local registry
docker tag busybox:latest localhost:5050/mybusybox
docker push localhost:5050/mybusybox
在 vm
您必须知道笔记本电脑的本地IP(假设它们共享一个公共网络)。在本地 DHCP 上,IP 可能就足够了,并且租约可能始终相同。本地 DNS 条目也非常好。 (留给读者作为练习)
我们正在配置 vm docker 客户端以允许从本地远程不安全注册表中拉取:
以下命令将创建或覆盖 Linux docker 配置文件:(根据需要进行备份或编辑)
echo '{ "insecure-registries":["192.168.0.22:5050"] }' \
| sudo tee /etc/docker/daemon.json
重新加载虚拟机的docker引擎:
sudo systemctl restart docker
测试从虚拟机的 docker pull
docker pull 192.168.0.22:5050/mybusybox
应该很高兴从注册表下载图像。
连同最初的问题:
在笔记本电脑方面:
export [email protected]
docker pull 192.168.0.22:5050/mybusybox
⚠️ 如果设置了
$DOCKER_HOST
,则在笔记本电脑终端会话中执行的所有 docker 命令现在都将在虚拟机上执行。
包括 docker build
,它将在虚拟机中构建容器,而不是在笔记本电脑上的本地 Docker 引擎上构建容器。 😁
当然,注册表可以托管在虚拟机上,或任何其他第三个远程位置。
享受远程调试的乐趣! 😜