使用绑定安装
在 中,您使用卷装载将数据保留在数据库中。当您需要持久存储应用程序数据时,卷挂载是一个不错的选择。
绑定挂载是另一种类型的挂载,它允许您将主机文件系统中的目录共享到容器中。在处理应用程序时,您可以使用绑定挂载将源代码挂载到容器中。一旦您保存文件,容器就会立即看到您对代码所做的更改。这意味着您可以在容器中运行进程来监视文件系统更改并对其做出响应。
在本章中,您将了解如何使用绑定挂载和名为 的工具来监视文件更改,然后自动重新启动应用程序。大多数其他语言和框架都有等效的工具。
以下是使用命名卷和绑定安装的示例--mount:
- 命名卷:
type=volume,src=my-volume,target=/usr/local/data - 绑定挂载:
type=bind,src=/path/to/data,target=/usr/local/data
下表概述了卷安装和绑定安装之间的主要区别。
| 命名卷 | 绑定坐骑 | |
|---|---|---|
| 主办地点 | Docker 选择 | 你决定 |
| 使用容器内容填充新卷 | 是的 | 不 |
| 支持卷驱动程序 | 是的 | 不 |
在了解如何使用绑定安装来开发应用程序之前,您可以运行一个快速实验来实际了解绑定安装的工作原理。
-
验证您的
getting-started-app目录是否位于 Docker Desktop 的文件共享设置中定义的目录中。此设置定义您可以与容器共享文件系统的哪些部分。有关访问该设置的详细信息,请参阅适用于 、 或 的主题。 -
打开终端并将目录更改为该
getting-started-app目录。 -
运行以下命令以在具有绑定安装的容器
bash中启动。ubuntuMac / Linux / PowerShell 命令提示符 git 重击
$ docker run -it --mount type=bind,src="$(pwd)",target=/src ubuntu bash$ docker run -it --mount "type=bind,src=%cd%,target=/src" ubuntu bash$ docker run -it --mount type=bind,src="/$(pwd)",target=/src ubuntu bash
该
--mount type=bind选项告诉 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 通过绑定挂载来运行容器。
Mac/Linux 命令行界面 PowerShell CLI 命令提示符 CLI Git Bash CLI Docker 桌面
-
确保当前没有任何
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(alpine没有)启动shellbash并运行yarn install以安装软件包,然后运行yarn run dev以启动开发服务器。如果您查看package.json,您将看到dev脚本启动nodemon。
-
您可以使用查看日志
docker logs <container-id>。当您看到以下内容时,您就会知道您已准备好出发:$ docker logs -f <container-id> nodemon -L src/index.js [nodemon] 2.0.20 [nodemon] to restart at any time, enter `rs` [nodemon] watching path(s): *.* [nodemon] watching extensions: js,mjs,json [nodemon] starting `node src/index.js` Using sqlite database at /etc/todos/todo.db Listening on port 3000查看完日志后,按
Ctrl+退出C。
-
确保当前没有任何
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(alpine没有)启动shellbash并运行yarn install以安装软件包,然后运行yarn run dev以启动开发服务器。如果您查看package.json,您将看到dev脚本启动nodemon。
-
您可以使用查看日志
docker logs <container-id>。当您看到以下内容时,您就会知道您已准备好出发:$ docker logs -f <container-id> nodemon -L src/index.js [nodemon] 2.0.20 [nodemon] to restart at any time, enter `rs` [nodemon] watching path(s): *.* [nodemon] watching extensions: js,mjs,json [nodemon] starting `node src/index.js` Using sqlite database at /etc/todos/todo.db Listening on port 3000查看完日志后,按
Ctrl+退出C。
-
确保当前没有任何
getting-started容器正在运行。 -
从目录运行以下命令
getting-started-app。$ docker run -dp 127.0.0.1:3000:3000 ^ -w /app --mount "type=bind,src=%cd%,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=%cd%,target=/app"– 将当前目录从主机绑定挂载到/app容器中的目录node:18-alpine– 要使用的图像。请注意,这是来自 Dockerfile 的应用程序的基础映像sh -c "yarn install && yarn run dev"– 命令。您正在使用sh(alpine没有)启动shellbash并运行yarn install以安装软件包,然后运行yarn run dev以启动开发服务器。如果您查看package.json,您将看到dev脚本启动nodemon。
-
您可以使用查看日志
docker logs <container-id>。当您看到以下内容时,您就会知道您已准备好出发:$ docker logs -f <container-id> nodemon -L src/index.js [nodemon] 2.0.20 [nodemon] to restart at any time, enter `rs` [nodemon] watching path(s): *.* [nodemon] watching extensions: js,mjs,json [nodemon] starting `node src/index.js` Using sqlite database at /etc/todos/todo.db Listening on port 3000查看完日志后,按
Ctrl+退出C。
-
确保当前没有任何
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(alpine没有)启动shellbash并运行yarn install以安装软件包,然后运行yarn run dev以启动开发服务器。如果您查看package.json,您将看到dev脚本启动nodemon。
-
您可以使用查看日志
docker logs <container-id>。当您看到以下内容时,您就会知道您已准备好出发:$ docker logs -f <container-id> nodemon -L src/index.js [nodemon] 2.0.20 [nodemon] to restart at any time, enter `rs` [nodemon] watching path(s): *.* [nodemon] watching extensions: js,mjs,json [nodemon] starting `node src/index.js` Using sqlite database at /etc/todos/todo.db Listening on port 3000查看完日志后,按
Ctrl+退出C。
确保当前没有任何getting-started容器正在运行。
使用绑定安装运行映像。
-
选择 Docker Desktop 顶部的搜索框。
-
在搜索窗口中,选择图像选项卡。
-
在搜索框中,指定容器名称
getting-started。提示
使用搜索过滤器过滤图像并仅显示本地图像。
-
选择您的图像,然后选择“运行”。
-
选择可选设置。
-
在主机路径
getting-started-app中,指定主机上目录的路径。 -
在容器路径中,指定
/app。 -
选择运行。
您可以使用 Docker Desktop 查看容器日志。
- 在 Docker Desktop 中选择容器。
- 选择您的容器名称。
当您看到以下内容时,您就会知道您已准备好出发:
nodemon -L src/index.js [nodemon] 2.0.20 [nodemon] to restart at any time, enter `rs` [nodemon] watching path(s): *.* [nodemon] watching extensions: js,mjs,json [nodemon] starting `node src/index.js` Using sqlite database at /etc/todos/todo.db Listening on port 3000
在主机上更新您的应用程序并查看容器中反映的更改。
-
在
src/static/js/app.js文件的第 109 行,将“添加项目”按钮更改为简单地说“添加”:- {submitting ? 'Adding...' : 'Add Item'} + {submitting ? 'Adding...' : 'Add'}保存文件。
-
刷新 Web 浏览器中的页面,您应该会看到由于绑定安装而几乎立即反映的更改。 Nodemon 检测到更改并重新启动服务器。节点服务器可能需要几秒钟才能重新启动。如果出现错误,请尝试在几秒钟后刷新。
-
请随意进行您想要进行的任何其他更改。每次进行更改并保存文件时,由于绑定安装,更改都会反映在容器中。当 Nodemon 检测到更改时,它会自动重新启动容器内的应用程序。完成后,停止容器并使用以下命令构建新映像:
$ docker build -t getting-started .
此时,您可以保留数据库并在开发时查看应用程序中的更改,而无需重建映像。
除了卷挂载和绑定挂载之外,Docker 还支持其他挂载类型和存储驱动程序,以处理更复杂和专门的用例。
相关信息:
为了准备您的应用程序进行生产,您需要将数据库从 SQLite 中的工作迁移到可以更好扩展的数据库。为简单起见,您将继续使用关系数据库并将应用程序切换为使用 MySQL。但是,应该如何运行 MySQL?如何让容器相互通信?您将在下一节中了解这一点。
