在上一章中,我们讨论了具名卷,并用它将我们数据库中的数据做了持久化。如果我们只是想要存储数据的话,具名卷再合适不过了,因为我们不需要担心数据存在哪里。
有了绑定挂载,我们就能够控制宿主机上确切的挂载点了。我们可以用它来做数据持久化,但是它通常用来给容器提供额外的数据。在开发应用的时候,我们能够使用绑定挂载将我们的源代码挂载进容器中,让容器能够看到代码变更,做出响应,同时马上让我们也能看到应用的修改效果。
对于基于Node的应用来说,nodemon是一个用来监控文件变化,进而重启应用的好帮手。至于其它编程语言或框架呢,大多数也都有相类似的工具。
简单的卷类型比较绑定挂载和具名卷是Docker引擎自带的2种主要类型的卷。不过还有支持其它使用情况的卷驱动器在,比如用于SFTP,Ceph,NetApp,S3等等。
具名卷和绑定挂载的对比如下:
启动一个开发模式的容器要让我们的容器支持开发工作流程,我们需要做几件事:
1、将源代码挂载进容器
2、安装所有依赖,包括开发依赖
3、启动nodemon来监控文件系统的修改
好了,让我们开始吧。
1、确保当前没有之前getting-started的容器在运行。
2、在教程范例项目所在的路径下,运行以下命令,后续会做解释:
dockerrun-dp:\
-w/app-v"$(pwd):/app"\
node:12-alpine\
sh-c"yarninstallyarnrundev"
你如果和我一样,现在是在PowerShell中运行命令的话,那么就使用下面这个命令:
dockerrun-dp:`
-w/app-v"$(pwd):/app"`
node:12-alpine`
sh-c"yarninstallyarnrundev"
-dp:和之前一样,以分离(后台)模式运行容器,并创建端口映射
-w/app设置了工作路径,或者说命令从哪里开始运行的路径
-v"$(pwd):/app"把宿主机中,当前执行这条命令所在的路径,挂载到容器中的/app路径
其中"$(pwd)"是WindowsPowerShell中的语法,运行pwd命令获取当前路径,并获取返回值对应的字符串。如图:
这也就是为什么要在教程范例项目所在的路径下运行命令的原因:所谓把当前路径映射到容器的/app其实就是把源代码直接映射到容器中。所以我是直接在vscode所集成的命令行中运行的。
node:12-alpine指定了作为容器运行基础的镜像。注意,这是Dockerfile中,为我们的应用所指定的基础镜像。
sh-c"yarninstallyarnrundev"
容器执行的命令。我们使用sh来启动shell,alpine没有bash。运行yarninstall来安装所有依赖,并运行yarnrundev,用来做什么呢?如果你看一眼package.json文件的话,我们会看到:dev脚本其实是在启动nodemon。
3、命令运行以后,因为项目需要下载依赖,可能要花些时间。怎么样才能知道项目已经正常启动了呢?可以使用dockerlogs-f容器id以follow模式查看容器内部的日志。当你看到以下内容,说明应用正常启动了。按Ctrl+C退出。
4、现在,让我们对应用做一个修改。在src/static/js/app.js文件中,把"AddItem"按钮改成"添加"。这行代码应该在文件的行。
修改之前,我们先来截图留念,修改之前是这个样子的:
修改代码:
5、刷新网页浏览器页面,就能看到我们所做的修改立即反映在:
6、可以随意去做其它修改。完成以后,停止容器,使用dockerbuild-tgetting-started.命令构建新镜像。
使用绑定挂载是非常常见的用于本地开发的设置。优点是开发机器不需要安装完整的构建工具和开发环境。只需要一个dockerrun命令,开发环境就可以拉下来,并且一切就绪。我们会在之后的步骤中,讨论DockerCompose,这会帮助我们简化命令(其实我们已经用了很多旗标了,是该简化以下了)。
回顾
现在,我们能够把我们的数据库持久化,快速响应投资者和老板们的需求。牛啊!但是,你猜怎么着?我们收到了好消息!
项目已经被选择用于未来的开发了!
为了给上线做准备,我们需要把我们的数据库从SQLite迁移成更有利于规模化的数据库引擎。简便起见,我们仍旧会保留关系型数据库,并把我们的应用切换成MySQL。但是,我们怎么运行MySQL呢?我们又怎么让容器与容器之间相互沟通呢?下一期,我们不见不散!
如果您在阅读和操作中,有任何问题,欢迎评论区提出或者给我发私信哈。