使用 Docker 工作流程清理 OS

Clean OS with Docker workflow

所以我已经阅读了 Docker,并且我已经理解了其中的大部分内容。尽管如此,我有一个问题:为什么大多数教程仍然在其本地环境中开发整个应用程序并安装 Node、Python 或 Ruby 等工具,如果您可以创建绑定安装并开发所有在容器里面?我是不是误解了什么或者这种方法是错误的?下面是我用来开发测试应用程序的一些简单 docker 文件:

FROM node
WORKDIR /home/app
VOLUME . .

然后我将从这里进入容器的终端,运行 npm init 并开始开发我的应用程序。

现在,我的目标是让我的机器尽可能干净,而不必安装 Java、Node、Ruby 等。哪种方法最好?还有这种方法在 windows 机器上如何工作?我目前正在使用 Ubuntu.

我不想docker调整应用程序。我想通过组合容器来构建整个应用程序。例如,我想要一个干净的 manjaro 安装,然后安装 docker,接下来获取空间 vim 图像,然后在 java 中启动一个新应用程序,例如在某个本地目录中能够使用 java 容器到 link 我的本地目录,以便它可以 运行 编译器。然后,如果我想,在节点中启动一个新应用程序,然后执行相同的操作。在所有情况下,我将使用包含源代码的本地目录,使用我的 vim 容器和来自语言容器的 运行 进行编辑。那可能吗?所以我不必安装 nvm 或 nodenv 或任何版本管理器等等。

我可以手动 运行 这个代码例如:

docker container run --rm -it -v /home/alex/Documents/REPOs/testing:/home/app -p 3000:3000 --name node node:latest bash

它让我可以在 /home/app/ 目录中以双向绑定的方式工作,但是我如何通过 docker 文件或 docker-compose 文件实现相同的目的,以便我可以共享我的配置并停止为每种语言使用版本管理器。

可以 在 docker 中进行开发,并且有很多教程可以做到这一点。

Examples 1, 2

Docker 示例应用程序比比皆是...您只需 google docker example app 和您的框架名称即可。

在 windows 机器上,这取决于您的版本,因为在 windows 10 上,您需要专业版 OS 到 运行 docker。我是 windows 用户,我注意到 windows 版本会弹出一些怪癖,据我所知,k8 在 windows 上不可用。

假设我正在开发一个 Node 应用程序。我需要一种语言 运行 时间,但是 Node 生态系统的工作方式是,包的所有构建时和编译时依赖项都在 package.json 文件中声明,并在 [=11] 中隔离=] 目录。这样做实际上没有任何开销;我需要一个 apt-get installbrew install 命令,我准备好了。

完成此操作后,我就有了一整套非常有效的工具如果我在本地工作。我的编辑器可以与静态类型检查器对话并为我突出显示错误,但前提是 node_modules 目录在我的本地环境中。我的编辑器可以 运行 我的测试套件并跳转到失败处,但前提是语言 运行time 是本地的。如果我的代码 运行 在远程系统或容器中,我的编辑器可以访问我的代码,但我可以使用这个额外工具套件的 none。

反过来,使用 Docker 也有很多复杂性。您仍然需要安装一些东西(Docker 本身)才能使用 Docker。 运行 任何 Docker 命令都涉及 root 等效权限,所以要么你经常使用 sudo,要么你相信没有什么会 "accidentally" docker run -v /:/host ... 和在你下面乱转。您需要将代码放入容器中。您需要告诉容器让您可以访问服务器的端口。您通常需要删除容器才能更改设置。存在反复出现的权限映射问题,如果文件 I/O 是程序的主要部分,您也需要将这些文件放入和取出。 Docker 很复杂,就像每一个复杂的事物一样,它偶尔会彻底失败。

我认为 Docker 很棒 – 作为一个部署系统。如果你有一个包装良好且自包含的 Python、Ruby、JavaScript 或 Go 程序,围绕它构建一个容器是非常容易的,而 运行作为预打包的解决方案,或将其部署到 Kubernetes 集群。我看到的支持 Docker 开发的两个主要论点是每个项目的文件系统隔离(你在没有 Docker 的情况下通过 node_modules、Python 虚拟环境、Ruby rvm gemsets, $GOPATH, ...) 并且想要精确的语言版本 运行 次(根据我的经验,这没什么大不了的)。管理 Docker 环境的麻烦和进行开发的困难 "remotely"...只是为了避免在主机上安装语言 运行 时间。