博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Docker: docker container常用命令实战(2)-数据持久化
阅读量:4580 次
发布时间:2019-06-09

本文共 7135 字,大约阅读时间需要 23 分钟。

应用服务是在容器中运行的,容器随时会被删除,如果是个mysql容器呢?数据存储在容器里,容器删除了,数据也没了,那就是个噩梦。 所以一些数据是需要存储在容器之外的,可以是宿主机,可以是网络存储位置上,目的是为了数据能保留下来,这就是数据的持久化。 

 

接下来,我们了解一下,如何将容器中需要持久化的数据,持久化到容器之外的位置。

 

 

Docker提供三种方式将数据从宿主机挂载到容器中:

• volumes:Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)。保存数据的最佳方式。

• bind mounts:将宿主机上的任意位置的文件或者目录挂载到容器中。

• tmpfs:挂载存储在主机系统的内存中,而不会写入主机的文件系统。如果不希望将数据持久存储在任何位置,可以使用

tmpfs,同时避免写入容器可写层提高性能。

 

 

下面的实验,我们做前2种方式:

#列出volume[root@192 /]# docker volume lsDRIVER              VOLUME NAME#查看docker volume 帮助[root@192 /]# docker volume --helpUsage:    docker volume COMMANDManage volumesCommands:  create      Create a volume  inspect     Display detailed information on one or more volumes  ls          List volumes  prune       Remove all unused local volumes  rm          Remove one or more volumesRun 'docker volume COMMAND --help' for more information on a command.# 先测试通过docker volume创建卷,并关联给容器使用。这个卷里保存容器的持久化数据#新建一个卷,卷名=nginx-vol[root@192 /]# docker volume create nginx-volnginx-vol#列出volume,确认卷创建成功[root@192 /]# docker volume lsDRIVER              VOLUME NAMElocal               nginx-vol#查看卷详细信息[root@192 /]# docker volume inspect nginx-vol[    {        "CreatedAt": "2019-03-14T12:44:04+08:00",        "Driver": "local",        "Labels": {},        "Mountpoint": "/var/lib/docker/volumes/nginx-vol/_data",        "Name": "nginx-vol",        "Options": {},        "Scope": "local"    }]#进入nginx-vol卷文件存储目录[root@192 /]# cd /var/lib/docker/volumes/nginx-vol/_data#列出当前目录下文件[root@192 _data]# ls#列出当前存在的镜像文件[root@192 _data]# docker image lsREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEnginx               latest              881bd08c0b08        9 days ago          109MBbusybox             latest              d8233ab899d4        3 weeks ago         1.2MBcentos              7                   1e1148e4cc2c        3 months ago        202MBcentos              latest              1e1148e4cc2c        3 months ago        202MBjava                8                   d23bdf5b1b1b        2 years ago         643MB#列出最近的容器[root@192 _data]# docker container lsCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES5e67c2448806        nginx               "nginx -g 'daemon of…"   2 days ago          Up 3 hours          0.0.0.0:8800->80/tcp   trusting_banach#停止指定容器[root@192 _data]# docker container stop 5e67c24488065e67c2448806[root@192 _data]# docker container lsCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES#启动指定容器[root@192 _data]# docker container start 5e67c24488065e67c2448806#停止指定容器[root@192 _data]# docker container stop 5e67c24488065e67c2448806#启动一个容器,--mount src=nginx-vol,dst=/usr/share/nginx/html 将宿主机的nginx-vol卷,挂在到容器中的 /usr/share/nginx/html目录# docker volume特点,volume和容器中数据实时同步了,不论在那端修改了数据,会实时同步,2边数据会保持一致。 删除volume时,如果有关联的容器存在(停止和运行状态),那么无法删除volume. 只有移除容器,volume才能被删除[root@192 _data]# docker container run -d  --mount src=nginx-vol,dst=/usr/share/nginx/html -p 8800:80 nginx6886984c9b2df1dec674abb72a659e02d6a98afbb11dccdddb926571b08085b2[root@192 _data]# docker container lsCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES6886984c9b2d        nginx               "nginx -g 'daemon of…"   31 seconds ago      Up 30 seconds       0.0.0.0:8800->80/tcp   eloquent_jackson#进入nginx-vol卷[root@192 _data]# cd /var/lib/docker/volumes/nginx-vol/_data#查看是否存在文件,发现2个文件[root@192 _data]# ls50x.html  index.html#进入容器[root@192 _data]# docker container exec -it 6886984c9b2d bash#进入dst目录root@6886984c9b2d:/# cd /usr/share/nginx/html/#列出文件,发现源和目标文件时一致的,测试在源和目标修改index.html,都会生效root@6886984c9b2d:/usr/share/nginx/html# ls50x.html  index.htmlroot@6886984c9b2d:/usr/share/nginx/html# cat index.html 

Welcome to volume test!

