本篇博客内容来源于官方文档:docker docs/Get started/part 6: User bind mounts
在上一篇博客中,我们学习了如何将数据保留在绑定的数据卷中。本文中我们将介绍另外一种保存数据的方法:挂载主机目录,可以将主机文件系统中的目录共享到容器中。通过这种方法,只要一保存文件就能在容器中看到即时的变动
两种数据保存方式的比较
动手尝试挂载主机目录
接下来我们使用几行代码来快速了解一下如何挂载主机目录
Hyper-V
模式下运行的Docker需要查看设置中File Sharing
这项,其他的自动开启跳过这项 官方帮助文档- 打开我们之前下载的
getting-started-app
文件夹,按住Shift
加鼠标右键打开PowerShell
界面
docker run -it --mount "type=bind,src=$pwd,target=/src" ubuntu bash
- 成功运行后,Docker将在容器文件系统的根目录下启动交互式会话
pwd # 打印当前目录
ls # 显示当前目录下的文件
cd src # 切换到src目录下
ls
- 可以看到当前显示内容与我们主机上的目录文件相同
- 在交互式会话中运行以下代码创建一个新文件,再返回主机上的文件管理器查看是否成功
touch myfile.txt # 创建名为myfile的txt文件
- 创建成功后,再通过文件管理器删除,看交互式会话中是否同步显示
root@632a8a288162:/src# ls
Dockerfile README.md myfile.txt package.json spec src yarn.lock
# 在Windows文件管理器中删除myfile.txt
root@632a8a288162:/src# ls
Dockerfile README.md package.json spec src yarn.lock
- 以上过程演示了如何在主机与容器之间共享文件,以及如何立即在两端显示更改。现在我们可以使用该方法来开发软件。
开发容器
使用挂载主机目录来同步数据是本地开发中的常见操作,优点是开发机器不需要安装任何构建工具和环境,只需要通过docker run
命令,Docker即可提取依赖项和工具。
在开发容器中运行应用程序
- 将源代码装载之容器中
- 安装所有依赖项
- 使用
nodemon
来监视文件系统
- 停止当前
getting-started
容器的运行 - 在
powershell
中运行以下命令
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"
代码的详细介绍:
- 使用
docker logs <container-id>
命令来打印容器日志
docker logs -f <container-id>
# ↓ ↓ 日志如下 ↓ ↓
yarn install v1.22.19
[1/4] Resolving packages...
success Already up-to-date.
Done in 0.69s.
yarn run v1.22.19
$ 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
使用开发容器来开发你的应用程序
- 在当前的
getting-started-app-main
文件夹中,找到src\static\js\app.js
文件,编辑其中的109行
{submitting ? 'Adding...' : 'Add Item'}
# ↓修改为
{submitting ? 'Adding...' : '添加待办'}
- 保存文件后刷新页面,可以看到已同步更改
- 当我们完成开发工作后,可以停止该容器,重新打包镜像
docker build -t getting-started:v0.1 .
- 运行打包后的镜像,可以看到更改项都被成功保存。一个完整的开发流程结束。
相关操作命令
接下来让我们回顾一些本篇教程学习到的命令及相关操作代码
docker run -it --mount "type=bind,src=$pwd,target=/src" <镜像名> bash
# 挂载主机目录
docker run -dp <映射地址> `
-w /app --mount "type=bind,src=$pwd,target=/app" `
node:18-alpine `
sh -c "yarn install && yarn run dev"
# 在开发容器中运行应用
docker logs <container-id>
# 打印容器日志
docker build -t <镜像名:版本名> <地址>
# 打包镜像