使用绑定挂载(bind mounts)构建本地开发环境

未匹配的标注

在上一章中,我们讨论了具名卷,并用它将我们数据库中的数据做了持久化。如果我们只是想要存储数据的话,具名卷再合适不过了,因为我们不需要担心数据存在哪里。

有了绑定挂载,我们就能够控制宿主机上确切的挂载点了。我们可以用它来做数据持久化,但是它通常用来给容器提供额外的数据。在开发应用的时候,我们能够使用绑定挂载将我们的源代码挂载进容器中,让容器能够看到代码变更,做出响应,同时马上让我们也能看到应用的修改效果。

对于基于Node的应用来说,nodemon是一个用来监控文件变化,进而重启应用的好帮手。至于其它编程语言或框架呢,大多数也都有相类似的工具。

简单的卷类型比较

绑定挂载和具名卷是Docker引擎自带的2种主要类型的卷。不过还有支持其它使用情况的卷驱动器在,比如用于SFTP,Ceph,NetApp,S3等等。

具名卷和绑定挂载的对比如下:

启动一个开发模式的容器

要让我们的容器支持开发工作流程,我们需要做几件事:

1、将源代码挂载进容器

2、安装所有依赖,包括开发依赖

3、启动 nodemon 来监控文件系统的修改

好了,让我们开始吧。

1、确保当前没有之前 getting-started 的容器在运行。

2、在教程范例项目所在的路径下,运行以下命令,后续会做解释:

docker run -dp 3000:3000

-w /app -v “$(pwd):/app”

node:12-alpine

sh -c “yarn install && yarn run dev”

你如果和我一样,现在是在 PowerShell 中运行命令的话,那么就使用下面这个命令:

docker run -dp 3000:3000 `

-w /app -v “$(pwd):/app” `

node:12-alpine `

sh -c “yarn install && yarn run dev”

-dp 3000:3000

和之前一样,以分离(后台)模式运行容器,并创建端口映射

-w /app

设置了工作路径,或者说命令从哪里开始运行的路径

-v “$(pwd):/app”

把宿主机中,当前执行这条命令所在的路径,挂载到容器中的 /app 路径

其中 “$(pwd)” 是 Windows Power Shell 中的语法,运行pwd命令获取当前路径,并获取返回值对应的字符串。如图:

这也就是为什么要在教程范例项目所在的路径下运行命令的原因:所谓把当前路径映射到容器的 /app 其实就是把源代码直接映射到容器中。所以我是直接在 vscode 所集成的 命令行 中运行的。

node:12-alpine

指定了作为容器运行基础的镜像。注意,这是Dockerfile中,为我们的应用所指定的基础镜像。

sh -c “yarn install && yarn run dev”

容器执行的命令。我们使用 sh 来启动 shell ,alpine没有 bash 。运行 yarn install 来安装所有依赖,并运行 yarn run dev ,用来做什么呢?如果你看一眼 package.json 文件的话,我们会看到:dev脚本其实是在启动 nodemon 。

3、命令运行以后,因为项目需要下载依赖,可能要花些时间。怎么样才能知道项目已经正常启动了呢?可以使用 docker logs -f <容器id> 以 follow 模式查看容器内部的日志。当你看到以下内容,说明应用正常启动了。按 Ctrl + C 退出。

4、现在,让我们对应用做一个修改。在 src/static/js/app.js 文件中,把 “Add Item” 按钮改成 “添加” 。这行代码应该在文件的 109 行。

修改之前,我们先来截图留念,修改之前是这个样子的:

修改代码:

5、刷新网页浏览器页面,就能看到我们所做的修改立即反映在:

6、可以随意去做其它修改。完成以后,停止容器,使用 docker build -t getting-started . 命令构建新镜像。

使用绑定挂载是非常常见的用于本地开发的设置。优点是开发机器不需要安装完整的构建工具和开发环境。只需要一个 docker run 命令,开发环境就可以拉下来,并且一切就绪。我们会在之后的步骤中,讨论 Docker Compose ,这会帮助我们简化命令(其实我们已经用了很多旗标了,是该简化以下了)。

回顾

现在,我们能够把我们的数据库持久化,快速响应投资者和老板们的需求。牛啊!但是,你猜怎么着?我们收到了好消息!

项目已经被选择用于未来的开发了!

为了给上线做准备,我们需要把我们的数据库从 SQLite 迁移成更有利于规模化的数据库引擎。简便起见,我们仍旧会保留关系型数据库,并把我们的应用切换成 MySQL。但是,我们怎么运行 MySQL 呢?我们又怎么让容器与容器之间相互沟通呢?下一期,我们不见不散!

如果您在阅读和操作中,有任何问题,欢迎评论区提出或者给我发私信哈。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
秦晓武
讨论数量: 0
发起讨论 只看当前版本


暂无话题~