此篇是Docker系列的第四篇,大家一定要按照我做的Demo都手敲一遍,印象会更加深刻的,加油!
存在于主机系统中的任意位置,非 Docker 的进程或者 Docker 容器可能随时对其进行修改,存在潜在的安全风险。bind mount在不同的宿主机系统时不可移植的,比如Windows和Linux的目录结构是不一样的,bind mount所指向的host目录也不能一样。
存于主机文件系统中的某个区域,由Docker管理文件目录(/var/lib/docker/volumes/)。非Docker进程不应该修改这些数据。卷是Docker中持久化数据的最好方式;
存于内存中,并不是持久化到磁盘。在容器的生命周期中,可以被容器用来存放非持久化的状态或敏感信息;
在使用bind mount可以使用-v或者--volume,这个参数在单容器的情况下使用,在swarm集群中使用--mount,从 Docker 17.06 之后,可以统一使用参数--mount。对于新接触 Docker的来说建议使用--mount,老司机可以继续使用-v,但是还是建议使用--mount。
-v语法
分为三部分,使用冒号进行分割,排列的顺序不能发生变化,每个字段所表达的含是不同的;
--mount语法
由一组键值对组成,用逗号进行分割;
我们使用Nginx来讲解该案例;
docker run -d -it --name nginxvolumetest -p 9999:80 -v ~/Documents/app/docker:/usr/share/nginx/html/ nginx:latest
docker inspect nginxvolumetest
#进入宿主机对应的目录
~/Documents/app/docker
#宿主机在docker目录下创建index.html
touch index.html
#编辑文件
vim index.html
#插入
hello,dcoker bind mount!
#查看镜像ID
dcoker ps
#进入容器内部
docker exec -it e240f6b77437 /bin/bash
#进入对应的目录
cd /usr/share/nginx/html/
#在对应目录下创建test.java文件
touch test.java
#查看对应目录下的文件
ls
docker stop e240f6b77437
docker rm e240f6b77437
-mount使用
#后台方式启动一个名字叫nginxmounttest的容器
#将容器内端口映射到宿主机9999端口
#将宿主机~/Documents/app/docker映射到/usr/share/nginx/html/
#版本为nginx:latest
docker run -d -it --name nginxmounttest -p 9999:80 --mount type=bind,source=/Users/wangtongzhou/Documents/app/docker,target=/usr/share/nginx/html/ nginx:latest
#进入容器内部
docker exec -it 7053db43219f /bin/bash
#查看文件内容
ls
只读挂载
docker stop 7053db43219f
docker rm 7053db43219f
docker run -d -it --name nginxmounttest -p 9999:80 --mount type=bind,source=/Users/wangtongzhou/Documents/app/docker,target=/usr/share/nginx/html/,readonly nginx:latest
#或者-v
docker run -d -it --name nginxvolumetest -p 9999:80 -v ~/Documents/app/docker:/usr/share/nginx/html/:ro nginx:latest
docker inspect nginxmounttest
touch aaa.java
volume由Docker来进行管理,比如volume的创建,可以使用命令 docker volume create 来创建一个 volume,当容器或者服务创建的时候,Docker 也可以自动的创建一个 volume。
当我们创建了一个volume,它存储在Docker宿主机的存储目录上。当把volume挂载入容器时,此目录就会同步挂载到容器中的目录。与bind mount同步方式一样,不同的是volume是由Docker来管理并且和Docker Host的核心功能进行隔离。
一个给定的volume可以同时挂载到多个容器中。我们在挂载volume时,可以进行命名,叫做具名挂载,也可以是默认随机生成的名字,叫做匿名挂载。当不指定名称的时候,Docker会用一个随机字符串对其进行命名,这样可以保证 volume的唯一性。
此外volume支持使用 volume drivers,允许将数据存储挂载到远程主机上。
-v语法
与bind mount语法类似,在不指定主机地址的时候,就是采用volume的方式进行挂载,分为三部分:
--mount语法
与bind mount语法类似,使用逗号分隔:
docker volume test
cd /var/lib/docker/volumes/test/_data
docker run -d -it -p 9999:80 --name nginxvolumetest --mount source=test,target=/usr/share/nginx/html nginx:latest
#或者-v命令
docker run -d -it -p 9999:80 --name nginxvolumetest -v test:/usr/share/nginx/html nginx:latest
docker inspect nginxvolumetest
cd /var/lib/docker/volumes/test/_data
touch a.html
docker ps
docker exec -it f24efa9063bc bash
ls
docker stop f24efa9063bc
docker rm f24efa9063bc
tmpfs不在磁盘上持久存储,也不在 Docker Host 容器里面存储,他存储在host的内存中,它可以在容器的整个生命周期内被容器所使用。
在单容器的情况下使用--tmpfs,并且不能指定参数,在集群的情况下使用--mount,可以指定一些参数;
后台方式启动一个版本为nginx:latest名字叫nginxtmptest的容器,将容器内端口映射到宿主机9999端口,采用tmpfs使用卷,target指定容器中的挂载的地址;
docker run -d -it -p 9999:80 --name nginxtmptest --mount type=tmpfs,target=/usr/share/nginx/html nginx:latest
不需要将持久化的数据保留在宿主机或容器内使用tmpfs;
如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,但是它的目的是专门提供数据卷给其他容器挂载。复制卷始终具有相同的挂载点,数据卷的生命周期一直持续到没有容器使用它为止,类似于继承关系。
docker run -d -it --name centos01 -v /data1 centos:latest
#查看下容器id
docker ps
#进入容器内部
docker exec -it ec09d368858f /bin/bash
#查看文件目录
ls
#进入目录data1
cd data1
#创建文件
touch data01.txt
docker run -d -it --name centos02 --volumes-from centos01 centos:latest
#进入容器内部
docker exec -it ec09d368858f /bin/bash
#进入data1
cd data1
#ls查看文件目录发现存在data01.txt文件
ls
#在对应目录下创建data02.txt
touch data02.txt
cd data1
ls
Docker将数据持久化的方式:
欢迎大家点点关注,点点赞 !
原文:https://www.cnblogs.com/wtzbk/p/14911229.html