docker数据管理

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

Docker提供三种方式将数据从宿主机挂载到容器中:
•volumes:Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)。保存数据的最佳方式。
•bind mounts:将宿主机上的任意位置的文件或者目录挂载到容器中。
•tmpfs:挂载存储在主机系统的内存中,而不会写入主机的文件系统。如果不希望将数据持久存储在任何位置,可以使用tmpfs,同时避免写入容器可写层提高性能。

volumes

创建数据卷

[root@localhost ~]# docker volume create nginx-vol
nginx-vol
[root@localhost ~]# ls /var/lib/docker/volumes/nginx-vol/
_data

查看数据卷信息

[root@localhost ~]# docker volume ls
DRIVER              VOLUME NAME
local               nginx-vol

查看数据卷的详细信息

[root@localhost ~]# docker volume inspect nginx-vol
[
    {
        "CreatedAt": "2018-11-20T15:58:54+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/nginx-vol/_data",
        "Name": "nginx-vol",
        "Options": {},
        "Scope": "local"
    }
]

使用已有镜像创建容器,并挂载数据卷到容器里的路径/usr/share/nginx/html

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              62f816a209e6        13 days ago         109MB
[root@localhost ~]# docker run -itd -p 80:80 --name=nginx-vol-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
f96f73d2688f398d5efeb3f466769fc9b11318a81248f263fabdaf63cb37a635
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
f96f73d2688f        nginx               "nginx -g 'daemon of…"   20 seconds ago      Up 19 seconds       0.0.0.0:80->80/tcp   nginx-vol-test

在数据卷目录准备一个测试页

[root@localhost ~]# ls /var/lib/docker/volumes/nginx-vol/_data/
50x.html  index.html
[root@localhost ~]# echo "volume test111" > /var/lib/docker/volumes/nginx-vol/_data/test.html
[root@localhost ~]# cat /var/lib/docker/volumes/nginx-vol/_data/test.html
volume test111

访问容器

删除容器后数据卷里数据还在,这样的话再创建容器的时候指定数据卷路径还是可以访问

