docker(9):docker的数据卷和数据卷容器

 

docker(9):docker的数据卷和数据卷容器

 

https://www.cnblogs.com/along21/p/10237219.html

https://www.cnblogs.com/zhujingzhi/p/9656362.html

生产环境中使用Docker的过程中,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作。

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

  1. 数据卷(Data Volumes):容器内数据直接映射到本地主机环境;如何在容器内创建数据卷,并且把本地的目录或文件挂载到容器内的数据卷中。
  2. 数据卷容器(Data Volume Containers):使用特定容器维护数据卷。如何使用数据卷容器在容器和主机、容器和容器之间共享数据,并实现数据的备份和恢复。

 

1 数据卷

数据卷是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于Linux中的mount操作。

数据卷可以提供很多有用的特性,如下所示:

  1. 数据卷可以在容器之间共享和重用,容器间传递数据将变得高效方便;
  2. 对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作;
  3. 对数据卷的更新不会影响镜像,解耦了应用和数据;
  4. 卷会一直存在,直到没有容器使用,可以安全地卸载它。

创建数据卷并挂载

数据卷(文件或目录)

    -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 ~]#

 

posted on 2019-08-08 15:03  光阴8023  阅读(578)  评论(0编辑  收藏  举报