docker数据管理

时间:2022-07-26
本文章向大家介绍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

恢复

[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