[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f96f73d2688f nginx "nginx -g 'daemon of…" 16 minutes ago Up 16 minutes 0.0.0.0:80->80/tcp nginx-vol-test
[root@localhost ~]# docker stop nginx-vol-test
nginx-vol-test
[root@localhost ~]# docker rm nginx-vol-test
nginx-vol-test
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local nginx-vol
[root@localhost ~]# ls /var/lib/docker/volumes/nginx-vol/_data/
50x.html index.html test.html

 多个容器共用一个数据卷的数据

[root@localhost ~]# docker run -itd -p 81:80 --name=volume-test1 --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
bb2677a06385c5dd6750e947a495317baa7f7fcaa8731a84dc8b7a507065deba
[root@localhost ~]# docker run -itd -p 82:80 --name=volume-test2 --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
af2ab077bdaadf069da55b31cc40c879ea3f5c78461366c312feb13ce33688dd
[root@localhost ~]# curl http://192.168.0.191:81/test.html
volume test111
[root@localhost ~]# curl http://192.168.0.191:82/test.html
volume test111

删除数据卷命令

[root@localhost ~]# docker volume ls
DRIVER              VOLUME NAME
local               nginx-vol
[root@localhost ~]# docker volume rm nginx-vol  #确保该卷没有容器正在使用才能删除,所以先删除容器
Error response from daemon: remove nginx-vol: volume is in use - [bb2677a06385c5dd6750e947a495317baa7f7fcaa8731a84dc8b7a507065deba, af2ab077bdaadf069da55b31cc40c879ea3f5c78461366c312feb13ce33688dd]
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
af2ab077bdaa        nginx               "nginx -g 'daemon of…"   4 minutes ago       Up 4 minutes        0.0.0.0:82->80/tcp   volume-test2
bb2677a06385        nginx               "nginx -g 'daemon of…"   5 minutes ago       Up 5 minutes        0.0.0.0:81->80/tcp   volume-test1
[root@localhost ~]# docker stop `docker ps -aq`
af2ab077bdaa
bb2677a06385
[root@localhost ~]# docker container rm  `docker ps -aq`
af2ab077bdaa
bb2677a06385
[root@localhost ~]# docker volume rm nginx-vol
nginx-vol

创建容器时也可以不指定数据卷,此时docker将自动创建一个匿名的volume

[root@localhost ~]# docker run -itd --name=myweb -v /data:/data nginx
eec4af49b3fd284d00eecbd85171130aefee5035ec982e697154c2ca22dc8948
[root@localhost ~]# ls /var/lib/docker/volumes/
3f8df059fd44c1e79cda37c5c9bdb754ad71937bfe1bb40e827589ee19ffe33f metadata.db
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local 3f8df059fd44c1e79cda37c5c9bdb754ad71937bfe1bb40e827589ee19ffe33f

bind mount

用卷创建一个容器:
# docker run -d -it --name=nginx-test --mount type=bind,src=/app/wwwroot,dst=/usr/share/nginx/html nginx
# docker run -d -it --name=nginx-test -v /app/wwwroot:/usr/share/nginx/html nginx
验证绑定:
# docker inspect nginx-test
清理:
# docker stop nginx-test
# docker rm nginx-test
注意:
1.如果源文件/目录没有存在,不会自动创建,会抛出一个错误。
2.如果挂载目标在容器中非空目录,则该目录现有内容将被隐藏。

Volume特点:
•多个运行容器之间共享数据。
•当容器停止或被移除时,该卷依然存在。
•多个容器可以同时挂载相同的卷。
•当明确删除卷时,卷才会被删除。
•将容器的数据存储在远程主机或其他存储上
•将数据从一台Docker主机迁移到另一台时,先停止容器,然后备份卷的目录(/var/lib/docker/volumes/)

Bind Mounts特点:
•从主机共享配置文件到容器。默认情况下,挂载主机/etc/resolv.conf到每个容器,提供DNS解析。
•在Docker主机上的开发环境和容器之间共享源代码。例如,可以将Maven target目录挂载到容器中,每次在Docker主机上构建Maven项目时,容器都可以访问构建的项目包。
•当Docker主机的文件或目录结构保证与容器所需的绑定挂载一致时

数据卷容器

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

创建数据卷容器,并在其中创建一个数据卷挂载到/data

[root@localhost ~]# docker run -it -v /dbdata --name dbdata centos
[root@8e6719c92634 /]# ls
anaconda-post.log  bin  dbdata  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

创建容器,通过volume-from来挂载dbdata容器中的数据卷 (--volumes-from可以多次使用挂载多个卷)

[root@localhost ~]# docker run -it --volumes-from dbdata --name myweb nginx /bin/bash
root@9fce51370304:/# ls /dbdata/
root@9fce51370304:/# touch /dbdata/test.txt

查看dbdata容器是否有数据

[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9fce51370304 nginx "/bin/bash" 5 minutes ago Exited (0) 3 minutes ago myweb
8e6719c92634 centos "/bin/bash" 12 minutes ago Up 13 seconds dbdata
[root@localhost ~]# docker exec -it 8e6719c92634 /bin/bash
[root@8e6719c92634 /]# ls /dbdata/
test.txt

 利用数据卷容器迁移数据

备份

[root@localhost ~]# docker run --volumes-from dbdata -v /backup:/backup --name work centos tar cvf /backup/backup.tar /dbdata
/dbdata/
/dbdata/test.txt
tar: Removing leading `/' from member names
[root@localhost ~]# ls /backup/
backup.tar
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
de52379b0635        centos              "tar cvf /backup/bac…"   42 seconds ago      Exited (0) 41 seconds ago                       work
9fce51370304        nginx               "/bin/bash"              16 hours ago        Exited (0) 16 hours ago                         myweb
8e6719c92634        centos              "/bin/bash"              16 hours ago        Up 16 hours                                     dbdata
首先利用centos镜像创建了一个容器work,使用--volumes-from dbdata参数来让容器挂载dbdata容器的数据卷(即dbdata数据卷);
-v /backup:/backup参数来将本地的备份目录(/backup)挂载到work容器的/backup目录。work容器启动后,使用了tar cvf /backup/backup.tar /dbdata命令来将/dbdata下的内容备份为容器内的/backup/backup.tar,
即宿主机/backup目录下的/backup/backup.tar

恢复

[root@localhost ~]# docker run -itd -v /dbdata --name db3 centos bash
100cacc5aa24ac39606b89c21dc9ef6ec010f4eb82ac666762546aadb827ad13
[root@localhost ~]# docker run --volumes-from db3 -v /backup:/backup --name db4 centos tar xvf /backup/backup.tar 
dbdata/
dbdata/test.txt
[root@localhost ~]# docker exec -it db3 bash -c 'ls /dbdata'
test.txt

首先利用centos镜像新建一个db3的容器,然后通过--volumes-from参数挂载db3容器的数据卷(/dbdata)新建容器,
并将本地的/backup目录映射到db4容器中。而后对/backup/backup.tar进行解压到/dbdata目录下,从而实现db3恢复/dbdata数据

原文地址:https://www.cnblogs.com/yuezhimi/p/9990530.html