docker(9):docker的数据卷和数据卷容器
docker(9):docker的数据卷和数据卷容器
https://www.cnblogs.com/along21/p/10237219.html
https://www.cnblogs.com/zhujingzhi/p/9656362.html
生产环境中使用Docker的过程中,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作。
容器中管理数据主要有两种方式:
- 数据卷(Data Volumes):容器内数据直接映射到本地主机环境;如何在容器内创建数据卷,并且把本地的目录或文件挂载到容器内的数据卷中。
- 数据卷容器(Data Volume Containers):使用特定容器维护数据卷。如何使用数据卷容器在容器和主机、容器和容器之间共享数据,并实现数据的备份和恢复。
1 数据卷
数据卷是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于Linux中的mount操作。
数据卷可以提供很多有用的特性,如下所示:
- 数据卷可以在容器之间共享和重用,容器间传递数据将变得高效方便;
- 对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作;
- 对数据卷的更新不会影响镜像,解耦了应用和数据;
- 卷会一直存在,直到没有容器使用,可以安全地卸载它。
创建数据卷并挂载
数据卷(文件或目录)
-v /data
-v src:dst
样例代码
链接: https://pan.baidu.com/s/1ZutKVtOfUc3_MnUaRjMjdw 提取码: vfmn
在用docker run 命令的时候,使用 -v 标记可以在容器内创建一个数据卷。多次重复使用 -v 标记可以创建多个数据卷。用户可以将一些程序或数据放到本地目录中,然后在容器内运行和使用。另外,本地目录的路径必须是绝对路径,如果目录不存在,Docker会自动创建。
[root@docker-136 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@docker-136 ~]# ls /opt/xiaoniao/ 2000.png 21.js icon.png img index.html sound1.mp3 xiaoniaofeifei.zip [root@docker-136 ~]# docker run -d -p 80:80 --name xiaoniao-web1 -v /opt/xiaoniao:/usr/share/nginx/html nginx 24112cc6a543cc4e02a3f68da973e06d3ee1f962d0e77ca924df9b0fb2d76422 [root@docker-136 ~]#
自动同步
上面的命令是将主机的/opt/web 目录挂载到容器的/usr/shart/nginx/html主页下,这样是很方便的在你进行数据修改的是,直接修改本地文件就行了,容器直接就会同步了
[root@docker-136 xiaoniao]# docker exec -it xiaoniao-web1 /bin/bash root@24112cc6a543:/# cd /usr/share/nginx/html/ root@24112cc6a543:/usr/share/nginx/html# ls 2000.png 21.js icon.png img index.html sound1.mp3 xiaoniaofeifei.zip root@24112cc6a543:/usr/share/nginx/html#
我们在宿主机本地修改一个页面信息
基于多端口的多站点
80是主页,81端口是游戏,写一个81的配置文件挂载上去
[root@docker-136 opt]# pwd /opt [root@docker-136 opt]# ls containerd xiaoniao xiaoniao-81.conf [root@docker-136 opt]# cat xiaoniao-81.conf server{ root /opt; listen 81; } [root@docker-136 opt]# docker run -d -p 80:80 -p 81:81 --name web2 -v /opt/xiaoniao-81.conf:/etc/nginx/conf.d/xiaoniao-81.conf -v /opt/xiaoniao:/opt nginx a7275fc9ab5c02c61ab593d0412ba3cf28eed6c5f30f2965d92f8526779a2779 [root@docker-136 opt]#
2 数据卷容器
如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,但是它的目的是专门用来提供数据卷供其他容器挂载。
2.1 创建数据卷容器docker volume create
[root@docker-136 opt]# docker volume create wangxu wangxu
2.2 查看数据卷docker volume create
[root@docker-136 opt]# docker volume ls DRIVER VOLUME NAME local wangxu [root@docker-136 xiaoniao]# docker volume inspect wangxu [ { "CreatedAt": "2019-08-08T12:15:36+08:00", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/wangxu/_data", "Name": "wangxu", "Options": {}, "Scope": "local" } ] [root@docker-136 xiaoniao]#
2.3 启动一个挂载数据卷的容器
[root@docker-136 opt]# docker run -d -p 82:80 -v wangxu:/usr/share/nginx/html --name web-3 nginx dcd933b52a86429ca962113058073f92b362b6f40d25ba0d44d4084cf6167669 [root@docker-136 opt]# docker ps -a -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES dcd933b52a86 nginx "nginx -g 'daemon of…" 10 seconds ago Up 8 seconds 0.0.0.0:82->80/tcp web-3
2.4 查看容器挂载的数据卷信息
[root@docker-136 ~]# docker inspect web-4 "Mounts": [ { "Type": "volume", "Name": "wangxu", "Source": "/var/lib/docker/volumes/wangxu/_data", "Destination": "/usr/share/nginx/html", "Driver": "local", "Mode": "z", "RW": true, "Propagation": "" }
2.5 进入容器修改文件,删掉容器,起一个新容器,文件仍在
[root@docker-136 opt]# docker exec -it web-3 /bin/bash root@dcd933b52a86:/# cd /usr/share/nginx/html/ root@dcd933b52a86:/usr/share/nginx/html# ls 50x.html index.html root@dcd933b52a86:/usr/share/nginx/html# echo 'docker-test' > index.html root@dcd933b52a86:/usr/share/nginx/html#
[root@docker-136 opt]# docker stop web-3 web-3 [root@docker-136 opt]# docker rm web-3 web-3 [root@docker-136 opt]# docker run -d -p 83:80 -v wangxu:/usr/share/nginx/html --name web-4 nginx 1ffa3f8e10414776956570b19d88ef8db91fd868ee35c4cc92daa18bef8bcef0 [root@docker-136 opt]# docker ps -a -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1ffa3f8e1041 nginx "nginx -g 'daemon of…" 5 seconds ago Up 2 seconds 0.0.0.0:83->80/tcp web-4 [root@docker-136 opt]#
2.6 多个容器挂载相同数据卷容器--volumes-from
[root@docker-136 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1ffa3f8e1041 nginx "nginx -g 'daemon of…" 28 minutes ago Up 33 seconds 0.0.0.0:83->80/tcp web-4 a7275fc9ab5c nginx "nginx -g 'daemon of…" 35 minutes ago Up 35 minutes 0.0.0.0:80-81->80-81/tcp web2 [root@docker-136 ~]# docker run -d -p 84:80 --volumes-from web-4 --name web-5 nginx 751a38fb4f99a8c15ec61ca55769b682a0f8dce6c191149f0136c0c344870fa4 [root@docker-136 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 751a38fb4f99 nginx "nginx -g 'daemon of…" 6 seconds ago Up 2 seconds 0.0.0.0:84->80/tcp web-5 1ffa3f8e1041 nginx "nginx -g 'daemon of…" 28 minutes ago Up 45 seconds 0.0.0.0:83->80/tcp web-4 a7275fc9ab5c nginx "nginx -g 'daemon of…" 35 minutes ago Up 35 minutes 0.0.0.0:80-81->80-81/tcp web2 [root@docker-136 ~]#
2.7 数据卷容器备份、恢复
volume作为数据的载体,在很多情况下需要对其中的数据进行备份迁移。一个很容易想到的办法是使用 docker inspect 查找到volume 在宿主机上对应的文件夹的位置,然后复制其中的内容或者打包。这种做法不推荐,推荐使用 --volumes-from来实现。
但我仍觉得直接copy比较方便。
2.7.1 备份
[root@docker-136 ~]# docker run --rm --volumes-from web-5 -v $(pwd)/backup:/backup --name backup3 centos tar zcvf /backup/backup.tar.gz /usr/share/nginx/html#启动临时容器备份 tar: Removing leading `/' from member names /usr/share/nginx/html/ /usr/share/nginx/html/50x.html /usr/share/nginx/html/index.html [root@docker-136 ~]# ls backup MadKingClient p.txt tools [root@docker-136 ~]# cd backup/ [root@docker-136 backup]# ls backup.tar.gz [root@docker-136 backup]# tar -zxf backup.tar.gz [root@docker-136 backup]# ls backup.tar.gz usr [root@docker-136 backup]# cd usr/share/nginx/html/ [root@docker-136 html]# ls 50x.html index.html [root@docker-136 html]# # 具体的意思是:利用centos镜像创建一个容器,使用--volumes-from web-5参数来让容器挂载web-5容器的数据卷,使用-v 参数来挂载本地当前目录到容器的/backup目录,容器启动后使用tar打包备份到本地目录
2.7.2 恢复(没有尝试)
如果要将数据恢复到一个容器,可以按照下面的步骤操作。
首先创建一个带有数据卷的容器dbdata2:
$ docker run -v /dbdata --name dbdata2 ubuntu /bin/bash 然后创建另一个新的容器,挂载dbdata2的容器,并使用untar解压备份文件到所挂载的容器卷中: $ docker run --volumes-from dbdata2 -v $(pwd):/backup --name worker ubuntu bash cd /dbdata tar xvf /backup/backup.tar
2.8 清除数据卷容器
[root@docker-136 ~]# docker volume ls DRIVER VOLUME NAME local 062b2cda3b50d7e3a79122e070656cad880404829508628c91b1e029194dd828 local 165b8eaf730e6fd4d6055e6847c1193cd6c32f610e3653922266088151fd7e99 local wangxu [root@docker-136 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 38524136b729 centos "/bin/bash" 41 minutes ago Up 41 minutes db8 171b81516940 nginx "nginx -g 'daemon of…" 43 minutes ago Up 43 minutes 80/tcp web-7 751a38fb4f99 nginx "nginx -g 'daemon of…" 2 hours ago Up 2 hours 0.0.0.0:84->80/tcp web-5 1ffa3f8e1041 nginx "nginx -g 'daemon of…" 2 hours ago Up 2 hours 0.0.0.0:83->80/tcp web-4 a7275fc9ab5c nginx "nginx -g 'daemon of…" 3 hours ago Up 3 hours 0.0.0.0:80-81->80-81/tcp web2 [root@docker-136 ~]# docker stop db8 db8 [root@docker-136 ~]# docker rm -v db8 db8 [root@docker-136 ~]# docker volume ls DRIVER VOLUME NAME local 062b2cda3b50d7e3a79122e070656cad880404829508628c91b1e029194dd828 local wangxu [root@docker-136 ~]#
清除无主的数据卷:docker volume prune
[root@docker-136 ~]# docker volume ls DRIVER VOLUME NAME local 062b2cda3b50d7e3a79122e070656cad880404829508628c91b1e029194dd828 local aa local bb local wangxu [root@docker-136 ~]# docker volume prune WARNING! This will remove all local volumes not used by at least one container. Are you sure you want to continue? [y/N] y Deleted Volumes: aa bb Total reclaimed space: 0B [root@docker-136 ~]# docker volume ls DRIVER VOLUME NAME local 062b2cda3b50d7e3a79122e070656cad880404829508628c91b1e029194dd828 local wangxu [root@docker-136 ~]#