Wye Data Volume
关闭并重启容器,其数据不受影响;但删除Docker容器,则其更改将全部丢失
存在的问题:
存储于联合文件系统中,不易于宿主机访问;
容器间数据共享不便
删除容器其数据会丢失
解决方案:“卷(volume)”
“卷”是容器上的一个或多个“目录”,此类目录可绕过联合文件系统,与宿主机上的某个目录“绑定(关联)”
“卷”为docker提供了独立于容器的数据管理机制
可以把“镜像”想象成静态文件,例如“程序”,把卷类比为动态内容,例如“数据”;于是镜像可以重用,而“卷”可以共享;
“卷”实现了“程序(镜像)”和“数据(卷)”分离,以及“程序(镜像)”和制作镜像的主机分离。
Volume types
Docker有两种类型的卷,每种类型都在容器中存在一个挂载点,但其在宿主机上的位置有所不同;
Bind mount volume (绑定挂载卷)
容器中的目录和宿主机上的目录建立绑定关系,必须明确指定建立绑定关系的目录
Docker-managed volume (Docker管理的卷)
只需要指定容器中的目录,宿主机上的目录由docker在某一特定路径下自动创建自动关联,用户无需手动指定,但是这种方式有个弊端,下次容器启动后自动创建关联的卷可能不是同一个卷。
在容器中使用Volume
为docker run 命令使用 -v 选项即可使用volume
Docker-managed volume (Docker管理的卷)
~]# docker run -it -name web1 -v /data busybox
~]# docker inspect -f {{.Mounts}} web1
查看web1容器的卷、卷标识符及挂载的主机目录
Bind-mount Volume (绑定挂载卷)
~]# docker run -it -v 宿主机目录路径:容器目录路径 –name web2 busybox
~]# docker inspect -f {{.Mounts}} web2
查看web1容器的卷、卷标识符及挂载的主机目录
一:Docker-managed volume (Docker管理的卷)
[root@localhost ~]# docker run –name web1 -it -v /date busybox
启动容器并指定容器内的目录为:/date

[root@localhost ~]# docker inspect web1
探测下容器里的/date目录和宿主机的那个目录有关联关系,查看详细信息。

[root@localhost ~]# cd /var/lib/docker/volumes/d8bfa38d9977d74d451fc8862dbc221e0fcacf344625183f7b4c26a335962827/_data
进入宿主机此目录建立文件,而后在容器中查看关联/date目录中是否有此文件,以确认关联关系。
[root@localhost _data]# echo “hello container” >> test.html

进入容器中查看/date目录中是否有test.html文件

/date # echo “hello” >> ceshi.html
在容器中创建立文件ceshi.html

进入宿主机中查看/var/lib/docker/volumes/d8bfa38d9977d74d451fc8862dbc221e0fcacf344625183f7b4c26a335962827/_data目录中是否有ceshi.html文件

二:Bind mount volume (绑定挂载卷)
启动一个容器当容器退出时自动删除,且宿主机会自动创建/data/volume/web2目录、
[root@localhost ~]# docker run –name web2 -it –rm -v /data/volume/web2:/data busybox

[root@localhost /]# docker inspect web2

/data/volume/web2 宿主机目录路径

两个容器也可共享同一个存储卷(实现了容器间的数据共享),使用-v指定同一个卷即可。
如果多个容器需要使用共享同一个卷,为了避免每次启动容器时都需要使用-v来指定卷路径,docker还可以复制卷,甚至可以创建一个不用启动的容器只要容器在就行不用启动,只不过在创建此容器时指定它该使用什么样的卷路径,作为后面几个容器启动去关联复制它的存储卷设置。
Sharing volumes
多个容器的卷使用同一个主机目录,例如:
~]# docker run -it –name web1 -v /data/volume/web1:/data busybox
~]# docker run -it –name web2 -v /data/volume/web1:/data busybox
复制使用其它容器的卷,为docker run 命令使用 –volumes-from选项
~]# docker run -it –name web1 -v /data/volume/web1:/data busybox
~]# docker run -it –name web2 –volumes-from web1 busybox
[root@localhost ~]# docker run –name infracon -it -v /data/infracon/volume/:/data/web/html busybox
在创建底层基础镜像容器时其实不需要-it交互式进入,也不能–rm删除

[root@localhost /]# docker run –name nginx –network container:infracon –volumes-from infracon -it busybox
这里的–network container:infracon表示使用infracon容器的网络并复制infracon容器的卷

分别使用docker inspect查看两个容器
[root@localhost ~]# docker inspect infracon

[root@localhost ~]# docker inspect nginx
在使用docker inspect 查看nginx容器时因为nginx容器使用的是infracon容器的网络,所以是看不见IP地址的,需要进入nginx容器查看地址。

