Docker用绑定挂载
卷挂载是在您需要一个持久存储应用程序数据的地方时的一个很好选择。
绑定挂载是另一种类型的挂载,它允许您将主机文件系统中的目录共享到容器中。在开发应用程序时,您可以使用绑定挂载将源代码挂载到容器中。容器立即看到您对代码所做的更改,只要您保存文件。这意味着您可以在容器中运行监视文件系统变化并对其做出响应的进程。
在本章中,您将看到如何使用绑定挂载和一个名为nodemon的工具来监视文件更改,然后自动重新启动应用程序。大多数其他语言和框架都有类似的工具。
快速卷类型比较
以下表格概述了卷挂载和绑定挂载之间的主要区别。
命名卷 | 绑定挂载 | |
---|---|---|
主机位置 | Docker选择 | 由您决定 |
挂载示例(使用–mount) | type=volume,src=my-volume,target=/usr/local/data | type=bind,src=/path/to/data,target=/usr/local/data |
使用容器内容填充新卷 | 是 | 否 |
支持卷驱动程序 | 是 | 否 |
绑定挂载工作原理
在了解如何使用绑定挂载来开发应用程序之前,您可以运行一个快速实验,以便实际了解绑定挂载的工作原理。
注意:
如果您使用Windows并希望使用Git Bash运行Docker命令,请参阅有关语法差异的Git Bash使用指南。
- 打开终端并切换到getting-started-app目录。
- 运行以下命令,在一个带有绑定挂载的Ubuntu容器中启动bash。
docker run -it --mount type=bind,src="$(pwd)",target=/src ubuntu bash
–mount选项告诉Docker创建一个绑定挂载,其中src是主机机器上当前的工作目录(getting-started-app),而target是容器内该目录应该出现的位置(/src)。
运行该命令后,Docker会在容器文件系统的根目录下启动一个交互式的bash会话。
root@ac1237fad8db:/# pwd / root@ac1237fad8db:/# 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@ac1237fad8db:/# cd src root@ac1237fad8db:/src# ls Dockerfile node_modules package.json spec src yarn.lock
- 创建一个名为myfile.txt的新文件。
root@ac1237fad8db:/src# touch myfile.txt root@ac1237fad8db:/src# ls Dockerfile myfile.txt node_modules package.json spec src yarn.lock
- 打开主机上的getting-started-app目录,并观察到该目录中存在myfile.txt文件。
├── getting-started-app/ │ ├── Dockerfile │ ├── myfile.txt │ ├── node_modules/ │ ├── package.json │ ├── spec/ │ ├── src/ │ └── yarn.lock
从主机上删除myfile.txt文件。
在容器中再次列出app目录的内容。观察到该文件现在已经消失。
root@ac1237fad8db:/src# ls Dockerfile node_modules package.json spec src yarn.lock
- 使用Ctrl + D停止交互式容器会话。
这就是关于绑定挂载的简要介绍。此过程演示了文件如何在主机和容器之间共享,并且更改会立即在两者之间反映出来。现在您可以使用绑定挂载来开发软件了。
开发容器
在本地开发设置中,使用绑定挂载是常见的做法。其优势在于开发机器无需安装所有的构建工具和环境。使用单个docker run命令,Docker会拉取依赖项和工具。
在开发容器中运行您的应用程序
以下步骤描述了如何在绑定挂载的开发容器中运行应用程序,具体步骤如下:
- 将源代码挂载到容器中
- 安装所有依赖项
- 启动nodemon以监听文件系统的变化
- 您可以使用CLI或Docker Desktop来运行带有绑定挂载的容器。
确保您当前没有运行任何getting-started容器。
从getting-started-app目录中运行以下命令。
docker run -dp 127.0.0.1:3000:3000 \ -w /app --mount type=bind,src="$(pwd)",target=/app \ node:18-alpine \ sh -c "yarn install && yarn run dev"
以下是该命令的解释:
- -dp 127.0.0.1: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 <容器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'}
保存文件。
在Web浏览器中刷新页面,您应该几乎立即看到更改的效果。可能需要几秒钟才能重新启动Node服务器。如果出现错误,请等待几秒钟后再次刷新。
您可以随意进行其他更改。每次进行更改并保存文件时,nodemon进程会自动重新启动容器中的应用程序。完成后,停止容器并使用以下命令构建新的镜像:
docker build -t getting-started .