【编者的话】这篇文章以极简的模式快速搭建一套使用与开发的 Docker 环境,特别面向了开发中常用的 Mac 和 Windows 环境。虽然本文模糊了大量的实现细节,但可作为在开发平台搭建 Docker 环境有力范本。
【深圳站|3 天烧脑式 Kubernetes 训练营】培训内容包括:Kubernetes 概述和架构、部署和核心机制分析、进阶篇——Kubernetes 调工作原理及源码分析等。
作为开发者,我们总是寻找一个捷径或更容易的方法来快速起步,对吧?如果你是团队领导,付出最少的代价让团队站在同一个起点是很重要的。 Docker 可以提供帮助。
在软件开发领域,一直越来越强调模块化,从单一责任的一般原则到更具体的实现,例如将 JavaScript 功能模块化为无状态组件。在这里,我将告诉你我们如何使用 Docker 来模块化我们的开发环境,以获得许多类似的好处,包括帮助我们快速起步。
如你所知,为了加快项目进度,你有一个待办事项清单:
想象一下,如果在将应用程序的代码基线拉出存储库之后,您只需运行几个命令行(可能只有一个),可以使整个应用程序的环境准备就绪。听起来很酷,对吧?
这正是我们要完成的。不同于使用一个百科全书式的方法来使用 Docker 的所有功能和命令,我将介绍容器化开发人员的环境的主要的 Docker 功能。
这篇文章是关于利用 Docker 的容器化能力的一系列文章中的第一篇,它很容易构建一个可以在任何时间共享和运行的应用程序开发环境。
Docker Toolbox 是可用于处理多个 Docker 资源的原始工具集合,并且会根据您选择的操作系统而有所不同。但在那之后,他们发布了新的 Windows 和 Mac 原生应用程序。因此,除了 Linux、OS X 和 Windows Docker Toolbox 变体之外,您还将看到 "Docker for Mac" 和 "Docker for Windows"。
要理解和决定应该使用哪种工具,我想概述使用新的原生应用程序的前提。原来的 Docker Toolbox 将会设置一些工具以及使用 VirtualBox 。它还将提供在 Linux Hypervisor 上运行的虚拟机,用于 Windows 或 Mac。
原生应用程序,例如在 Docker for Mac 中,实际安装的是 OS X 原生应用程序。它也不再使用 VirtualBox,而是使用 OS X 的 hypervisor hyperkit 。此外,共享接口和网络的管理更简单。还有一些用户体验更新以便于 Docker 更好的工作。在 Docker for Windows 原生应用程序中也会包含这些相同的更改,但是会使用 Hyper-V 作为 hypervisor,以及其他类似的网络和工具更新的主机。
最后,原生应用的体验应该是一个更积极,更有效率的,而且更少的出错。但是,您会发现绝大多数与 Toolbox 相关的外部文档 - 因此了解 Toolbox 将是你的优势。
这个初始教程将简单地使用一个开箱即用的 express.js 应用程序。当我们开始编辑源代码并在容器之间进行通信时,我将介绍一个运行 webpack 的开发服务器的进阶的通用 React.js 应用程序,其中包含热模块重新加载,MongoDB 数据库等。
为了努力获得使用 Docker 并将开发人员环境与各种操作系统版本一起集中化的好处,我将让您选择需要下载的 Docker 版本(Toolbox 或原生)和操作系统:
TOOLBOX 用户:Docker Toolbox 配有 "Docker 快速入门终端",并在运行时与 Docker 环境相关联。但是,通常在您选择的 IDE 中运行终端或独立运行终端。为了让 Docker 与另一个终端 / 提示进行交互,您需要通过运行 "docker-machine env" 来初始化 Docker env。文本显示的末尾是一个命令,您需要从该同一终端中复制该命令以初始化 Docker 环境。
下一步是获取要容器化的开发应用程序的源代码。
现在,您可以从 GitHub 抓取这个 项目 ,这个项目保存了本教程的一些步骤。
请记住,主要目标是在隔离和模块化的环境中运行我们的应用程序。为了让 Docker 创建这个环境,我们必须告诉它如何创建它。我们使用包含一组指令的 Docker 镜像文件 。
重要信息 :该 Docker 镜像文件将允许我们创建一个镜像,该镜像将代表我们一直在讨论的容器化环境,并最终创建称为容器的该镜像的运行实例。但是,我们向前跳了一步,这些内容应该在第 5 步中。
- FROM mhart/alpine-node:6.9.2
- WORKDIR /var/app
- COPY . /var/app
- RUN npm install --production
- EXPOSE 3000
- ENV NODE_ENV=production
- CMD ["node", "bin/www"]
Dockerfile 是 Docker 在镜像文件中寻找的默认名称,但它可以是任何名称,我们将在稍后的步骤中看到。这些指令告诉 Docker 我们要创建一个镜像:
提示 :Docker 总是需要一个基本的镜像,镜像保持尽可能小空间占用是关键。alpine-node 镜像是非常小的(49.65mb),包括 Node.js 和 NPM。
现在我们有一个 Docker 镜像文件,它指定了有关如何创建镜像的详细信息,让我们停下来谈谈镜像是什么:
镜像是只读分层文件系统。它构成了我们不断追求的环境的基本文件系统。我们在上一步中创建的镜像文件将指示 Docker 如何去创建镜像的每层。
但如果它是一个只读的文件系统,我们如何去写它,(例如,执行代码的变化对我们的应用程序的代码在开发过程中)?好问题,我会在即将到来的步骤中回答。
- docker build -t express-prod-i .
提示 :对于 Docker Toolbox,从 Docker Quickstart Terminal 开始运行 Docker 命令会导致错误(根据操作系统而异)。为了从任何随机终端 / 提示符运行命令,您需要将终端 / 提示链接到 docker 环境。运行 docker-machine env,并运行它提示的命令,例如 "@FOR / f"tokens = *"%i IN('docker-machine env')DO @%i"
如果所有都按计划进行,我们应该看到(如. gif 中的)一个 "successful build ..." 消息。我们现在可以运行一个命令来记住你的镜像:
- docker images
在这种情况下,我们的组合镜像大小为 61.26 MB,这是基本的 alpine-node 镜像和我们的 express 应用层的组合。
如果我们想要看到为我们的镜像创建的文件层,我们可以运行命令:
- docker history express-prod-i
既然我们已经创建了一个镜像,我们已经准备好创建一个隔离的,模块化的应用环境。正如我已经提到了很多次那样,那个环境是一个 Docker 容器。Docker 容器实际上是镜像的运行实例。
在概念上,一个镜像和容器非常类似于我们如何想到一个 JavaScript Prototype 或一个 OOP 类。所以,我们来运行一个我们创建的镜像的实例。
- docker run -d --name express-prod-app -p 7000:3000 express-prod-i
我们创建并运行了一个 express-prod-i 镜像的实例而作为一个容器:
注意:我使用不同的本地端口 7000 来向您展示您可以将主机上的任何未使用的端口映射到容器中暴露的内部端口。
提示:没有 - d,我们将以贴合模式启动运行容器。这意味着它将从容器中直接输出到我们运行命令的终端 / 提示符。通过在分离模式下启动容器,我们可以继续从终端 / 提示符运行容器工作。
你明白了吗?我们不必在本地安装 Node.js 或 NPM。我们没有必要运行 npm 安装本地使用的应用程序,我们没有从主机运行应用程序。所有这些都在主机内部发生,这是一个简单的 express.js 演示网站。
- docker ps
- docker ps -a
停止一个运行时容器是非常简单的... 或许你已经猜到了:
- docker stop express-prod-app
然后启动它
- docker start express-prod-app
当我们浏览这些教程时,可以删除镜像或容器并重新开始。以下是步骤。另外,在 "奖励" 部分,还有一些有用的捷径:
删除一个容器,我们可以使用 "rm" 命令:
- docker rm express-prod-app
让容器恢复回来,我们可以使用先前使用过的命令:
- docker run -d --name express-prod-app -p 7000:3000 express-prod-i
删除一个镜像,我们可以使用 "rmi" 命令:
- docker rmi express-prod-i
让镜像恢复回来,我们可以使用先前使用过的命令:
- docker build -t express-prod-i .
提示 :删除镜像和容器命令可以使用镜像或容器 ID,甚至可以使用 ID 的前几个字符。所以你可以任意选择。 (您还会看到我们在奖励部分中这样做。)
补充一些删除镜像和容器的其他手段,你可以使用一些我已经在用的有效的快捷方法。
要删除所有容器,运行下面的 "rm" 命令,这条命令内部会返回所有的容器:
- docker rm $(docker ps -a -q)
Windows 用户:你需要是一个 bash 环境去运行这些命令。主要是因为只有 GNU 才能使用 $() 变量引用。你可以安装诸如"Bash on Ubuntu on Windows" 甚至于 GIT bash。只要记得你需要运行 docker-machine env 来链接你的终端,并且运行显示在最后的 eval 命令。
删除所有的镜像我们可以类似于上面的做法,使用删除镜像命令 "rmi"
- docker rmi $(docker images -q)
很明显能主要到我们刚刚创建的镜像通知 Express.js 和 Node.js 在生产环境中运行。那这是什么鬼?
记住我们是要为任何镜像制作基本镜像,并且谁会在开发环境中为每次修改而 "重建" 镜像呢?所以我们需要使用生产镜像来作为基本镜像构建我们的开发环境并且隔离开发修改到分层镜像中的开发层中。
所以,我已经屏蔽了一大堆关于 Docker 的知识。创建镜像文件,构建镜像并生成该镜像的正在运行的容器。但是我们还有很多事情要去做。
因此,在本系列的下一篇文章中,我将针对我们的开发版本或应用程序创建一个镜像,但是基于我们的生产镜像。我们还将介绍如何利用容器中的脚本来帮助设置本地环境来更改源代码。
来源: http://www.tuicool.com/articles/rEzeAjM