要解决的问题:在移除了现有容器或者添加了新容器时,之前容器的数据无法访问。
为避免上述问题,Docker提供了以下策略来持久化数据
- tmpfs挂载
- 绑定挂载
- 卷
- https://blog.csdn.net/fy_long/article/details/88425993
1.tmpfs挂载
2.绑定挂载
将Docker宿主机上的文件/目录挂载到容器中(就是说将host文件系统中的数据借给容器用)。注意:数据流在Docker宿主机和容器之间是双向流动的,任何破坏性的操作(比如删除一个目录)也都会对宿主机产生负面影响
host源(又称mount源)----------container目标(又称mount point)
目录:如果container目录已存在,则源数据会被隐藏并被替换为host源中的数据
文件:向容器中添加文件,同时也保留了容器原有的数据
# 将宿主机的主目录挂载到容器中一个名为host-name的目录
[root@localhost chrome]# docker run -it --name mount-test -v $HOME:/host-name ubuntu bash root@e7b70f5681cf:/# ll total 8 drwxr-xr-x. 1 root root 23 Sep 22 08:39 ./ drwxr-xr-x. 1 root root 23 Sep 22 08:39 ../ -rwxr-xr-x. 1 root root 0 Sep 22 08:39 .dockerenv* drwxr-xr-x. 2 root root 4096 Sep 12 20:54 bin/ drwxr-xr-x. 2 root root 6 Apr 24 2018 boot/ drwxr-xr-x. 5 root root 360 Sep 22 08:39 dev/ drwxr-xr-x. 1 root root 66 Sep 22 08:39 etc/ drwxr-xr-x. 2 root root 6 Apr 24 2018 home/ dr-xr-x---. 19 root root 4096 Sep 19 10:39 host-name/ drwxr-xr-x. 8 root root 96 May 23 2017 lib/ drwxr-xr-x. 2 root root 34 Sep 12 20:53 lib64/ drwxr-xr-x. 2 root root 6 Sep 12 20:53 media/ drwxr-xr-x. 2 root root 6 Sep 12 20:53 mnt/ drwxr-xr-x. 2 root root 6 Sep 12 20:53 opt/ dr-xr-xr-x. 186 root root 0 Sep 22 08:39 proc/ drwx------. 2 root root 37 Sep 12 20:54 root/ drwxr-xr-x. 1 root root 21 Sep 18 23:20 run/ drwxr-xr-x. 1 root root 21 Sep 18 23:20 sbin/ drwxr-xr-x. 2 root root 6 Sep 12 20:53 srv/ dr-xr-xr-x. 13 root root 0 Sep 19 08:21 sys/ drwxrwxrwt. 2 root root 6 Sep 12 20:54 tmp/ drwxr-xr-x. 1 root root 18 Sep 12 20:53 usr/ drwxr-xr-x. 1 root root 17 Sep 12 20:54 var/ root@e7b70f5681cf:/# pwd / root@e7b70f5681cf:/# cd host-name/ root@e7b70f5681cf:/host-name# touch a.txt # 进入容器内再host-name目录下创建文件a.txt root@e7b70f5681cf:/host-name# ll total 1348 dr-xr-x---. 19 root root 4096 Sep 22 08:40 ./ drwxr-xr-x. 1 root root 23 Sep 22 08:39 ../ -rw-------. 1 root root 2481 Sep 19 07:56 .bash_history -rw-r--r--. 1 root root 18 Dec 29 2013 .bash_logout -rw-r--r--. 1 root root 176 Dec 29 2013 .bash_profile -rw-r--r--. 1 root root 176 Dec 29 2013 .bashrc drwx------. 7 root root 76 Sep 19 06:32 .cache/ drwxr-xr-x. 9 root root 175 Sep 19 08:23 .config/ -rw-r--r--. 1 root root 100 Dec 29 2013 .cshrc drwx------. 3 root root 25 Sep 18 17:33 .dbus/ drwx------. 2 root root 26 Sep 19 05:47 .docker/ -rw-------. 1 root root 16 Sep 19 03:42 .esd_auth drwx------. 2 root root 79 Sep 22 07:48 .gnupg/ drwxr-xr-x. 2 root root 33 Sep 19 05:49 .gstreamer-0.10/ -rw-r--r--. 1 root root 113 Mar 8 2011 .gtkrc-2.0-kde4 drwxr-xr-x. 4 root root 140 Sep 19 03:42 .kde/ drwxr-xr-x. 3 root root 19 Sep 19 03:41 .local/ drwxr-----. 3 root root 19 Sep 19 04:11 .pki/ -rw-r--r--. 1 root root 129 Dec 29 2013 .tcshrc -rw-------. 1 root root 688 Sep 19 10:39 .viminfo drwxr-xr-x. 2 root root 6 Sep 19 03:42 Desktop/ drwxr-xr-x. 2 root root 6 Sep 19 03:42 Documents/ drwxr-xr-x. 2 root root 6 Sep 19 03:42 Downloads/ drwxr-xr-x. 2 root root 6 Sep 19 03:42 Music/ drwxr-xr-x. 2 root root 6 Sep 19 03:42 Pictures/ drwxr-xr-x. 2 root root 6 Sep 19 03:42 Public/ drwxr-xr-x. 2 root root 6 Sep 19 03:42 Templates/ drwxr-xr-x. 2 root root 6 Sep 19 03:42 Videos/ -rw-r--r--. 1 root root 0 Sep 22 08:40 a.txt -rw-------. 1 root root 1599 Sep 18 17:33 anaconda-ks.cfg -rw-r--r--. 1 root root 1329209 Sep 19 05:37 ch.exe.part -rw-r--r--. 1 root root 1793 Sep 18 09:37 initial-setup-ks.cfg # 再Docker宿主机打开一个新的终端窗口并输入以下命令,可发现宿主机上存在a.txt [root@localhost chrome]# cd ~ [root@localhost ~]# ll total 1308 -rw-------. 1 root root 1599 Sep 18 13:33 anaconda-ks.cfg -rw-r--r--. 1 root root 0 Sep 22 04:40 a.txt -rw-r--r--. 1 root root 1329209 Sep 19 01:37 ch.exe.part drwxr-xr-x. 2 root root 6 Sep 18 23:42 Desktop drwxr-xr-x. 2 root root 6 Sep 18 23:42 Documents drwxr-xr-x. 2 root root 6 Sep 18 23:42 Downloads -rw-r--r--. 1 root root 1793 Sep 18 05:37 initial-setup-ks.cfg drwxr-xr-x. 2 root root 6 Sep 18 23:42 Music drwxr-xr-x. 2 root root 6 Sep 18 23:42 Pictures drwxr-xr-x. 2 root root 6 Sep 18 23:42 Public drwxr-xr-x. 2 root root 6 Sep 18 23:42 Templates drwxr-xr-x. 2 root root 6 Sep 18 23:42 Videos
# 再Docker宿主机中终端输入以下命令,以停止这个容器 [root@localhost ~]# docker stop mount-test mount-test [root@localhost ~]# docker rm mount-test mount-test # 确认Docker宿主机上a.txt文件依旧存在 [root@localhost ~]# cd ~ [root@localhost ~]# ll total 1308 -rw-------. 1 root root 1599 Sep 18 13:33 anaconda-ks.cfg -rw-r--r--. 1 root root 0 Sep 22 04:40 a.txt -rw-r--r--. 1 root root 1329209 Sep 19 01:37 ch.exe.part drwxr-xr-x. 2 root root 6 Sep 18 23:42 Desktop drwxr-xr-x. 2 root root 6 Sep 18 23:42 Documents drwxr-xr-x. 2 root root 6 Sep 18 23:42 Downloads -rw-r--r--. 1 root root 1793 Sep 18 05:37 initial-setup-ks.cfg drwxr-xr-x. 2 root root 6 Sep 18 23:42 Music drwxr-xr-x. 2 root root 6 Sep 18 23:42 Pictures drwxr-xr-x. 2 root root 6 Sep 18 23:42 Public drwxr-xr-x. 2 root root 6 Sep 18 23:42 Templates drwxr-xr-x. 2 root root 6 Sep 18 23:42 Videos
3.卷
Docker卷是目前最为推荐的将容器中存储的数据持久化的方法,卷完全是由docker托管的。
与绑定挂载不同的是在容器中写入的文件,在移除容器后,再次启动具有附加卷的新容器时,容器中的文件依然存在,但是不会显示写进任何Docker宿主机目录
[root@localhost ~]# docker volume create --name=nginx-volume nginx-volume [root@localhost ~]# docker volume inspect nginx-volume [ { "CreatedAt": "2019-09-22T04:58:44-04:00", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/nginx-volume/_data", "Name": "nginx-volume", "Options": {}, "Scope": "local" } ] [root@localhost ~]# docker volume ls DRIVER VOLUME NAME local nginx-volume
Docker中的VOLUME命令
VOLUME指令会将附加在该指令之后的路径标记为外部的由Docker托管的数据存储卷。语法如下:
VOLUME ["/data-volume"]