docker深入1-docker的数据卷

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
参考:
http: //docs .docker.com /userguide/dockervolumes/
 
 
针对数据的存储,有个data volume的概念。
使用参数: - v
在container中创建一个volume,或者类似目录映射的方式,挂载一个数据盘或者目录到docker的container中。
环境准备:
[root@svr200-10 ~] # yum install docker-io -y
[root@svr200-10 ~] # docker -v
Docker version 1.5.0, build a8a31ef /1 .5.0
[root@svr200-10 ~] # service docker start
[root@svr200-10 ~] # useradd Jack && usermod -a -G docker Jack
[root@svr200-10 ~] # su Jack
[Jack@svr200-10 bin]$ docker pull centos
[Jack@svr200-10 bin]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos              7                   fd44297e2ddb        11 days ago         215.7 MB
centos              centos7             fd44297e2ddb        11 days ago         215.7 MB
centos              latest              fd44297e2ddb        11 days ago         215.7 MB
 
 
一、简单的方式是:挂载一个数据目录到container中
[Jack@svr200-10 bin]$ docker run -d -it - v  /home/datacenter : /datacenter  --name datacenter centos                
66f5e0e0e7042e371c092ff24117598055b7f65d4224f9738efbf13ba6273127
[Jack@svr200-10 bin]$ docker  ps  -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
66f5e0e0e704        centos:7             "/bin/bash"          12 seconds ago      Up 11 seconds                           datacenter             
[Jack@svr200-10 bin]$ docker attach test01
 
[root@66f5e0e0e704 /] # ll /
total 60
lrwxrwxrwx.   1 root root    7 Apr 15 14:28 bin -> usr /bin
drwxr-xr-x.   2 root root 4096 May  4 02:55 datacenter
drwxr-xr-x.   5 root root  380 May  4 02:51 dev
drwxr-xr-x.  47 root root 4096 May  4 02:51 etc
drwxr-xr-x.   2 root root 4096 Jun 10  2014 home
lrwxrwxrwx.   1 root root    7 Apr 15 14:28 lib -> usr /lib
lrwxrwxrwx.   1 root root    9 Apr 15 14:28 lib64 -> usr /lib64
drwx------.   2 root root 4096 Apr 15 14:26 lost+found
drwxr-xr-x.   2 root root 4096 Jun 10  2014 media
drwxr-xr-x.   2 root root 4096 Jun 10  2014 mnt
drwxr-xr-x.   2 root root 4096 Jun 10  2014 opt
dr-xr-xr-x. 235 root root    0 May  4 02:51 proc
dr-xr-x---.   2 root root 4096 Apr 15 14:29 root
drwxr-xr-x.  10 root root 4096 Apr 15 14:29 run
lrwxrwxrwx.   1 root root    8 Apr 15 14:28 sbin -> usr /sbin
drwxr-xr-x.   2 root root 4096 Jun 10  2014 srv
dr-xr-xr-x.  13 root root    0 May  4 02:51 sys
-rw-r--r--.   1 root root   11 May  4 02:52 test01
-rw-r--r--.   1 root root   11 May  4 02:52 test04
drwxrwxrwt.   7 root root 4096 May  4 02:51 tmp
drwxr-xr-x.  13 root root 4096 Apr 15 14:28 usr
drwxr-xr-x.  19 root root 4096 Apr 15 14:29 var
[root@66f5e0e0e704 /] # df -h
Filesystem                                                                                        Size  Used Avail Use% Mounted on
/dev/mapper/docker-252 :0-262241-66f5e0e0e7042e371c092ff24117598055b7f65d4224f9738efbf13ba6273127  9.8G  254M  9.0G   3% /
tmpfs                                                                                             1.9G     0  1.9G   0%  /dev
shm                                                                                                64M     0   64M   0%  /dev/shm
/dev/mapper/vg_svr20010-lv_root                                                                     50G  9.3G   38G  20%  /etc/hosts
/dev/mapper/vg_svr20010-lv_home                                                                    405G   48G  338G  13%  /datacenter
tmpfs                                                                                             1.9G     0  1.9G   0%  /proc/kcore
 
