docker教程系列五
导航
给docker加上数据持久
数据券介绍
我们可以在概念上把docker看做虚拟机,当容器被删除的时候,容器里所有数据都会被删除,两个不同容器之间无法互通
可以把数据卷理解为虚拟机的虚拟磁盘,他是独立于容器的文件.在容器中他被挂载为一个目录的形式.
对于容器中的应用来说,数据卷是透明的,无法感知它的存在,他就是一个普通的文件夹
由于数据卷独立于容器而存在,因此删除容器的时候数据卷也不会受影响。数据卷有以下优点:
- 多容器可以通过挂载同一个数据卷来共享数据
- 数据卷可以方便地备份,存储数据
数据卷的相关命令操作
1 | # 创建一个volume |
在容器中使用数据卷
1 | # 先创建数据卷 |
以下例子用于演示数据卷保存数据的特性
1 | # 执行命令在容器的 /b.txt 写入时间内容并查看 |
共享目录
除了挂载数据卷以外,docker还可以挂载共享目录(这一点和虚拟机一样),共享目录的优势是使用方便,易于理解,可以在某些场景下方便使用
(比如开发是在宿主机中修改源代码docker中实时生效省却build镜像的过程)
下面用一个具体的例子来演示挂载共享目录的用法:
- 在当前目录下创建index.html
1
2
3
4
5
6
7
8
9
10
<html>
<head>
<meta charset="utf-8">
<title>volume</title>
</head>
<body>
<h1>这是一个在宿主机的 index.html 文件。</h1>
</body>
</html> - 打开终端输入
1
2
3
4
5
6
7
8
9
10
11
12# 下面的命令会从nginx镜像运行一个名为nginx1的容器
# 并且设置了8080:80的端口映射
# --mount 参数的 type=bind 表明要挂载的共享目录
# 把宿主机的当前目录映射为容器的 /usr/share/nginx/html (这是nginx容器的静态页面文件存放路径)
# 这样在宿主机中访问localhost:8080会自动访问宿主机当前目录下的index.html文件 (这是nginx的默认静态文件首页)
docker run -p 8080:80 --name nginx1 --mount type=bind,source="${PWD}",target=/usr/share/nginx/html/ nginx
# 需要注意的是source参数必须使用绝对路径
# 所以这里使用"${PWD}"的方式来在 Mac/Linux/Windows 中获取当前目录路径
# 这是一个可以在多平台通用的获取当前目录路径的方法 (windows下必须使用PowerShell)
# 加引号是因为路径中可能含有空格等特殊符号,如果路径有空格而未加引号,会产生错误 - 打开浏览器输入: localhost:8080
其他挂载模式
除了挂载整个目录,还可以单独挂载一个文件。 如果要挂载单个文件,一定要要保证宿主机文件存在,否则整个路径会被认为是一个目录挂载
- 创建index.html, 随便写点东西
- 打开终端输入以下命令注意:可以创建多文件挂载
1
2
3
4
5
6
7docker run -p 8081:80 \
--name nginx2 \
--mount type=bind,source="${PWD}"/index.html,target=/usr/share/nginx/html/test.html \
nginx
# 这时候我们访问http://localhost:8081 返回的是nginx的默认首页
# 而访问http:/localhost:8081/test.html 返回的是挂载的单个文件1
2
3
4
5docker run -p 8082:80 \
--name nginx3 \
--mount type=bind,source="${PWD}"/index.html,target=/usr/share/nginx/test.html/ \
--mount type=bind,source="${PWD}"/test.html,target=/usr/share/nginx/test2.html/ \
nginx