root@6886984c9b2d:/usr/share/nginx/html# echo 'This modify is in container'>index.html root@6886984c9b2d:/usr/share/nginx/html# cat index.html This modify is in containerroot@6886984c9b2d:/usr/share/nginx/html# exitexit[root@192 _data]# cd /#下面测试在容器运行中删除卷,删除卷失败。[root@192 /]# docker volume rm nginx-volError response from daemon: remove nginx-vol: volume is in use - [6886984c9b2df1dec674abb72a659e02d6a98afbb11dccdddb926571b08085b2]#下面测试在容器状态时停止时删除卷,删除卷失败。[root@192 /]# docker container stop 6886984c9b2df1dec674abb72a659e02d6a98afbb11dccdddb926571b08085b26886984c9b2df1dec674abb72a659e02d6a98afbb11dccdddb926571b08085b2[root@192 /]# docker volume rm nginx-volError response from daemon: remove nginx-vol: volume is in use - [6886984c9b2df1dec674abb72a659e02d6a98afbb11dccdddb926571b08085b2][root@192 /]# docker container ps -qa6886984c9b2d5e67c2448806[root@192 /]# docker container lsCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES#下面测试,删除容器后,删除卷,卷删除成功[root@192 /]# docker container rm 6886984c9b2df1dec674abb72a659e02d6a98afbb11dccdddb926571b08085b26886984c9b2df1dec674abb72a659e02d6a98afbb11dccdddb926571b08085b2[root@192 /]# docker volume rm nginx-volnginx-vol[root@192 /]# docker volume lsDRIVER VOLUME NAME# 下面测试数据持久化的第2种方式:bind mount ,可以将宿主机的任意文件位置挂载到容器的任意位置,容器中的路径下如果存在文件,这些文件将会被隐藏# 新建目录 wwwroot[root@192 /]# mkdir wwwroot# 启动一个容器,--mount type=bind,src=$PWD/wwwroot,dst=/usr/share/nginx/html, 将宿主机src目录,挂在到容器/usr/share/nginx/html的目录[root@192 /]# docker container run -d -p 8900:80 --mount type=bind,src=$PWD/wwwroot,dst=/usr/share/nginx/html nginxdbc6252103716d58aa7897919e98025e51972149246b9f078304a3e26ce8d6a0# 查看宿主机wwwroot目录下,不存在文件[root@192 /]# ls wwwroot/[root@192 /]# lsbin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var wwwroot# 查看容器/usr/share/nginx/html的目录下,不存在文件; [root@192 /]# docker container exec -it dbc6252103716d58aa7897919e98025e51972149246b9f078304a3e26ce8d6a0 bashroot@dbc625210371:/# cd /usr/share/nginx/html/root@dbc625210371:/usr/share/nginx/html# lsroot@dbc625210371:/usr/share/nginx/html# exitexit# 在宿主机wwwroot目录下,创建文件[root@192 /]# cd wwwroot/[root@192 wwwroot]# ls[root@192 wwwroot]# touch index.html[root@192 wwwroot]# vi index.html # 进入容器,查看是否存在文件,观察到也存在文件了[root@192 wwwroot]# docker container exec -it dbc6252103716d58aa7897919e98025e51972149246b9f078304a3e26ce8d6a0 bashroot@dbc625210371:/# cd /usr/share/nginx/html/root@dbc625210371:/usr/share/nginx/html# lsindex.html# 在容器中创建文件root@dbc625210371:/usr/share/nginx/html# touch a.outroot@dbc625210371:/usr/share/nginx/html# exitexit# 在宿主机观察到,在容器中创建的文件存在,说明在2边的操作,会互相同步。[root@192 wwwroot]# lsa.out index.html

 

总结:

Volume特点:

多个运行容器之间共享数据

• 当容器停止或被移除时,该卷依然存在。

• 多个容器可以同时挂载相同的卷。

• 当明确删除卷时,卷才会被删除。

• 将容器的数据存储在远程主机或其他存储上

• 将数据从一台Docker主机迁移到另一台时,先停止容器,然后备份卷的目录(/var/lib/docker/volumes/)

 

Bind Mounts特点:

• 从主机共享配置文件到容器。默认情况下,挂载主机/etc/resolv.conf到每个容器,提供DNS解析。

在Docker主机上的开发环境和容器之间共享源代码。例如,可以将Maven target目录挂载到容器中,每次在Docker主机

上构建Maven项目时,容器都可以访问构建的项目包。

 

作者:

出处:

关于作者:专注软件测试,测试运维相关工作,请多多赐教!

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 欢迎博客园朋友加微信联系。 微信:yangguangkg20140901 暗号:博客园.

转载于:https://www.cnblogs.com/keeptesting/p/10530102.html

你可能感兴趣的文章
2016012032四则运算网页版结对项目报告
查看>>
淘宝专业版改基础版方法
查看>>
[转]ARM Pipeline
查看>>
[转]Blocking Code Injection on iOS and OS X
查看>>
颜色分类函数
查看>>
(中等) HDU 4725 The Shortest Path in Nya Graph,Dijkstra+加点。
查看>>
sort-归并排序
查看>>
django 快速实现完整登录系统(cookie)
查看>>
.NET中的out和ref关键字
查看>>
Python之ftp服务器
查看>>
KMP预处理
查看>>
oracle的wm_concat函数实现行转列
查看>>
C语 三子棋小游戏
查看>>
[BZOJ 1861] 书架
查看>>
送给毕业生的一个学习建议
查看>>
基于redis+lua实现高并发场景下的秒杀限流解决方案
查看>>
Oracle 块修改跟踪 (Block Change Tracking) 说明
查看>>
阿里云 Redis 服务遇到的问题
查看>>
Jwt Token 安全策略使用 ECDSA 椭圆曲线加密算法签名/验证
查看>>
Window2008通过web.config进行限制ip访问
查看>>