使用绑定安装
在 第 5 部分中,您使用卷装载将数据保留在数据库中。当您需要持久存储应用程序数据时,卷挂载是一个不错的选择。
绑定挂载是另一种类型的挂载,它允许您将主机文件系统中的目录共享到容器中。在处理应用程序时,您可以使用绑定挂载将源代码挂载到容器中。一旦您保存文件,容器就会立即看到您对代码所做的更改。这意味着您可以在容器中运行进程来监视文件系统更改并对其做出响应。
在本章中,您将了解如何使用绑定挂载和名为 nodemon的工具来监视文件更改,然后自动重新启动应用程序。大多数其他语言和框架都有等效的工具。
快速体积类型比较
以下是使用命名卷和绑定安装的示例--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 的文件共享设置中定义的目录中。此设置定义您可以与容器共享文件系统的哪些部分。有关访问该设置的详细信息,请参阅适用于 Mac、 Windows或 Linux的主题。打开终端并将目录更改为该
getting-started-app
目录。运行以下命令以在具有绑定安装的容器
bash
中启动。ubuntu
$ 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 通过绑定挂载来运行容器。
确保当前没有任何
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?如何让容器相互通信?您将在下一节中了解这一点。