docker存储卷


简介
Docker镜像是由多个只读层添加而成,启动容器时,Docker加载值读镜像层并在镜像栈顶部添加一个读写层。

如果运行中的容器修改了现有的一个已经存在的文件,那么该文件将会在读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写曾中该文件的副本所隐层,这就是我们所说的写时复制,Elasticsearch也是用了写时复制。和这个略有不同。

默认情况下,容器不使用任何 volume,此时,容器的数据被保存在容器之内,它只在容器的生命周期内存在,关闭并重启容器,其数据不会受到影响,但是删除Docker容器,数据将会全部丢失。当然,也可以使用 docker commit 命令将它持久化为一个新的镜像。

加粗样式

docker存储卷

COW是copy on write的缩写。意思是当写的时候拷贝一份新的,在新的上面进行写入,写入完成后,再将新的结果赋值给旧的数据。

COW技术原理(Copy On Write,写时复制)

 ——针对随时变化的数据进行备份

直接映射原始盘的数据内容

当原始盘的旧数据有修改时,在修改之前自动将旧数据存入前端盘

对前端盘的修改不回写到原始盘

前端盘:永远显示在制作出前端盘那一瞬间原始盘所有数据内容

容器管理卷

用户在使用Docker的过程中,往往需要能查看容器内应用产生的数据,或者需要把容器内的数据进行备份,甚至多个容器之间进行数据的共享,这必然涉及容器的数据管理操作。

容器中管理数据主要有两种方式:

  • 数据卷(Data Volumes)
  • 数据卷容器(Data Volumes Containers)

容器Volume使用语法:
Docker-managed volume

docker run -it --name CONTAINER_NAME -v VOLUMEDIR IMAGE_NAME
//创建容器管理卷
[root@localhost ~]# docker container run -it --rm -v /data busybox /bin/sh
/ # ls
bin   data  dev   etc   home  proc  root  sys   tmp   usr   var

