本篇博客内容来源于官方文档:docker docs/Get started/part 6: User bind mounts


在上一篇博客中,我们学习了如何将数据保留在绑定的数据卷中。本文中我们将介绍另外一种保存数据的方法:挂载主机目录,可以将主机文件系统中的目录共享到容器中。通过这种方法,只要一保存文件就能在容器中看到即时的变动

两种数据保存方式的比较

docker 挂载的磁盘不释放 docker挂载路径_Docker

动手尝试挂载主机目录

接下来我们使用几行代码来快速了解一下如何挂载主机目录

  1. Hyper-V模式下运行的Docker需要查看设置中File Sharing这项,其他的自动开启跳过这项 官方帮助文档
  2. 打开我们之前下载的getting-started-app文件夹,按住Shift加鼠标右键打开PowerShell界面
docker run -it --mount "type=bind,src=$pwd,target=/src" ubuntu bash
  1. 成功运行后,Docker将在容器文件系统的根目录下启动交互式会话
pwd # 打印当前目录
ls # 显示当前目录下的文件
cd src # 切换到src目录下
ls
  1. 可以看到当前显示内容与我们主机上的目录文件相同
  2. docker 挂载的磁盘不释放 docker挂载路径_学习_02


  3. docker 挂载的磁盘不释放 docker挂载路径_docker 挂载的磁盘不释放_03

  4. 在交互式会话中运行以下代码创建一个新文件,再返回主机上的文件管理器查看是否成功
touch myfile.txt # 创建名为myfile的txt文件
  1. 创建成功后,再通过文件管理器删除,看交互式会话中是否同步显示
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
  1. 以上过程演示了如何在主机与容器之间共享文件,以及如何立即在两端显示更改。现在我们可以使用该方法来开发软件。

开发容器

使用挂载主机目录来同步数据是本地开发中的常见操作,优点是开发机器不需要安装任何构建工具和环境,只需要通过docker run命令,Docker即可提取依赖项和工具。

在开发容器中运行应用程序

  • 将源代码装载之容器中
  • 安装所有依赖项
  • 使用nodemon来监视文件系统
  1. 停止当前getting-started容器的运行
  2. 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 挂载的磁盘不释放 docker挂载路径_学习_04

  1. 使用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

使用开发容器来开发你的应用程序

  1. 在当前的getting-started-app-main文件夹中,找到src\static\js\app.js文件,编辑其中的109行
{submitting ? 'Adding...' : 'Add Item'}
# ↓修改为
{submitting ? 'Adding...' : '添加待办'}
  1. 保存文件后刷新页面,可以看到已同步更改
  2. 当我们完成开发工作后,可以停止该容器,重新打包镜像
docker build -t getting-started:v0.1 .
  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 <镜像名:版本名> <地址>
# 打包镜像