docker卷(volume)绑定装载-爱代码爱编程
卷(volume)绑定装载
在上一篇文章中,讨论了使用数据卷挂载来持久化数据库中的数据。当你需要持久化你的应用的数据时,数据卷挂载是一个非常好的选择。
绑定挂载是另外一种数据卷挂载,允许将主机系统中的目录共享到容器中。当使用一个应用时,可以使用绑定挂载将源码挂载到容器中。容器可以马上发现你对源码文件做的修改,这意味着可以在容器中运行进程来监视文件的变更并迅速做出响应。
在本文中,将介绍如何使用绑定挂载和一个名为nodemon的工具来监视文件的变更,以及应用的自动重启。在其他编程语言和框架中,有请多类似的工具。
volume类型对比
命名卷 | 绑定挂载 | |
---|---|---|
宿主机上的位置 | Docker自主选择 | 自己指定 |
挂载示例 | type=volume,src=my-volume,target=/usr/local/data | type=bind,src=/path/to/data,target=/usr/local/data |
是否用容器内容填充新的卷 | 是 | 否 |
是否支持卷驱动 | 是 | 否 |
后两项暂时不用关心,后续文章中会专门介绍卷。
测试挂载绑定
在尝试如何在我们的应用中使用绑定挂载之前,先做一个实验,对绑定挂载如何工作有一个实际的理解。
如果是在windows上执行下面的操作,确保使用PowerShell,不要用命令终端(cmd)
- 打开终端,确认当前工作目录是“待办应用”(参见http://t.csdn.cn/N4Gkt)的app目录。
- 运行下面的命令,在
ubuntu
容器中开启一个bash
,该容器使用了绑定挂载。- 如果你在Mac或Linux上操作,使用下面的命令:
docker run -it --mount type=bind,src="$(pwd)",target=/src ubuntu bash
- 如果你在windows上操作,在PowerShell中执行下面的命令。
docker run -it --mount "type=bind,src=$pwd,target=/src" ubuntu bash
--mount
选项告诉Docker创建一个绑定挂载,src
所指是你电脑当前的工作目录(getting-started/app
),target
是应该出现在容器中的目录(src
)
- 执行上面的命令后,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
- 现在,修改
src
目录。
此目录是在启动容器时挂载的目录,目录中的内容和你宿主机上的
getting-started/app
相同
root@adf12gf:/# cd src
root@adf12gf:/src# ls
Dockerfile node_modules package.json spec src yarn.lock
- 创建一个新的文件
myfile.txt
root@adf12gf:/src# touch myfile.txt
root@adf12gf:/src# ls
Dockerfile myfile.txt node_modules package.json spec src yarn.lock
- 现在打开宿主机上的目录,你会看到
myfile.txt
文件已被创建。 - 在宿主机上,删除
myfile.txt
。 - 在容器内,再次查看
app
目录下的内容,会发现该文件已消失。 Ctrl
+D
关闭和容器的交互式会话
上面就是对绑定挂载的简要介绍,该过程展示了文件如何在宿主机和容器之间共享文件,如何让对文件的修改快速在两端展现。接下来让我们使用绑定挂载开发软件。
在开发环境的容器中运行应用
下面将展示如何运行一个挂载绑定的、开发环境的容器:
- 将我们的源码挂载到容器中
- 安装所有的依赖
- 运行
nodemon
来监控文件系统的变化。
- 确认现在没有运行任何
getting-started
容器(参见http://t.csdn.cn/N4Gkt) - 在
getting-started
目录下运行以下命令。- 如果使用的是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"
- 如果使用的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
- 可以使用
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
退出。
- 接下来,修改应用。在文件
src/static/js/app.js
第109行,修改"Add Item"按钮,改为"Add",然后保存文件
- {submitting ? 'Adding...' : 'Add Item'}
+ {submitting ? 'Adding...' : 'Add'}
- 刷新浏览器页面,几乎可以马上看到上面所做的修改,Node服务重启需要几秒钟。如果遇到错误,等几秒再刷新。
- 根据自己意愿,尝试其他修改。每次完成一个修改,保存文件后,
nodemon
进程自动重启容器中的应用。完成修改后,停止容器,并重新构建镜像。
docker build -t getting-started .
本地开发中,绑定挂载很常用。好处是开发机器不需要有全部构建工具和环境。使用docker run
命令,所有依赖和工具都被拉取下来。后面会讲到Docker Compose,这个会简化我们的命令。
另外,对于卷挂载和绑定挂载,Docker同样支持其他挂载类型和存储驱动来处理更多复杂、专门的用例。