[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND     CREATED         STATUS         PORTS     NAMES
d21808e8d2fb   busybox   "/bin/sh"   3 minutes ago   Up 3 minutes             objective_wu

//查看容器的详细信息
[root@localhost ~]# docker inspect d21808e8d2fb
            ....
                "Source": "/var/lib/docker/vc3ab4f87d6b91bae074ca/_data",
            ....
容器绑定卷

Bind mount volume

docker run -it --name CONTAINER_NAME -v HOSTDIR:VOLUMEDIR IMAGE_NAME
//创建一个容器并绑定卷组
[root@localhost ~]# docker container run -it --rm -v /volume:/data busybox /bin/sh
/ # ls
bin   dev   home  root  tmp   var
data  etc   proc  sys   usr
/ # ls data/
/ # ls data/
abcd



[root@localhost ~]# cd /volume/
[root@localhost volume]# touch abcd
[root@localhost volume]# 
在容器中使用数据卷
[root@localhost ~]# docker  container run -d  -p 80:80 -v /www/nginx:/usr/share/nginx/html nginx
13142634e238e335f1553a8420da1ea6da2f6dcbd4c4a293cb8d9428589d6061
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                NAMES
13142634e238   nginx     "/docker-entrypoint.…"   6 seconds ago   Up 5 seconds   0.0.0.0:80->80/tcp   festive_fermat

[root@localhost ~]# docker exec -it 13142634e238 /bin/bash
root@13142634e238:/usr/share/nginx# echo 'hell word' > index.html 
//Docker挂载数据卷的默认权限是读写(rw),用户也可以通过(ro)指定为只读:
[root@localhost ~]# docker container run -d -p 80:80 -v /www/nginx:/usr/share/nginx/html:ro nginx
b974a0772d60721718c9d261f598e62b2418beedb42a2040a4564b7e07db0aa4

加了:ro以后,容器内挂载的数据卷的数据就无法修改了。

挂载一个本地主机文件作为数据卷

[root@localhost ~]# docker run -d  -v ~/.bash_history:/root/.bash_history  nginx
bf71bf9a15387948f644e56d2203dffaa145627616658fe150cf677445193616
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
bf71bf9a1538   nginx     "/docker-entrypoint.…"   5 seconds ago   Up 4 seconds   80/tcp    compassionate_faraday

[root@localhost ~]# docker exec -it bf71bf9a1538 /bin/bash
root@bf71bf9a1538:~# cd
root@bf71bf9a1538:~# ls -a
.  ..  .bash_history  .bashrc  .profile

root@bf71bf9a1538:~# history 

这样就可以记录在容器输入过的命令历史了。

如果直接挂载一个文件到容器,使用文件编辑工具,包括vi或者sed去修改文件内容的时候,可能会造成inode的改变,这样将会导致错误。所以推荐的方式是直接挂载文件所在的目录。

数据卷容器

如果用户需要在容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器其实就是一个普通的容器,专门用它提供数据卷供其他容器挂载使用,方法如下:

首先,创建一个数据卷容器dbdata,并在其中创建一个数据卷挂载到/dbdata:

[root@localhost ~]# docker run -itd -v /dbdata --name dbdata centos /bin/bash
d237a158bd0eba548d57df30f992ecabffdb2ac7d0a7ca8f183eddf79b37c95c

[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED              STATUS              PORTS     NAMES
d237a158bd0e   centos    "/bin/bash"   About a minute ago   Up About a minute             dbdata

然后可以在其他容器中使用–volumes-from来挂载dbdata容器中的数据卷,例如创建db1和db2两个容器,并从dbdata容器挂载数据卷:

[root@localhost ~]# docker run -it --volumes-from dbdata --name db2 centos /bin/bash

[root@localhost ~]# docker run -it --volumes-from dbdata --name db1 centos /bin/bash

此时,容器db1和db2都挂载同一个数据卷到相同的/dbdata目录。三个容器任何一方在该目录下的写入,其他容器都可以看到。

//在db1容器中创建一个abcd
[root@1bb75eb228fb /]# cd dbdata/ 
[root@1bb75eb228fb dbdata]# ls
[root@1bb75eb228fb dbdata]# touch  abcd

//在db2容器中查看
[root@82ad39aab23b /]# cd dbdata/
[root@82ad39aab23b dbdata]# ls
abcd

可以多次使用–volumes-from参数来从多个容器挂载多个数据卷。还可以从其他已挂载了容器卷的容器来挂载数据卷:

[root@localhost ~]# docker run -it  --volumes-from db1 --name db3 centos /bin/bash

[root@2650991e7023 /]# cd /dbdata/
[root@2650991e7023 dbdata]# ls
abcd

使用–volumes-from参数所挂载数据卷的容器自身并不需要保持在运行状态。

如果删除了挂载的容器(包括dbdata、db1和db2),数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显式使用docker rm -v命令来指定同时删除关联的容器。


[root@localhost ~]# docker run -itd --name web1 --volumes-from nginx_config  --volumes-from nginx_documentroot  nginx /bin/bash
利用数据卷容器迁移数据

可以利用数据卷容器对其中的数据卷进行备份、恢复,以实现数据的迁移。

备份
使用下面的命令来备份dbdata数据卷容器内的数据卷

[root@localhost ~]# docker run -itd --name dbdata -v  /dadata centos /bin/bash
bd4d5b01f92e2d800cab9201bbcbb82fb26535dbdace3385e629747ed6742e90

[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
bd4d5b01f92e   centos    "/bin/bash"   3 minutes ago   Up 3 minutes             dbdata


[root@localhost ~]# docker exec -it dbdata /bin/bash
[root@c44ff01ee7cd /]# cd /dadata/
[root@c44ff01ee7cd dadata]# touch  abcd

//备份迁移
[root@localhost ~]# docker run --name worker --volumes-from dbdata -v $(pwd):/backup centos tar -zcf /backup/backup.tar.gz /dbdata



//恢复
如果要恢复数据到一个容器,可以按照下面的操作。首先创建一个带有数据卷的容器dbdata2:
[root@localhost ~]# docker run -it --name dbdata2 -v /dbdata centos
[root@96b94cab1cc1 /]# 
[root@96b94cab1cc1 /]# ls dbdata/
[root@96b94cab1cc1 /]#

然后创建另一个新的容器,挂载dbdata2容器,并使用untar解压备份文件到所挂载的容器卷中即可:

[root@localhost ~]# docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xf /backup/backup.tar.gz




[root@localhost ~]# docker exec -it dbdata2 /bin/bash
[root@5ae36c7700fa /]# cd dbdata/
[root@5ae36c7700fa dbdata]# ls
abcd

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值