咱们能够在概念上把docker看作虚拟机,当容器被删除的时候,容器里全部数据都会被删除,两个不一样容器之间没法互通
能够把数据卷理解为虚拟机的虚拟磁盘,他是独立于容器的文件.在容器中他被挂载为一个目录的形式.
对于容器中的应用来讲,数据卷是透明的,没法感知它的存在,他就是一个普通的文件夹
因为数据卷独立于容器而存在,所以删除容器的时候数据卷也不会受影响。数据卷有如下优势:html
# 建立一个volume docker volume create testvolume # 列出全部数据卷 docker volume ls # 删除一个数据卷 docker volume rm testvolume
# 先建立数据卷 docker volume create web # 在运行容器的时候,使用参数--mount 以下 # 下面的参数含义是把数据卷(web)挂载到容器的/volume目录上面 # 这里的webimage 镜像能够用我前面文章写得Dockerfile生成 # 这样就运行了一个带有数据卷的容器,这个容器的/volume目录中的内容在容器被删除以后仍然存在. # 由于它其实是存在Docker数据卷中。 docker run -d --name demovolume --mount source=web,target=/volume webimage
# 执行命令在容器的 /b.txt 写入时间内容并查看 docker exec demovolume sh -c 'date > /b.txt' docker exec demovolume sh -c 'cat /b.txt' # 删除容器后从新启动一个同名容器在查看,以前容器的内容已经没有了 docker rm -f demovolume docker run -d --name demovolume --mount source=web,target=/volume webimage docker exec demovolume sh -c 'cat /b.txt' # 保存在数据卷上的文件,即便容器被删除仍然存在 docker exec demovolume sh -c 'date > /volume/b.txt' docker rm -f demovolume docker run -d --name demovolume --mount source=web,target=/volume webimage docker exec demovolume sh -c 'cat /volume/b.txt'
除了挂载数据卷之外,docker还能够挂载共享目录(这一点和虚拟机同样),共享目录的优点是使用方便,易于理解,能够在某些场景下方便使用
(好比开发是在宿主机中修改源代码docker中实时生效省却build镜像的过程)
下面用一个具体的例子来演示挂载共享目录的用法:nginx
在当前目录下建立index.htmlgit
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>volume</title> </head> <body> <h1>这是一个在宿主机的 index.html 文件。</h1> </body> </html>
打开终端输入github
# 下面的命令会从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) # 加引号是由于路径中可能含有空格等特殊符号,若是路径有空格而未加引号,会产生错误
除了挂载整个目录,还能够单独挂载一个文件。 若是要挂载单个文件,必定要要保证宿主机文件存在,不然整个路径会被认为是一个目录挂载web
打开终端输入如下命令docker
docker 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 返回的是挂载的单个文件
注意:能够建立多文件挂载windows
docker 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