使用绑定挂载

第 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 挂载来开发应用程序之前, 您可以运行一个快速实验来实际了解如何绑定挂载 工作。

  1. 验证您的getting-started-appdirectory 位于 Docker Desktop 的文件共享设置。此设置定义 文件系统。有关访问设置的详细信息,请参阅文件共享

  2. 打开终端并将目录更改为getting-started-app目录。

  3. 运行以下命令以启动bashubuntu容器,其中有一个 绑定挂载。


    $ 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=bindoption 告诉 Docker 创建一个绑定挂载,其中src是 主机上的当前工作目录 (getting-started-app) 和target是该目录在容器内应显示的位置 (/src).

  4. 运行命令后,Docker 会启动一个交互式bashsession 中的 容器文件系统的根目录。

    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
    
  5. 将目录更改为src目录。

    这是您在启动容器时挂载的目录。清单 此目录的内容显示的文件与getting-started-app目录中。

    root@ac1237fad8db:/# cd src
    root@ac1237fad8db:/src# ls
    Dockerfile  node_modules  package.json  spec  src  yarn.lock
    
  6. 创建一个名为myfile.txt.

    root@ac1237fad8db:/src# touch myfile.txt
    root@ac1237fad8db:/src# ls
    Dockerfile  myfile.txt  node_modules  package.json  spec  src  yarn.lock
    
  7. 打开getting-started-app目录中的myfile.txtfile 位于目录中。

    ├── getting-started-app/
    │ ├── Dockerfile
    │ ├── myfile.txt
    │ ├── node_modules/
    │ ├── package.json
    │ ├── spec/
    │ ├── src/
    │ └── yarn.lock
  8. 从主机中删除myfile.txt文件。

  9. 在容器中,列出app目录。请注意,该文件现在已消失。

    root@ac1237fad8db:/src# ls
    Dockerfile  node_modules  package.json  spec  src  yarn.lock
    
  10. 停止交互式容器会话Ctrl + D.

这就是对 bind mounts 的简要介绍。此过程 演示了如何在主机和容器之间共享文件,以及如何 变化会立即反映在双方。现在您可以使用 绑定挂载以开发软件。

开发容器

使用绑定挂载在本地开发设置中很常见。优点是开发计算机不需要安装所有生成工具和环境。使用单个 docker run 命令,Docker 可以提取依赖项和工具。

在开发容器中运行应用

以下步骤描述了如何使用 bind 运行开发容器 mount 执行以下作:

  • 将源代码装载到容器中
  • 安装所有依赖项
  • 开始nodemon监视文件系统更改

您可以使用 CLI 或 Docker Desktop 运行带有绑定挂载的容器。


  1. 确保您没有任何getting-started当前正在运行的容器。

  2. 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.
  3. 您可以使用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.

  1. 确保您没有任何getting-started当前正在运行的容器。

  2. 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.
  3. 您可以使用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.

  1. 确保您没有任何getting-started当前正在运行的容器。

  2. 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.
  3. 您可以使用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.

  1. 确保您没有任何getting-started当前正在运行的容器。

  2. 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.
  3. 您可以使用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 挂载运行镜像。

  1. 选择 Docker Desktop 顶部的搜索框。

  2. 在搜索窗口中,选择 Images 选项卡。

  3. 在搜索框中,指定容器名称getting-started.

    提示

    使用搜索筛选条件筛选镜像并仅显示本地镜像

  4. 选择您的镜像,然后选择 Run (运行)。

  5. 选择 Optional settings (可选设置)。

  6. Host path (主机路径) 中,指定getting-started-app目录中。

  7. Container path (容器路径) 中,指定/app.

  8. 选择 Run (运行)。

您可以使用 Docker Desktop 查看容器日志。

  1. 选择 Docker Desktop 中的容器。
  2. 选择您的容器名称。

当您看到以下内容时,您就会知道您已准备好:

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 开发应用程序

在主机上更新应用程序,并查看容器中反映的更改。

  1. src/static/js/app.js文件, 在线 109,将 “Add Item” 按钮改为 “Add”:

    - {submitting ? 'Adding...' : 'Add Item'}
    + {submitting ? 'Adding...' : 'Add'}
    

    保存文件。

  2. 在 Web 浏览器中刷新页面,您应该会看到反映的更改 几乎立即因为 Bind Mount 而来。Nodemon 检测到更改并 重新启动服务器。Node 服务器可能需要几秒钟才能 重新启动。如果您收到错误,请在几秒钟后尝试刷新。

    Screenshot of updated label for Add button
  3. 请随意进行您想要进行的任何其他更改。每次您创建 更改并保存文件,则更改会反映在容器中,因为 绑定坐骑。当 Nodemon 检测到更改时,它会在 容器。完成后,停止容器并构建 新镜像使用:

    $ docker build -t getting-started .
    

总结

此时,您可以保留数据库并在开发时查看应用程序中的更改,而无需重新构建镜像。

除了卷挂载和绑定挂载之外,Docker 还支持其他挂载 类型和存储驱动程序,用于处理更复杂和专业的使用案例。

相关信息:

后续步骤

为了准备用于生产的应用程序,您需要迁移数据库 从在 SQLite 中工作到可以更好地扩展的东西。为 简单性,您可以继续使用关系数据库并切换应用程序 以使用 MySQL。但是,您应该如何运行 MySQL?如何允许容器 彼此交谈?您将在下一节中了解这一点。