前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >docker数据管理

docker数据管理

作者头像
yuezhimi
发布2020-09-30 11:33:15
7250
发布2020-09-30 11:33:15
举报
文章被收录于专栏:yuezhimi

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

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

volumes

创建数据卷

代码语言:javascript
复制
[root@localhost ~]# docker volume create nginx-vol
nginx-vol
[root@localhost ~]# ls /var/lib/docker/volumes/nginx-vol/
_data

查看数据卷信息

代码语言:javascript
复制
[root@localhost ~]# docker volume ls
DRIVER              VOLUME NAME
local               nginx-vol

查看数据卷的详细信息

代码语言:javascript
复制
[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

代码语言:javascript
复制
[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

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

代码语言:javascript
复制
[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

访问容器

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

代码语言:javascript
复制
[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

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

代码语言:javascript
复制
[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

删除数据卷命令

代码语言:javascript
复制
[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

代码语言:javascript
复制
[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
代码语言:javascript
复制
用卷创建一个容器:
# 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

代码语言:javascript
复制
[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可以多次使用挂载多个卷)

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

查看dbdata容器是否有数据

代码语言:javascript
复制
[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

 利用数据卷容器迁移数据

备份

代码语言:javascript
复制
[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

恢复

代码语言:javascript
复制
[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
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-11-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • volumes
  • bind mount
  • 数据卷容器
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档