使用 bind mounts,我们可以控制在主机确切的挂载点。我们可以使用这个去保存数据,但是它总是在容器内部提供额外的数据。当一个应用工作时,我们可以使用 bind mount 去挂载我们的源代码到容器内,使其可以看见代码的改变,并且立即响应产生响应的改变。对于基于 Node 的应用,
nodemon
是一个优秀的工具去观察文件的改变并且重启应用。
volume 类型比较
bind mount
和 named volume
是 Docker 引擎主要使用的 volume
类型。额外的 volume
驱动器对于支持其他使用案例是可用的(SFTP、Ceph、NetApp、S3…)
Named Volumes | Bind Mounts | |
---|---|---|
Host Location | Docker chooses | You control |
Mount Example (using -v) | my-volume:/usr/local/data | /path/to/data:/usr/local/data |
Populates new volume with container contents | Yes | No |
Supports Volume Drivers | Yes | No |
启动一个 dev-mode 容器
为了运行我们的容器去支持开发工作负载,我们将会做下面这些事。
- 在容器中挂载我们的源代码
- 安装所有依赖,包括
dev
依赖 - 启动
nodemon
去观察文件系统的改变
- 确保没有
getting-started
容器运行 - 运行下面的指令
docker run -dp 3000:3000 -w /app -v "$(pwd):/app" node:12-alpine sh -c "yarn install
&& yarn run dev"
-dp 3000:3000
- 以detached
模块运行并建立端口映射。-w /app
- 设置工作文件夹,即命令将会从哪开始执行。-v "$(pwd):/app"
-bind mount
从主机的当前文件夹到 容器的/app
文件夹。node:12-alpine
- 使用的镜像。sh -c "yarn install && yarn run dev"
- 使用sh
开启一个shell
,然后运行yarn install
去安装所有的依赖然后运行yarn run dev
。我们可以在package.json
中看到dev
脚本是去启动nodemon
。
- 你可以使用
docker logs -f <container-id>
去看日志。
$ docker logs -f <container-id>
yarn install v1.22.17
[1/4] Resolving packages...
warning Resolution field "ansi-regex@5.0.1" is incompatible with requested version "ansi-regex@^2.0.0"
warning Resolution field "ansi-regex@5.0.1" is incompatible with requested version "ansi-regex@^3.0.0"
warning sqlite3 > node-gyp > request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142
warning sqlite3 > node-gyp > request > har-validator@5.1.5: this library is no longer supported
warning sqlite3 > node-gyp > request > uuid@3.4.0: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.
warning sqlite3 > node-gyp > tar@2.2.2: This version of tar is no longer supported, and will not receive security updates. Please upgrade asap.
[2/4] Fetching packages...
[3/4] Linking dependencies...
[4/4] Building fresh packages...
success Saved lockfile.
Done in 91.62s.
yarn run v1.22.17
$ nodemon src/index.js
[nodemon] 2.0.13
[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 行,将Add Item
改为Add
-
刷新页面,你就会看到改变反馈在浏览器上了。
-
停止容器,然后构建新的镜像,使用
docker build -t getting-started .
。
使用 bind mounts
是很正常的,对于开发设置。优势是设备机器不需要有任何构建工具和安装环境。仅仅使用 docker run
命令,设备环境就可以被下载和运行。