Docker卷(volume)绑定装载

卷(volume)绑定装载

在上一篇文章中,讨论了使用数据卷挂载来持久化数据库中的数据。当你需要持久化你的应用的数据时,数据卷挂载是一个非常好的选择。
绑定挂载是另外一种数据卷挂载,允许将主机系统中的目录共享到容器中。当使用一个应用时,可以使用绑定挂载将源码挂载到容器中。容器可以马上发现你对源码文件做的修改,这意味着可以在容器中运行进程来监视文件的变更并迅速做出响应。
在本文中,将介绍如何使用绑定挂载和一个名为nodemon的工具来监视文件的变更,以及应用的自动重启。在其他编程语言和框架中,有请多类似的工具。

volume类型对比

命名卷绑定挂载
宿主机上的位置Docker自主选择自己指定
挂载示例type=volume,src=my-volume,target=/usr/local/datatype=bind,src=/path/to/data,target=/usr/local/data
是否用容器内容填充新的卷
是否支持卷驱动

后两项暂时不用关心,后续文章中会专门介绍卷。

测试挂载绑定

在尝试如何在我们的应用中使用绑定挂载之前,先做一个实验,对绑定挂载如何工作有一个实际的理解。
如果是在windows上执行下面的操作,确保使用PowerShell,不要用命令终端(cmd)

  1. 打开终端,确认当前工作目录是“待办应用”(参见http://t.csdn.cn/N4Gkt)的app目录。
  2. 运行下面的命令,在ubuntu容器中开启一个bash,该容器使用了绑定挂载。
    1. 如果你在Mac或Linux上操作,使用下面的命令:
docker run -it --mount type=bind,src="$(pwd)",target=/src ubuntu bash
  1. 如果你在windows上操作,在PowerShell中执行下面的命令。
docker run -it --mount "type=bind,src=$pwd,target=/src" ubuntu bash

--mount选项告诉Docker创建一个绑定挂载,src所指是你电脑当前的工作目录(getting-started/app),target是应该出现在容器中的目录(src

  1. 执行上面的命令后,Docker在容器的根目录下启动了一个交互式bash会话。
root@adf12gf:/# pwd
/
root@adf12gf:/# ls
bin   dev  home  media  opt   root  sbin  srv  tmp  var
boot  etc  lib   mnt    proc  run   src   sys  usr
  1. 现在,修改src目录。

此目录是在启动容器时挂载的目录,目录中的内容和你宿主机上的getting-started/app相同

root@adf12gf:/# cd src
root@adf12gf:/src# ls
Dockerfile  node_modules  package.json  spec  src  yarn.lock
  1. 创建一个新的文件myfile.txt
root@adf12gf:/src# touch myfile.txt
root@adf12gf:/src# ls
Dockerfile  myfile.txt  node_modules  package.json  spec  src  yarn.lock
  1. 现在打开宿主机上的目录,你会看到myfile.txt文件已被创建。
  2. 在宿主机上,删除myfile.txt
  3. 在容器内,再次查看app目录下的内容,会发现该文件已消失。
  4. Ctrl+D关闭和容器的交互式会话

上面就是对绑定挂载的简要介绍,该过程展示了文件如何在宿主机和容器之间共享文件,如何让对文件的修改快速在两端展现。接下来让我们使用绑定挂载开发软件。

在开发环境的容器中运行应用

下面将展示如何运行一个挂载绑定的、开发环境的容器:

  • 将我们的源码挂载到容器中
  • 安装所有的依赖
  • 运行nodemon来监控文件系统的变化。
  1. 确认现在没有运行任何getting-started容器(参见http://t.csdn.cn/N4Gkt
  2. getting-started目录下运行以下命令。
    1. 如果使用的是Mac或Linux,使用下面的命令
docker run -dp 3000:3000 \
    -w /app --mount type=bind,src="$(pwd)",target=/app \
    node:18-alpine \
    sh -c "yarn install && yarn run dev"
  1. 如果使用的Windows,在PowerShell中输入以下命令
docker run -dp 3000:3000 `
    -w /app --mount "type=bind,src=$pwd,target=/app" `
    node:18-alpine `
    sh -c "yarn install && yarn run dev"
  • -dp 3000:3000以后台方式运行,创建端口映射。
  • -w /app设置工作目录,或设置命令从当前目录开始执行。
  • --mount type=bind,src="$(pwd)",target=/app绑定挂载宿主机的当前目录到容器中的/app目录。
  • node:18-alpine使用的镜像。在Dockerfile中,这是我们应用的基础镜像。
  • sh -c "yarn install && yarn run dev"待执行的命令。使用sh启动一个shell(alpine中没有bash),然后运行yarn install来安装包,再执行yarn run dev来启动开发服务。如果我们查看package.json,就会看到dev脚本启动nodemon
  1. 可以使用docker logs <container-id>来查看容器日志。看到下面内容时,表明已经准备好。
docker logs -f <container-id>
nodemon src/index.js
[nodemon] 2.0.20
[nodemon] to restart at any time, enter `rs`
[nodemon] watching dir(s): *.*
[nodemon] starting `node src/index.js`
Using sqlite database at /etc/todos/todo.db
Listening on port 3000

看完日志后,使用Ctrl+C退出。

  1. 接下来,修改应用。在文件src/static/js/app.js第109行,修改"Add Item"按钮,改为"Add",然后保存文件
- {submitting ? 'Adding...' : 'Add Item'}
+ {submitting ? 'Adding...' : 'Add'}
  1. 刷新浏览器页面,几乎可以马上看到上面所做的修改,Node服务重启需要几秒钟。如果遇到错误,等几秒再刷新。
  2. 根据自己意愿,尝试其他修改。每次完成一个修改,保存文件后,nodemon进程自动重启容器中的应用。完成修改后,停止容器,并重新构建镜像。
docker build -t getting-started .

本地开发中,绑定挂载很常用。好处是开发机器不需要有全部构建工具和环境。使用docker run命令,所有依赖和工具都被拉取下来。后面会讲到Docker Compose,这个会简化我们的命令。
另外,对于卷挂载和绑定挂载,Docker同样支持其他挂载类型和存储驱动来处理更多复杂、专门的用例。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值