Docker数据管理:data container

来源:互联网 发布:哈佛东亚研究中心 知乎 编辑:程序博客网 时间:2024/06/03 22:06

创建Data Container

持久保存container中的数据除了named volume还可以使用data volume container, 为了方便本文统一称为data container.

使用docker create创建data container

事前volume情况等的确认

没有volume等存在[root@liumiao volumes]# pwd/var/lib/docker/volumes[root@liumiao volumes]# docker volume lsDRIVER              VOLUME NAME[root@liumiao volumes]# docker ps -aCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES[root@liumiao volumes]#

使用docker create创建data container

[root@liumiao volumes]# docker create -v /datainf --name datacontainer debian /bin/trueec96e7a392631b61cfc902f1e5457d0f432741a439ea756e594a24c6f0c3db74[root@liumiao volumes]#

是不是觉得非常熟悉,使用docker run -v创建以及docker volume create的时候如果不指定name,系统自动会生成的一个volume名称和刚刚创建的非常像,让我们来看一下到底发生了什么。

[root@liumiao ~]# docker volume lsDRIVER              VOLUME NAMElocal               aa31ef55b196dc13a120496dae2be903c37f256d3a200a3741167253b1495c1f[root@liumiao ~]#

确认之后,没有一丝惊喜,这个不是,应该是和普通container类似,返回的container的Id,确认一下,果然如此

[root@liumiao ~]# docker ps -aCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMESec96e7a39263        debian              "/bin/true"         7 minutes ago       Created                                 datacontainer[root@liumiao ~]# docker inspect ec96e7a39263 |grep Id        "Id": "ec96e7a392631b61cfc902f1e5457d0f432741a439ea756e594a24c6f0c3db74",                "DeviceId": "457",[root@liumiao ~]#

用来存放数据的volume是不是和我们不指定名字产生的volume是一样的呢,确认之后发现,确实如此。缺省此volume在/var/lib/docker/volumes下被生成。

[root@liumiao volumes]# pwd/var/lib/docker/volumes[root@liumiao volumes]# lltotal 0drwxr-xr-x. 3 root root 18 Jul 26 07:53 aa31ef55b196dc13a120496dae2be903c37f256d3a200a3741167253b1495c1f[root@liumiao volumes]#

注意要点:data container和普通的container的区别在哪里呢。主要有如下两点。

  • 在这个container中只有volume,没有应用程序
  • Entrypoint设定为/bin/true,所以不会被运行起来

路人甲Container使用此data container

路人甲使用他的centos按照如下的方式与data container进行了连接。

[root@liumiao volumes]# docker run -it --volumes-from datacontainer --name centoscontainer centos /bin/bash[root@57e8263a3d1e /]#

进入之后,发现了创建data container时候使用的datainf目录,果断进入,初始状态,什么信息都没有。

[root@57e8263a3d1e /]# lsanaconda-post.log  bin  datainf  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var[root@57e8263a3d1e /]# cd datainf[root@57e8263a3d1e datainf]# ls[root@57e8263a3d1e datainf]#

在主机中,此时也进行确认,发现也是没有任何信息的状态。

[root@liumiao volumes]# pwd/var/lib/docker/volumes[root@liumiao volumes]# find . -type f[root@liumiao volumes]#

确认一下此时活动着的container,确实只有路人甲(centoscontainer)

[root@liumiao volumes]# docker psCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES57e8263a3d1e        centos              "/bin/bash"         3 minutes ago       Up 3 minutes                            centoscontainer[root@liumiao volumes]#

路人甲向大家say hello

[root@57e8263a3d1e datainf]# ls[root@57e8263a3d1e datainf]# echo "hello, this is `hostname`" >>helloworld[root@57e8263a3d1e datainf]# lshelloworld[root@57e8263a3d1e datainf]# cat helloworldhello, this is 57e8263a3d1e[root@57e8263a3d1e datainf]#

宿主机看到消息了

[root@liumiao volumes]# pwd/var/lib/docker/volumes[root@liumiao volumes]# find . -type f./aa31ef55b196dc13a120496dae2be903c37f256d3a200a3741167253b1495c1f/_data/helloworld[root@liumiao volumes]# cat ./aa31ef55b196dc13a120496dae2be903c37f256d3a200a3741167253b1495c1f/_data/helloworldhello, this is 57e8263a3d1e[root@liumiao volumes]#

路人乙也加入使用此data container

[root@liumiao ~]# docker run -it --volumes-from datacontainer --name ubuntucontainer ubuntu /bin/bashroot@a3cefc373b4a:/#

路人乙看到了甲的message

root@a3cefc373b4a:/# lsbin  boot  datainf  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  varroot@a3cefc373b4a:/# cd datainfroot@a3cefc373b4a:/datainf# find . -type f./helloworldroot@a3cefc373b4a:/datainf# cat ./helloworldhello, this is 57e8263a3d1eroot@a3cefc373b4a:/datainf#

路人乙决定对甲say hello

root@a3cefc373b4a:/datainf# cat helloworldhello, this is 57e8263a3d1eroot@a3cefc373b4a:/datainf# echo "hello, this is `hostname`" >>helloworldroot@a3cefc373b4a:/datainf# cat helloworldhello, this is 57e8263a3d1ehello, this is a3cefc373b4aroot@a3cefc373b4a:/datainf#

路人甲和宿主机都看到了乙的message

[root@liumiao volumes]# pwd/var/lib/docker/volumes[root@liumiao volumes]# find . -type f./aa31ef55b196dc13a120496dae2be903c37f256d3a200a3741167253b1495c1f/_data/helloworld[root@liumiao volumes]# cat ./aa31ef55b196dc13a120496dae2be903c37f256d3a200a3741167253b1495c1f/_data/helloworldhello, this is 57e8263a3d1ehello, this is a3cefc373b4a[root@liumiao volumes]#
[root@57e8263a3d1e datainf]# pwd/datainf[root@57e8263a3d1e datainf]# lshelloworld[root@57e8263a3d1e datainf]# cat helloworldhello, this is 57e8263a3d1ehello, this is a3cefc373b4a[root@57e8263a3d1e datainf]#

宿主机准备刷一下存在感

宿主机向两个都发出了一条message,表示他也要加入say hello活动中。

[root@liumiao _data]# pwd/var/lib/docker/volumes/aa31ef55b196dc13a120496dae2be903c37f256d3a200a3741167253b1495c1f/_data[root@liumiao _data]# cat helloworldhello, this is 57e8263a3d1ehello, this is a3cefc373b4a[root@liumiao _data]# echo "hello, this is `hostname`" >>helloworld[root@liumiao _data]# cat helloworldhello, this is 57e8263a3d1ehello, this is a3cefc373b4ahello, this is liumiao[root@liumiao _data]#

两个container都看到了

[root@57e8263a3d1e datainf]# pwd/datainf[root@57e8263a3d1e datainf]# cat helloworldhello, this is 57e8263a3d1ehello, this is a3cefc373b4ahello, this is liumiao[root@57e8263a3d1e datainf]#
root@a3cefc373b4a:/datainf# pwd/datainfroot@a3cefc373b4a:/datainf# cat helloworldhello, this is 57e8263a3d1ehello, this is a3cefc373b4ahello, this is liumiaoroot@a3cefc373b4a:/datainf#

注意事项

为了介绍data container和volume的本质所以用了比较极端的方式。在实际的设计中,多个container共用一个数据卷有可能会导致数据损坏。同时宿主机虽然能够看到数据,但是直接从宿主机修改该数据绝对不是Best Practice.

0 0
原创粉丝点击