写入数据:
[root@66f5e0e0e704 /] # echo "`date` aaa" >/datacenter/test01
[root@66f5e0e0e704 /] # echo "`date` 123" >/datacenter/test02   
[root@66f5e0e0e704 /] # ls /datacenter/
test01  test02
[root@66f5e0e0e704 /] # cat /datacenter/test0*
Mon May  4 02:57:19 UTC 2015 aaa
Mon May  4 02:57:27 UTC 2015 123
 
[root@66f5e0e0e704 /] # exit 
exit
 
查看宿主机挂载目录的文件和内容:
[Jack@svr200-10 bin]$ ll  /home/datacenter
total 8
-rw-r--r--. 1 root root 33 May  4 10:57 test01
-rw-r--r--. 1 root root 33 May  4 10:57 test02
[Jack@svr200-10 bin]$  cat  /home/datacenter/test0 *
Mon May  4 02:57:19 UTC 2015 aaa
Mon May  4 02:57:27 UTC 2015 123
 
 
[Jack@svr200-10 bin]$ docker stop datacenter
datacenter
[Jack@svr200-10 bin]$ docker  rm  datacenter  
datacenter
 
 
二、复杂一点儿:创建一个data volume container,共享给其他container
如官网所示:
If you have some persistent data that you want to share between containers, or want to use from non-persistent containers, it's best to create a named Data Volume Container, and  then  to  mount  the data from it.
 
 
1)创建一个container,提供一个数据卷供其他container使用:
[Jack@svr200-10 bin]$ docker run -d -it - v  /home/datacenter : /datacenter  --name Data_Vol centos  
7691eccc73f6e4e2e2c3d6816cf6ba6a80a5f98f5067d48db6e8bafb4e4db021
 
[Jack@svr200-10 bin]$ docker  ps  -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
7691eccc73f6        centos:7             "/bin/bash"          7 seconds ago       Up 5 seconds                            Data_Vol   
 
 
再创建2个container,使用刚才创建的数据卷Data_Vol来存储数据。
在启动container时,用这个参数:--volumes-from Data_Vol,而不是之前提到的- v 参数,来挂载数据卷。
 
2)创建一个container:app1   ,写入一点儿数据  
[Jack@svr200-10 bin]$ docker run -d -it --volumes-from Data_Vol --name app1 centos
1474f622b7f04c98da98e320d10864538b50b0b053677bbda039c8fb657062c1
[Jack@svr200-10 bin]$ docker attach app1
 
[root@1474f622b7f0 /] # ll /
total 52
lrwxrwxrwx.   1 root root    7 Apr 15 14:28 bin -> usr /bin
drwxr-xr-x.   2 root root 4096 May  4 02:56 datacenter
drwxr-xr-x.   5 root root  380 May  4 03:40 dev
drwxr-xr-x.  47 root root 4096 May  4 03:40 etc
drwxr-xr-x.   2 root root 4096 Jun 10  2014 home
lrwxrwxrwx.   1 root root    7 Apr 15 14:28 lib -> usr /lib
lrwxrwxrwx.   1 root root    9 Apr 15 14:28 lib64 -> usr /lib64
drwx------.   2 root root 4096 Apr 15 14:26 lost+found
drwxr-xr-x.   2 root root 4096 Jun 10  2014 media
drwxr-xr-x.   2 root root 4096 Jun 10  2014 mnt
drwxr-xr-x.   2 root root 4096 Jun 10  2014 opt
dr-xr-xr-x. 244 root root    0 May  4 03:40 proc
dr-xr-x---.   2 root root 4096 Apr 15 14:29 root
drwxr-xr-x.  10 root root 4096 Apr 15 14:29 run
lrwxrwxrwx.   1 root root    8 Apr 15 14:28 sbin -> usr /sbin
drwxr-xr-x.   2 root root 4096 Jun 10  2014 srv
dr-xr-xr-x.  13 root root    0 May  4 03:40 sys
drwxrwxrwt.   7 root root 4096 May  4 03:40 tmp
drwxr-xr-x.  13 root root 4096 Apr 15 14:28 usr
drwxr-xr-x.  19 root root 4096 Apr 15 14:29 var
[root@1474f622b7f0 /] # ls /datacenter/
test01  test02
[root@1474f622b7f0 /] # touch /datacenter/app1
[root@1474f622b7f0 /] # ls /datacenter/       
app1  test01  test02
[root@1474f622b7f0 /] # echo "`date` hello app1" >/datacenter/app1 
[root@1474f622b7f0 /] # cat /datacenter/app1 
Mon May  4 03:43:11 UTC 2015 hello app1
[root@1474f622b7f0 /] # exit
exit
 
 
2)再创建一个container:app2   ,写入一点儿数据  
[Jack@svr200-10 bin]$ docker run -d -it --volumes-from Data_Vol --name app2 centos
c4d743681ec95d78b21a52d3a558b4cab40a9f7ba43e884e4686c57c313b6923
 
