点击-运行 docker 图像(或 VM)与网络界面?

click-and-run docker image (or VM) with web interface?

我可以向用户交付应用程序,但是它需要安装相当多的程序和组件,这代表了一些我希望避免的开销和解释。我认为一种非常好的方法是简单地提供 VM 或 Docker 映像。在这个想法中,可交付成果将是一张图片,理想情况下,用户只需双击 docker 图片并弹出一个显示方便前端的 Web 界面。 (在这种情况下,我想象它会 运行 Jupyter 允许与我正在开发的 Python 脚本进行交互。)

但是,我仍然对 Docker 的工作原理感到有点困惑。您似乎必须 运行 docker pull .. 而不是能够发送可双击的图像,它会下载……一堆东西……并将它们安装……某处。然后你要运行一个命令,docker run ...

Docker 或一些类似的 VM 解决方案是否有更简单、更面向文件的界面?为什么要用这么奇怪的方式来管理事情?

(我更喜欢 Docker 因为它现在有很好的 Windows 和 Mac 支持,而且据我所知,它的镜像比 VM 镜像小很多.)

编辑:"weird way",我的意思是,对我来说更清楚的是,我只是简单地下载了某种文件 my-docker-thing.image 和 运行 之类的, docker run my-docker-thing.image。相反,一个 docker pull 似乎正在 /var/lib/docker 中用一堆名为 ..*ImageBlob* 的文件快速填满我的硬盘驱动器,我不知道它实际上在做什么。我假设这些文件包含 "pieces" 可以组合成图像,但是有没有办法在单个文件中表示它?

为了 Docker 容器到 运行 你需要一个 Docker 引擎。如果您的客户想要 运行 她主机上的容器,那么她需要 docker 安装。

快速示例: 你们中的一个组件是 Nginx:

docker pull ngnix:latest
docker run --name webInterface --host web -it ngnix:latest

通过上面的操作,您创建了一个容器,准备就绪后可以安装在您客户的机器上。

如果你想在特定环境中使用 docker,那么我建议挂载一个卷并在 docker 上进行工作(编译或其他东西),然后将结果放入挂载的这样您就可以从不污染系统并保证每次都获得相同结果中受益

是的,您可以将 Docker 图像导入和导出为简单的 TAR 文件。要将现有图像导出到 tar 文件,请使用以下 docker save 命令:

docker save your_image > your_image.tar

以这种方式创建的 TAR 文件是独立的,您可以按照自己喜欢的方式分发它。在另一台主机上(已经安装了 Docker 引擎),然后您可以使用 docker load 命令导入 TAR 文件(随后使用 docker run):

docker load < your_image.tar
docker run your_image

一些背景说明(因为您已经问过为什么 Docker 以这种方式处理图像):

层文件系统允许 Docker 在磁盘空间和容器创建时间方面非常有效地处理图像和容器。例如,您可能有多个本地图像,它们都构建在一个公共基础图像上(例如 ubuntu:16.04 图像)。图层文件系统将识别这一点,并且在执行 docker pull.

时仅下载基础图像 一次

使用导出的图像文件,你放弃了这个优势,因为保存为文件的图像将始终包含构建图像的所有文件系统层。考虑一个示例,其中您正在使用 200MB 的基本图像和 10MB 的自定义应用程序数据(后者在发布应用程序的新版本时经常更改)。使用 docker savedocker load 总是会产生一个新的 210MB 大小的 tar 球,您需要为应用程序的每个构建分发它。将 docker pushdocker pull 与集中式注册表一起使用,您只需将 10MB 的已更改图像层传入和传出注册表。