Docker數據管理 data container
創建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