[Jack@svr200-10 bin]$ docker attach app2
 
[root@c4d743681ec9 /] # df -h
Filesystem                                                                                        Size  Used Avail Use% Mounted on
/dev/mapper/docker-252 :0-262241-c4d743681ec95d78b21a52d3a558b4cab40a9f7ba43e884e4686c57c313b6923  9.8G  254M  9.0G   3% /
tmpfs                                                                                             1.9G     0  1.9G   0%  /dev
shm                                                                                                64M     0   64M   0%  /dev/shm
/dev/mapper/vg_svr20010-lv_root                                                                     50G  9.3G   38G  20%  /etc/hosts
/dev/mapper/vg_svr20010-lv_home                                                                    405G   48G  338G  13%  /datacenter
tmpfs                                                                                             1.9G     0  1.9G   0%  /proc/kcore
[root@c4d743681ec9 /] # ls /datacenter/ 
app1  test01  test02
[root@c4d743681ec9 /] # cat /datacenter/app1 
Mon May  4 03:43:11 UTC 2015 hello app1
[root@c4d743681ec9 /] # echo "`date` this is app2" >/datacenter/app2       
[root@c4d743681ec9 /] # exit
exit
 
[Jack@svr200-10 bin]$ docker  ps  -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                            PORTS               NAMES
c4d743681ec9        centos:7             "/bin/bash"          6 minutes ago       Exited (0) 6 seconds ago                              app2                
1474f622b7f0        centos:7             "/bin/bash"          6 minutes ago       Exited (130) About a minute ago                       app1                
7691eccc73f6        centos:7             "/bin/bash"          7 minutes ago       Up 7 minutes                                          Data_Vol            
[Jack@svr200-10 bin]$ 
 
 
 
3)我们停止Data_Vol这个容器,再试试写入数据
[Jack@svr200-10 bin]$ docker stop Data_Vol
 
Data_Vol
[Jack@svr200-10 bin]$ 
[Jack@svr200-10 bin]$ docker start app1
app1
[Jack@svr200-10 bin]$ docker  ps  -a        
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                          PORTS               NAMES
c4d743681ec9        centos:7             "/bin/bash"          7 minutes ago       Exited (0) About a minute ago                       app2                
1474f622b7f0        centos:7             "/bin/bash"          8 minutes ago       Up 7 seconds                                        app1                
7691eccc73f6        centos:7             "/bin/bash"          8 minutes ago       Exited (137) 16 seconds ago                         Data_Vol            
[Jack@svr200-10 bin]$ docker attach app1
 
[root@1474f622b7f0 /] # ls /datacenter/
app1  app2  test01  test02
[root@1474f622b7f0 /] # echo "`date` app1 is back here" >>/datacenter/app1        
[root@1474f622b7f0 /] # cat /datacenter/app1
Mon May  4 03:43:11 UTC 2015 hello app1
Mon May  4 03:48:53 UTC 2015 app1 is back here
[root@1474f622b7f0 /] # exit
exit
 
看起来,,这个用来持久化的Data_Vol不用启动,,其他的container用--volumes-from Data_Vol来挂载数据卷,也是可以正常使用的。
 
4)回到宿主机了,我们看下数据
[Jack@svr200-10 bin]$  ls  /home/datacenter/
app1  app2  test01  test02
 
看起来,文件都在这里呢,再看下数据:
[Jack@svr200-10 bin]$  cat  /home/datacenter/app1
Mon May  4 03:43:11 UTC 2015 hello app1
Mon May  4 03:48:53 UTC 2015 app1 is back here
[Jack@svr200-10 bin]$  cat  /home/datacenter/app2
Mon May  4 03:46:37 UTC 2015 this is app2
 
看,符合预期。