使用绑定挂载
在第 4 部分中,您使用了卷挂载来持久化 data 的数据库。当您需要某个位置时,卷挂载是一个不错的选择 persistent 来存储您的应用程序数据。
绑定挂载是另一种类型的挂载,它允许您从 host 的文件系统中。在处理应用程序时,您可以 使用 Bind 挂载将源代码挂载到容器中。容器将看到 保存文件后立即对代码进行更改。这意味着 您可以在容器中运行监视文件系统更改的进程 并回应他们。
在本章中,您将了解如何使用 bind 挂载和名为 nodemon 的工具来监视文件更改,然后重新启动应用程序 自然而然。大多数其他语言都有等效的工具,并且 框架。
快速磁盘区类型比较
以下是命名卷和使用--mount
:
- 命名卷:
type=volume,src=my-volume,target=/usr/local/data
- 绑定挂载:
type=bind,src=/path/to/data,target=/usr/local/data
下表概述了卷挂载和 bind 之间的主要区别 坐骑。
命名卷 | 绑定挂载 | |
---|---|---|
房东位置 | Docker 选择 | 您决定 |
使用容器内容填充新卷 | 是的 | 不 |
支持卷驱动程序 | 是的 | 不 |
试用 bind 挂载
在了解如何使用 bind 挂载来开发应用程序之前, 您可以运行一个快速实验来实际了解如何绑定挂载 工作。
验证您的
getting-started-app
directory 位于 Docker Desktop 的文件共享设置。此设置定义 文件系统。有关访问设置的详细信息,请参阅文件共享。打开终端并将目录更改为
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
$ docker run -it --mount "type=bind,src=$($pwd),target=/src" ubuntu bash
这
--mount type=bind
option 告诉 Docker 创建一个绑定挂载,其中src
是 主机上的当前工作目录 (getting-started-app
) 和target
是该目录在容器内应显示的位置 (/src
).运行命令后,Docker 会启动一个交互式
bash
session 中的 容器文件系统的根目录。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
file 位于目录中。├── 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
.
这就是对 bind mounts 的简要介绍。此过程 演示了如何在主机和容器之间共享文件,以及如何 变化会立即反映在双方。现在您可以使用 绑定挂载以开发软件。
开发容器
使用绑定挂载在本地开发设置中很常见。优点是开发计算机不需要安装所有生成工具和环境。使用单个 docker run 命令,Docker 可以提取依赖项和工具。
在开发容器中运行应用
以下步骤描述了如何使用 bind 运行开发容器 mount 执行以下作:
- 将源代码装载到容器中
- 安装所有依赖项
- 开始
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
- 设置 “working directory” 或当前目录 命令将从--mount type=bind,src="$(pwd)",target=/app
- bind 挂载当前 目录中的/app
目录中的目录node:18-alpine
- 要使用的镜像。请注意,这是 Dockerfile 中的应用程序sh -c "yarn install && yarn run dev"
- 命令。您正在启动 shell 使用sh
(Alpine 没有bash
) 并运行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
- 设置 “working directory” 或当前目录 命令将从--mount "type=bind,src=$pwd,target=/app"
- bind 挂载当前 目录中的/app
目录中的目录node:18-alpine
- 要使用的镜像。请注意,这是 Dockerfile 中的应用程序sh -c "yarn install && yarn run dev"
- 命令。您正在启动 shell 使用sh
(Alpine 没有bash
) 并运行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
- 设置 “working directory” 或当前目录 命令将从--mount "type=bind,src=%cd%,target=/app"
- bind 挂载当前 目录中的/app
目录中的目录node:18-alpine
- 要使用的镜像。请注意,这是 Dockerfile 中的应用程序sh -c "yarn install && yarn run dev"
- 命令。您正在启动 shell 使用sh
(Alpine 没有bash
) 并运行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
- 设置 “working directory” 或当前目录 命令将从--mount type=bind,src="/$(pwd)",target=/app
- bind 挂载当前 目录中的/app
目录中的目录node:18-alpine
- 要使用的镜像。请注意,这是 Dockerfile 中的应用程序sh -c "yarn install && yarn run dev"
- 命令。您正在启动 shell 使用sh
(Alpine 没有bash
) 并运行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
当前正在运行的容器。
使用 bind 挂载运行镜像。
选择 Docker Desktop 顶部的搜索框。
在搜索窗口中,选择 Images 选项卡。
在搜索框中,指定容器名称
getting-started
.提示
使用搜索筛选条件筛选镜像并仅显示本地镜像。
选择您的镜像,然后选择 Run (运行)。
选择 Optional settings (可选设置)。
在 Host path (主机路径) 中,指定
getting-started-app
目录中。在 Container path (容器路径) 中,指定
/app
.选择 Run (运行)。
您可以使用 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
使用 development container 开发应用程序
在主机上更新应用程序,并查看容器中反映的更改。
在
src/static/js/app.js
文件, 在线 109,将 “Add Item” 按钮改为 “Add”:- {submitting ? 'Adding...' : 'Add Item'} + {submitting ? 'Adding...' : 'Add'}
保存文件。
在 Web 浏览器中刷新页面,您应该会看到反映的更改 几乎立即因为 Bind Mount 而来。Nodemon 检测到更改并 重新启动服务器。Node 服务器可能需要几秒钟才能 重新启动。如果您收到错误,请在几秒钟后尝试刷新。
请随意进行您想要进行的任何其他更改。每次您创建 更改并保存文件,则更改会反映在容器中,因为 绑定坐骑。当 Nodemon 检测到更改时,它会在 容器。完成后,停止容器并构建 新镜像使用:
$ docker build -t getting-started .
总结
此时,您可以保留数据库并在开发时查看应用程序中的更改,而无需重新构建镜像。
除了卷挂载和绑定挂载之外,Docker 还支持其他挂载 类型和存储驱动程序,用于处理更复杂和专业的使用案例。
相关信息:
后续步骤
为了准备用于生产的应用程序,您需要迁移数据库 从在 SQLite 中工作到可以更好地扩展的东西。为 简单性,您可以继续使用关系数据库并切换应用程序 以使用 MySQL。但是,您应该如何运行 MySQL?如何允许容器 彼此交谈?您将在下一节中了解这一点。