开发者学堂课程【Docker 快速入门:Docker 容器数据卷用 V 命令添加】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/850/detail/14042
Docker 容器数据卷用 V 命令添加
内容介绍
一、容器内添加的方法
上一节讲到容器数据卷的理念。容器停止或者关闭以后,对于部分数据的持久化工作如果想把它保存下来,就把它保存在容器圈里,就相当于外置的活动硬盘。
它的功能主要是做容器数据的持久化加容器间数据的共享、甚至宿主机和容器之间的数据共享。接下来怎么添加相关的容器卷呢?
一、容器内添加的方法
有两种方法:
1、直接命令添加
--命令 docker run-it-v/宿主机绝对路径目录:/容器内目录 镜像名
//先退:docker run-it 镜像名。如果上一讲布置的作业大家动手去练,你的本机应该通过某个镜像 run-it 有个交互性的终端开启,能够连上各自的容器。在这个命令的基础上,docker run-it-v,v 是 value,是宿主机绝对路径目录:/容器内目录。
宿主机是我们的虚拟机上的这个 centos6.8,这是根目录:
在终端中打开,起名为 host:
[
root@atguigu/]#ls
root@atguigu /]# myDataVolume
当前宿主机下面建一个 myDataVolume,是宿主机的目录,这个目录留着。现在的根目录下面没有 myDataVolume 这个文件夹,如果一会有就是 docker 建的。
容器内目录指的是什么?
下面用最简单的方式来演示:
[root@atguigu桌面] #docker images
[root@at
g
ui
g
u 桌面]#
[root@atguigu桌面]#docker run-
i
t centos/bin/bash
[root@f6a41a6b3758/]#pwd
/
[root@f6a41a6b375/]#
现在是在容器里的 centos。
[root@f6a41a6b3758/]#ll
请看,它下面没有一个叫 dataVolumeContainer 的文件夹。假设以最原始的命令去登录 centos 镜像,默认的根目录镜像里面,docker 登录由镜像生成的 centos 容器,它的根目录下面当前也没有准备写的这个文件夹 dataVolumeContainer。
下面把它退出:
[root@f6a41a6b3758/]#exit
exit
在container:
Iroot@atguigu 桌面]# docker ps
root@atguigu 桌面]#
docker ps 是当前正在运行的容器实验,是空的。
这个时候请看,在主机执行这个镜像:
[root@atguigu
/
] #docker run-it-v/myDataVolume:/dataVolumeContainer
centos
centos6.8 这个根目录下面要新建一个 myDataVolume,然后跟 docker 里 centos容器里的根目录下面的dataVolumeContainer这个文件夹达成连接,相当于一个活动硬盘插到笔记本上开始容器之间、容器和主机之间数据的共享。
注意:根目录下没有 myDataVolume
[root@atguigu
/
] #docker run-it-v/myDataVolume:/dataVolumeContainer
centos
[root@f89b5db98ede/]#
以 centos 为镜像,生成了一个尾号是 8ede 的容器在 docker 上跑着。
此时这里直接刷新一下,执行命令后,名字互换:
[root@atguigu
桌面
] #
cd
[root@atguigu
/
] #
ll
drwxr-xr-x
.
117 root root12288 7月 12 21:56 etc
drwxr-xr-x. 2 root root 4096 9月 23 2011 home
dr-xr-xr-x. 13 root root 4096 2月 2 20:09 lib
dr-xr-xr-x. 9 root root 12288 7月 6 03: 18 lib64
drwx------. 2 root root 16384 1月 19 04:44 lost+found
drwxr-xr-x. 3 root root 4096 7月 12 21:56 media
drwxr-xr-x. 2 root root 0 7月 12 21:46 misc
drwxr-xr-x. 3 root root 4096 1月 18 21:00 mnt
drwxr-xr-x. 2 root root 4096 7月 12 22:51myDataVo
l
ume
drwxr-xr-x. 6 root root 4096 3月 31 04:02 myzookeeper
drwxr-xr-x. 2 root root 0 7月 12 21:46 net
drwxr-xr-x. 7 root root 4096 7月 5 10:45 opt
dr-xr-xr-x. 294 root root 07月 12 21:45 proc
dr-xr-x---. 29 root root 40967月 12 21:56 root
dr-xr-xr-x. 2 root root 12288 7月 6 03: 18 sbin
drwxr-xr-x. 7 root root 0 7月 12 21:45 selinux
有了一个 myDataVolume。
根目录里也有了:
因此说明-v 含有新建的功能。
主机:
[
root@atguigu/]#ls-l/myDataVolume/
总用量0
[root@atguigu/]# ls-D/myDataVolume/
[root@atguigu/]# ls-d/myDataVolume/
myDataVo
l
ume
[root@atguigu/]#
有了 myDataVolume。
在 Container 里:
{
root@atquiqu /]#docker run-it
-
V/myDataVolume:/dataVolumeContainer centos root@f89b5db98ede/]# pwd
/
root@f89b5db98ede/]#ll
total 48
lrwxrwxrwx. 1 root root7 May 31 18:02 bin-> usr/bin
drwxr-xr-x. 2 root root 4096 Jul 1302:51dataVolumeContainer
drwxr-xr-x. 5 root root 380 Jul 1302:51 dev
drwxr-xr-x. 47 root root 4096 Jul 13 02:51etc
drwxr-xr-x. 2 root root 4096 Apr 1104:59home
Lrwxrwxrwx. 1 root root 7 May 31 18:02 lib -> usr/lib
lrwxrwxrwx. 1 root root9 May 31 18:02 lib64-> usr/lib64
drwxr-xr-x. 2 root root 4096 Apr 11 04:59 media
drwxr-xr-x. 2 root root 4096 Apr 11 04:59 mnt
drwxr-xr-x. 2 root root 4096 Apr 11 04: 59 opt
dr-xr-xr-x.294 root root Jul 1302:51 proc
dr-xr-x---. 2 root root 4096 May 31 18:03root
drwxr-xr-x. 10 root root 4096 May 31 18:03 run
lrwxrwxrwx. 1 root root 8 May 31 18:02 sbin ->usr/sbin
drwxr-xr-x. 2 root root 4096 Apr 11 04:59 srv
drwxr-xr-x 13 root root 0 Jul 13 01:45 sys
这里有 dataVolumeContainer。上面的是主机 myDataVolume,这个是容器里面的根目录下面的 dataVolumeContainer。
myDataVolume 和 dataVolumeContainer 这两个相当于进行了数据的共享和对接,下面请看查看数据卷是否挂载成功。
2、查看数据卷是否挂载成功
//myDataVolume和dataVolumeContainer 以前没有现在有了,因此挂载成功了。如果你还是不相信,那就再启用一个窗口来证明:
Docker inspect :以json串的模式来描述容器。
[root@atguigu桌面]# docker ps
[
root@atguigu 桌面]# docker inspect f89b5db98ede
点击回车:
是容器内的 dataVolumeContainer 数据容器卷跟 yDataVolume 宿主机的绑定。为什么呢?
主机配置 binds,是主机的 myDataVolume 跟容器里面的 dataVolumeContainer的绑定。从这个描述上就可以清楚地看到。
如果在 docker inspect 加入容器 ID 之后能看到这一小段,说明绑定成功。
"ProcessLabel”:"Volumes”: {
”
/dataVolumeContainer”:”/myDataVolume
},
"VolumesRW”:{
"/dataVolumeContainer": true
},
"AppArmorProfile”: "","ExecIDs”: null,"HostConfig”: {
"Binds”:[
”
/myDataVolume:/dataVolumeContainer],
Volumes RW,RW 是读写的意思,说明可以对容器里面的 dataVolumeContainer文件夹读写操作均可。
3、容器和宿主机之间数据共享
//先看主机:
[
root@atguigu/]#cd/myDataVolume/
[root@atquigu myDataVolume]#
现在是在宿主机上的根目录的 myDataVolume 文件夹下面:
[
root@atguigu myDataVolume]# pwd
/myDataVolume
[root@atguigu myDataVolume]# touch host.txt
root@atguigu myDataVolume]#
ll
总用量0
-rw-r--r--.1 root root0 7月12 22:56 host.txt
[root@atguigu myDataVolume]#
当前在容器的路径下:
[root@f89b5db98ede/]# cd/dataVolumeContainer/
[root@f89b5db98ede dataVolumeContainer]# pwd
/dataVolumeContainer
[root@f89b5db98ededataVolumeContainer]#ll
total 0
-rw-r--r--. 1 root root 0 Jul 13 02: 56 host
.
txt [root@f89b5db98ede dataVolumeContainer]# vim host.txt
bash: vim: command not found
[root@f89b5db98ede dataVolumeContainer]#
抱歉,因为 centos 不支持 vim,是一个精简版的,它没有这个功能。把 vim 改成vi:
[root@f89b5db98ede dataVolumeContainer]# vi host.txt
[root@f89b5db98ede dataVolumeContainer]#
touch
container.txt
[root@f89b5db98ede dataVolumeContainer]#ll
total 4
-rw-r--r--. 1 root root 0 Jul 13 02:57 containertxt
-
rw-r--r-. 1 root root 20 Jul 13 02:57 host.tx
t
[
root@f89b5db98ededataVolumeContainer]#
container update 01
[root@atguigu myDataVolume]#
容器内第一修改了主机的文件,第二自己建了一个。那么主机实现了宿主机和容器之间的数据共享。
4、容器停止退出后,主机修改后数据是否同步
//[
root@f89b5db98ede dataVolumeContainer]#
exit
exit
[
root@atguigu 桌面]# docker ps
[root@atquigu桌面]#
[root@atguigu myDataVolume]# touch host
02
.txt
[root@atguigu myDataVolume]#
vim
container.txt
[root@atguigu myDataVolume]#
vim
host.txt
Container update01
host update
0
1
保存退出
主机:
[root@atguigu myDataVolume]#ll
总用量4
-rw-r--r--. 1 root root07月1222: 57 container.txt
-rw-r--r--
.
1root root07月1222:59 h
o
st
0
2.txt
-rW-r--r-- 1root root 357月12 22:59 hosttxt root@atguigu myDataVolume]#
如果把 container 重新启动,重新进入会不会有新数据呢?
重新进去:
5、命令(带权限) dockerrun-it-v/宿主机绝对路径目录:/容器内目录:ro 镜像名
"Volumes”:{
”
/mydataVolume2”:"/mydataValume”},
"VolumesRW:{
”
/mydataVolume2”:false
docker·run·-it··-v·/myDataVolume:/dataVolumeContainer:ro….镜像名
[
root@atguigu myDataVolume]# cd.
[root@atguigu/]#rm-rfmyDataVolume/ root@atguigu /]#
主机删了以后 container 也就变成了0, 但是文件夹并没有删掉
[root@f89b5db98ede/]#l1 total 48
lrwxrwxrwx. 1 root root 7 May 31 18:02 bin-> usr/bin
drwxr-xr-x. O root root 0 Jul 13 03:05 dataVolumeContainer
drwxr-xr-x. 5 root root 380 Jul 13 03:02 dev
drwxr-xr-x. 47 root root 4096 Jul 13 02: 51 etc
drwxr-xr-x. 2 root root 4096 Apr 11 04:59 home
lrwxrwxrwx. 1 root root 7 May 31 18:02 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 May 31 18:02 2 lib64 -> usr/lib64
drwxr-xr-x. 2 root root 4096 Apr 11 04:59 media
drwxr-xr-x. 2 root root 4096 Apr 11 04:59 mnt
drwxr-xr-x. 2 root root 4096 Apr 11 04: 59 opt
dr-xr-xr-x 296 root root 0 Jul 13 03:02 proc
dr-xr-x---. 2 root root 4096 Jul 1302: 58 root
drwxr-xr-x. 10 root root 4096 May 31 18:03run
lrwxrwxrwx. 1 root root 8 May 31 18:02 sbin -> usr/sbin
drwxr-xr-x. 2 root root 4096 Apr 11 04:59 srv
drwxr-xr-x 13 root root 0 Jul 13 1: 45 sys
drwxrwxrwt. 7 root root 4096 May 31 18:03 tmp
drwxr-xr-x. 13 root root 4096 May 31 18:02 2usr
drwxr-xr-x.18 root root 4096 May 31 18:02 var[root@f89b5db98ede/]#
后面新建的会覆盖它如果大家怕出问题可以把 dataVolumeContainer 删掉。
[root@atguigu/]#docker run-it -V
/myDataVolume:/dataVolumeContainer ro centos
[
root@1c95e7d533f0/]# total 48
rwxrwxrwx. 1 root root7 May 31 18:02 bin -> usr/bin
drwxr-xr-x. 2 root root 4096 Jul 13 03:06 dataVolumeContainer
drwxr-xr-x. 5 root root 380 Jul 13 03:06 dev
drwxr-xr-x. 47 root root 4096 Jul 13 03:06 etc
drwxr-xr-x. 2 root root 4096 Apr 1104:59 9 home
lrwxrwxrwx. 1 root root 7 May 31 18:02 lib -> usr/lib
lrwxrwxrwx. 1 root root9 May 31 18:02 lib64->usr/lib64
drwxr-xr-x. 2 root root 4096 Apr 11 04:59 media
drwxr-xr-x. 2 root root 4096 Apr 11 04:59mnt
drwxr-xr-x. 2 root root 4096 Apr 11 04:59 opt
dr-xr-xr-x. 295 root root 0 Jul 13 03:06 proc
dr-xr-x---. 2 root root 4096 May 31 18:03 root
drwxr-xr-x. 10 root root 4096 May 31 18:03 run
lrwxrwxrwx. 1 root root 8 May 31 18:02 sbin -> usr/sbin
drwxr-xr-x. 2 root root 4096 Apr 1104:59 srv
drwxr-xr-x 13 root root 0 Jul 13 01:45 sys
host:
[
root@atguigu myDataVolume]# ll
总用量0[root@atguigu myDataVolume]# touch host.txt [root@atguigu myDataVolume]# vim hosttxt
[root@atguigu myDataVolume# cat hosttxt host update
[root@atguigu myDataVolume]#
[root@1c95e7d533fodataVolumeContainer#pwd /dataVolumeContainer
[root@1c95e7d533f0dataVolumeContainer]#ll total 0
[root@1c95e7d533f0 dataVolumeContainer]#ll total 4
rw-r--r--. 1 root root 12 Jul 1303:08 hosttxt
r[oot@1c95e7d533f0 dataVolumeContainer]# cat hosttxt host update
[root@1c95e7d533fo dataVolumeContainer]#touch container txt
touch: cannot touch’containertxt: Read-only file system[root@1c95e7d533f0 dataVolume Container]#
现在强制保存退出,不能够打开文件,对于写的过程当中,换而是写操作不支持啊,因为我加的是 Read-only。以及容器内的数据只允许主机单向的写操作传给他,他只可以看容器止渴。
},
”
VolumesRW”:{
"/dataVolumeContainer”:false},
"AppArmorProfile”:"”,"ExecIDs”: null,”HostConfig”:{
"Binds”:[
”
/myDataVolume:/dataVolumeContainerro
7
touch: cannot touchcontainertxt: Read-only file system
[
root@1c95e7d533f0 dataVolumeContainer]#vi host
》
txt
[root@1c95e7d533f0dataVolumeContainer]#