1. 程式人生 > >Docker數據管理 data container

Docker數據管理 data container

coffee 教程 和我 edi nta 個數 pan 缺省 ret

創建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 ls
DRIVER              VOLUME NAME
[root@liumiao volumes]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@liumiao volumes]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

使用docker create創建data container

[root@liumiao volumes]# docker create -v /datainf --name datacontainer debian /bin/true
ec96e7a392631b61cfc902f1e5457d0f432741a439ea756e594a24c6f0c3db74
[root@liumiao
volumes]#
  • 1
  • 2
  • 3

是不是覺得非常熟悉,使用docker run -v創建以及docker volume create的時候如果不指定name,系統自動會生成的一個volume名稱和剛剛創建的非常像,讓我們來看一下到底發生了什麽。

[root@liumiao ~]# docker volume ls
DRIVER              VOLUME NAME
local               aa31ef55b196dc13a120496dae2be903c37f256d3a200a3741167253b1495c1f
[root@liumiao ~]#
  • 1
  • 2
  • 3
  • 4

確認之後,沒有一絲驚喜,這個不是,應該是和普通container類似,返回的container的Id,確認一下,果然如此

[root@liumiao ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
ec96e7a39263        debian              "/bin/true"         7 minutes ago       Created                                 datacontainer
[root@liumiao ~]# docker inspect ec96e7a39263 |grep Id
        "Id": "ec96e7a392631b61cfc902f1e5457d0f432741a439ea756e594a24c6f0c3db74",
                "DeviceId": "457",
[root@liumiao ~]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

用來存放數據的volume是不是和我們不指定名字產生的volume是一樣的呢,確認之後發現,確實如此。缺省此volume在/var/lib/docker/volumes下被生成。

[root@liumiao volumes]# pwd
/var/lib/docker/volumes
[root@liumiao volumes]# ll
total 0
drwxr-xr-x. 3 root root 18 Jul 26 07:53 aa31ef55b196dc13a120496dae2be903c37f256d3a200a3741167253b1495c1f
[root@liumiao volumes]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

註意要點: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 /]#
  • 1
  • 2

進入之後,發現了創建data container時候使用的datainf目錄,果斷進入,初始狀態,什麽信息都沒有。

[root@57e8263a3d1e /]# ls
anaconda-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]#
  • 1
  • 2
  • 3
  • 4
  • 5

在主機中,此時也進行確認,發現也是沒有任何信息的狀態。

[root@liumiao volumes]# pwd
/var/lib/docker/volumes
[root@liumiao volumes]# find . -type f
[root@liumiao volumes]#
  • 1
  • 2
  • 3
  • 4

確認一下此時活動著的container,確實只有路人甲(centoscontainer)

[root@liumiao volumes]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
57e8263a3d1e        centos              "/bin/bash"         3 minutes ago       Up 3 minutes                            centoscontainer
[root@liumiao volumes]#
  • 1
  • 2
  • 3
  • 4

路人甲向大家say hello

[root@57e8263a3d1e datainf]# ls
[root@57e8263a3d1e datainf]# echo "hello, this is `hostname`" >>helloworld
[root@57e8263a3d1e datainf]# ls
helloworld
[root@57e8263a3d1e datainf]# cat helloworld
hello, this is 57e8263a3d1e
[root@57e8263a3d1e datainf]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

宿主機看到消息了

[root@liumiao volumes]# pwd
/var/lib/docker/volumes
[root@liumiao volumes]# find . -type f
./aa31ef55b196dc13a120496dae2be903c37f256d3a200a3741167253b1495c1f/_data/helloworld
[root@liumiao volumes]# cat ./aa31ef55b196dc13a120496dae2be903c37f256d3a200a3741167253b1495c1f/_data/helloworld
hello, this is 57e8263a3d1e
[root@liumiao volumes]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

路人乙也加入使用此data container

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

路人乙看到了甲的message

root@a3cefc373b4a:/# ls
bin  boot  datainf  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@a3cefc373b4a:/# cd datainf
root@a3cefc373b4a:/datainf# find . -type f
./helloworld
root@a3cefc373b4a:/datainf# cat ./helloworld
hello, this is 57e8263a3d1e
root@a3cefc373b4a:/datainf#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

路人乙決定對甲say hello

root@a3cefc373b4a:/datainf# cat helloworld
hello, this is 57e8263a3d1e
root@a3cefc373b4a:/datainf# echo "hello, this is `hostname`" >>helloworld
root@a3cefc373b4a:/datainf# cat helloworld
hello, this is 57e8263a3d1e
hello, this is a3cefc373b4a
root@a3cefc373b4a:/datainf#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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

[root@liumiao volumes]# pwd
/var/lib/docker/volumes
[root@liumiao volumes]# find . -type f
./aa31ef55b196dc13a120496dae2be903c37f256d3a200a3741167253b1495c1f/_data/helloworld
[root@liumiao volumes]# cat ./aa31ef55b196dc13a120496dae2be903c37f256d3a200a3741167253b1495c1f/_data/helloworld
hello, this is 57e8263a3d1e
hello, this is a3cefc373b4a
[root@liumiao volumes]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
[root@57e8263a3d1e datainf]# pwd
/datainf
[root@57e8263a3d1e datainf]# ls
helloworld
[root@57e8263a3d1e datainf]# cat helloworld
hello, this is 57e8263a3d1e
hello, this is a3cefc373b4a
[root@57e8263a3d1e datainf]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

宿主機準備刷一下存在感

宿主機向兩個都發出了一條message,表示他也要加入say hello活動中。

[root@liumiao _data]# pwd
/var/lib/docker/volumes/aa31ef55b196dc13a120496dae2be903c37f256d3a200a3741167253b1495c1f/_data
[root@liumiao _data]# cat helloworld
hello, this is 57e8263a3d1e
hello, this is a3cefc373b4a
[root@liumiao _data]# echo "hello, this is `hostname`" >>helloworld
[root@liumiao _data]# cat helloworld
hello, this is 57e8263a3d1e
hello, this is a3cefc373b4a
hello, this is liumiao
[root@liumiao _data]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

兩個container都看到了

[root@57e8263a3d1e datainf]# pwd
/datainf
[root@57e8263a3d1e datainf]# cat helloworld
hello, this is 57e8263a3d1e
hello, this is a3cefc373b4a
hello, this is liumiao
[root@57e8263a3d1e datainf]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
root@a3cefc373b4a:/datainf# pwd
/datainf
root@a3cefc373b4a:/datainf# cat helloworld
hello, this is 57e8263a3d1e
hello, this is a3cefc373b4a
hello, this is liumiao
root@a3cefc373b4a:/datainf#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

註意事項

為了介紹data container和volume的本質所以用了比較極端的方式。在實際的設計中,多個container共用一個數據卷有可能會導致數據損壞。同時宿主機雖然能夠看到數據,但是直接從宿主機修改該數據絕對不是Best Practice.

再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshow

Docker數據管理 data container