Docker 管理应用程序数据
1、将Docker主机数据挂载到容器
Docker提供三种不同的方式将数据从宿主机挂载到容器中:volumes , bind mounts 和tmpfs
volumes: Docker管理宿主机文件系统的一步分(/var/lib/docker/volumes)
bind mounts: 可以存储在宿主机系统的任意位置
tmpfs: 挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统

比如我们容器中启动了mysql数据库,这里我们可以把数据放在宿主机的某一个目录下,这样即使我们删除了mysql这台容器,也不会让我们的数据丢失,docker提供了上面三种数据卷的方式来管理数据
volume:
1、创建数据卷

创建的的数据卷的目录一定是在/var/lib/docker/volumes下的
2、查看数据卷信息
[root@node02 volumes]# docker volume ls (罗列有哪些数据卷)
DRIVER VOLUME NAME
local 1a22651fb87dd211bbd2156ce645225d6127edd00150bd879d20f5d9f3490762
local 1b54af29a1eb19e7a359b44793b19c7b049801c4ffe475dac4f9cebfcc47cde4
local 20e91019905da93898d6491de200f471f3251d9e2900263859fad9ef30989737
local 2e1ac775ad2d475af68d9e78b94ecf0d0ef07b1031a77fc90704020de4a9f54f
local 76052c2502fae1f858c28a6be02c4f3982d320ec3bb3c77534f57bb2fe8da1c7
local 7f397b7401f21a985c40376908dd8d8ebcf9a8d7c79093f23b2e718485f0032b
local a326fce6d638fc2d8971f8b00880eea8c376c9e7bdd45ef323a8ea764939afee
local adb8cc97e3ac4d782d3098fdf828f6ca2d108153c4c8d437f02e939e101dbb99
local d93c61ffe74cfea942f6edaa42747506ffbec29feda846f9a93a22a1db79652e
local e14da5a9196841c146833cb8e71c8e0138257dd6d0601f267e91e91abdd3a8aa
local nginx-vol
[root@node02 volumes]# docker volume inspect nginx-vol (查看nginx-vol数据卷的详细信息,挂载在本地的/var/lib/docker/volumes/nginx-vol/_data位置)
[
{
"CreatedAt": "2018-09-10T16:18:22+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/nginx-vol/_data", 数据存储目录
"Name": "nginx-vol",
"Options": {},
"Scope": "local"
}
]
[root@node02 volumes]# docker container run -d -it -p 8800:80--name=nginx-vol-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx (使用nginx:latest镜像创建一个容器,容器名为nginx-vol-test,数据卷名称为nginx-vol,挂载容器的路径地址为/usr/share/nignx/html)
2b3a8ab12600d4059b3623369a6e34dc8aa222b2a6dc0cbf5f821fa73f81aded
[root@node02 volumes]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2b3a8ab12600 nginx "nginx -g 'daemon of…" 21 seconds ago Up 20 seconds 80/tcp nginx-vol-test
603494fada81 nginx:v1.7.9 "nginx -g 'daemon of…" 5 hours ago Up 5 hours 443/tcp, 0.0.0.0:8082->80/tcp nginx8
a63d1c647fc4 nginx:v1.7.9 "nginx -g 'daemon of…" 5 hours ago Up 5 hours 443/tcp, 0.0.0.0:8081->80/tcp nginx7
b2bd8d583859 nginx "nginx -g 'daemon of…" 5 hours ago Up 5 hours 0.0.0.0:8080->80/tcp nginx5
1ab0200029d7 busybox "sh" 6 hours ago Up 6 hours bs
[root@node02 volumes]#
[root@node02 volumes]# docker exec -it nginx-vol-test sh
# cd /usr/share/nginx/html
# ls
50x.html index.html
# touch nginx-vol.html
这样我们到宿主机的数据卷目录下看一下有没有nginx-vol.html文件
[root@node02 _data]# pwd
/var/lib/docker/volumes/nginx-vol/_data
[root@node02 _data]# ll
total 8
-rw-r--r-- 1 root root 537 Apr 10 00:01 50x.html
-rw-r--r-- 1 root root 612 Apr 10 00:01 index.html
-rw-r--r-- 1 root root 0 Sep 10 16:30 nginx-vol.html
我们发现是有的
这样我们编写一下文件内容
我们访问一下,发现是有的。这样我们现在做一个测试,我们把容器删除,看一下我们的数据卷上的文件还在不在

[root@node02 _data]# docker ps -a -q(这个命令是为了展示所有的container id)
50653a8fd0db
2b3a8ab12600
603494fada81
a63d1c647fc4
ea028db62306
b2bd8d583859
c754e6a5b7e8
b3eb98a0d6b7
18c2c16a209e
82bb6b307f6e
1ab0200029d7
598ff14945ba
f4b333719d2d
1cb429220472
c6e1684bf2c8
11c00cc9a713
0914dd1fa666
16dfd95dc305
815693a995c8
4d3267b2340d
7706db50eda8
e415f74dc6bd
ace56bc942aa
879a515a576a
909a5b87fee0 这样我们根据id来删除所有的容器:
[root@node02 _data]# docker rm -f $(docker ps -q -a)
50653a8fd0db
2b3a8ab12600
603494fada81
a63d1c647fc4
ea028db62306
b2bd8d583859
c754e6a5b7e8
b3eb98a0d6b7
18c2c16a209e
82bb6b307f6e
1ab0200029d7
598ff14945ba
f4b333719d2d
1cb429220472
c6e1684bf2c8
11c00cc9a713
0914dd1fa666
16dfd95dc305
815693a995c8
4d3267b2340d
7706db50eda8
e415f74dc6bd
ace56bc942aa
879a515a576a
909a5b87fee0
[root@node02 _data]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@node02 _data]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@node02 _data]#
所有的容器都已经删除了:
[root@node02 _data]# pwd
/var/lib/docker/volumes/nginx-vol/_data
[root@node02 _data]# ls
50x.html index.html nginx-vol.html
[root@node02 _data]# docker volume ls
DRIVER VOLUME NAME
local e14da5a9196841c146833cb8e71c8e0138257dd6d0601f267e91e91abdd3a8aa
local nginx-vol 但是我们nginx-vol 这个数据卷还在,这样的话,我们再创建一个容器,指定数据卷路径为nginx-vol 的话,还是可以访问的 [root@node02 volumes]# !1017
docker container run -d -it -p 8800:80 --name=nginx-vol-test2 --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
6fef45218a46e6bf1304113c6899a9baea9ebdbbc629059488e76ea111d252f1
我们在浏览器上输入:http://10.10.200.97:8800/nginx-vol.html还是可以出现我们的html页面,
同时我么你可以多个镜像共用这一个数据卷的数据的,
上面我们src 要是没有指定数据卷名称的话,这里他会自动创建一个匿名卷(一串字符串),也就是说这里分有名卷和匿名卷
官方文档:https://docs.docker.com/engine/admin/volumes/volumes/#start-a-container-with-a-volume 我们可以使用以下命令来删除清理数据卷
[root@node02 volumes]# docker volume ls
DRIVER VOLUME NAME
local 1a22651fb87dd211bbd2156ce645225d6127edd00150bd879d20f5d9f3490762
local 1b54af29a1eb19e7a359b44793b19c7b049801c4ffe475dac4f9cebfcc47cde4
local 20e91019905da93898d6491de200f471f3251d9e2900263859fad9ef30989737
local 2e1ac775ad2d475af68d9e78b94ecf0d0ef07b1031a77fc90704020de4a9f54f
local 76052c2502fae1f858c28a6be02c4f3982d320ec3bb3c77534f57bb2fe8da1c7
local 7f397b7401f21a985c40376908dd8d8ebcf9a8d7c79093f23b2e718485f0032b
local a326fce6d638fc2d8971f8b00880eea8c376c9e7bdd45ef323a8ea764939afee
local adb8cc97e3ac4d782d3098fdf828f6ca2d108153c4c8d437f02e939e101dbb99
local d93c61ffe74cfea942f6edaa42747506ffbec29feda846f9a93a22a1db79652e
local e14da5a9196841c146833cb8e71c8e0138257dd6d0601f267e91e91abdd3a8aa
local nginx-vol
[root@node02 volumes]# docker volume rm nginx-vol
Error response from daemon: unable to remove volume: remove nginx-vol: volume is in use - [6fef45218a46e6bf1304113c6899a9baea9ebdbbc629059488e76ea111d252f1]
[root@node02 volumes]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6fef45218a46 nginx "nginx -g 'daemon of…" 6 minutes ago Up 6 minutes 0.0.0.0:8800->80/tcp nginx-vol-test2
[root@node02 volumes]# docker container stop nginx-vol-test2
nginx-vol-test2
[root@node02 volumes]# docker volume rm nginx-vol
Error response from daemon: unable to remove volume: remove nginx-vol: volume is in use - [6fef45218a46e6bf1304113c6899a9baea9ebdbbc629059488e76ea111d252f1]
[root@node02 volumes]# docker container rm nginx-test
Error: No such container: nginx-test
[root@node02 volumes]# docker container rm nginx-vol-test2
nginx-vol-test2
[root@node02 volumes]# docker volume rm nginx-vol
nginx-vol 删除数据倦怠额时候,这里我们一定要保证没有容器使用,所以这里我么得先停了使用这个数据卷的容器,然后删除这个容器(这一步没有想明白),最后才可以删除数据卷
Bind Mounts:
这个就是绑定宿主机中本身就存在的一个目录,然后挂载到容器中(不需要想之前volume一样去创建数据卷什么的,bind mounts方式是宿主机本身就存在的目录)
用卷创建一个容器:
# 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 container stop nginx-test
# docker container rm nginx-test
注意:
1. 如果源文件/目录没有存在,不会自动创建,会抛出一个错误。
2. 如果挂载目标在容器中非空目录,则该目录现有内容将被隐藏。
官方文档: https://docs.docker.com/engine/admin/volumes/bind-mounts/#start-a-container-with-a-bind-mount
总结:
Volume 特点:
多个容器之前共享数据
当容器停止或者移除的时候,该卷还是存在的、
多个容器可以同时挂载相同的数据卷
当明确删除数据卷的时候,卷才会被删除(保证无容器使用情况下才可操作)
将容器的数据存储到远程主机或者其他的存储上
将数据从一台Docker主机迁移到另外一台的时候,先停止容器,然后备份卷的目录(/var/lib/docker/volumes/)
Bind Mountst特点:
从主机共享配置文件到容器,默认情况下,挂载主机的/etc/resolv.conf到每一个容器,提供DNS解析
在Docker主机上的开发环境和容器之间共享源代码,例如,可以将Maven target 目录挂载到容器中,每次Docker主机上构建Maven项目的时候,容器都可以访问构建的额项目包
当Docker主机的文件或者目录结构保证和容器所需要的绑定挂载一致的时候
博客总结来源于:http://edu.51cto.com/course/10659.html
Docker 管理应用程序数据的更多相关文章
- docker 管理应用程序数据和网络管理
Volume和Bind Mount Docker提供三种不同方式将数据从宿主机挂载到容器中:volumes,bind mounts和tmpfs volumes:Docker管理宿主机文件系统的一部分( ...
- Docker进阶之七:管理应用程序数据
管理应用程序数据:Volume Docker提供三种不同的方式将数据从宿主机挂载到容器中:volumes,bind mounts和tmpfs. volumes:Docker管理宿主机文件系统的一部分( ...
- Docker 基础知识 - 使用卷(volume)管理应用程序数据
卷(volumes)是 Docker 容器生产和使用持久化数据的首选机制.绑定挂载(bind mounts)依赖于主机的目录结构,卷(volumes)完全由 Docker 管理.卷与绑定挂载相比有几个 ...
- Docker 基础知识 - 使用绑定挂载(bind mounts)管理应用程序数据
绑定挂载(bind mounts)在 Docker 的早期就已经出现了.与卷相比,绑定挂载的功能有限.当您使用绑定挂载时,主机上的文件或目录将挂载到容器中.文件或目录由其在主机上的完整或相对路径引用. ...
- Docker 基础知识 - 使用 tmpfs 挂载(tmpfs mounts)管理应用程序数据
卷(volumes) 和 绑定挂载(bind mounts) 允许您在主机和容器之间共享文件,这样即使在容器停止后也可以持久存储数据. 如果在 Linux 上运行 Docker,那么还有第三种选择:t ...
- Docker管理应用数据
1. Manage data in Docker 默认情况下,所有在容器内部创建的文件被存储在一个可写的容器层.这就意味着: 当容器不存在的时候,数据不能被持久化,而且在容器外部想要读取这些数据十分 ...
- Mesos+Zookeeper+Marathon的Docker管理平台部署记录(2)- 负载均衡marathon-lb
之前介绍了Mesos+Zookeeper+Marathon的Docker管理平台部署记录(1)的操作,多余的废话不说了,下面接着说下在该集群环境下的负载均衡marathon-lb的部署过程: 默认情况 ...
- Mesos+Zookeeper+Marathon的Docker管理平台部署记录(1)
随着"互联网+"时代的业务增长.变化速度及大规模计算的需求,廉价的.高可扩展的分布式x86集群已成为标准解决方案,如Google已经在几千万台服务器上部署分布式系统.Docker及 ...
- docker集群——介绍Mesos+Zookeeper+Marathon的Docker管理平台
容器为用户打开了一扇通往新世界的大门,真正进入这个容器的世界后,却发现新的生态系统如此庞大.在生产使用中,不论个人还是企业,都会提出更复杂的需求.这时,我们需要众多跨主机的容器协同工作,需要支持各种类 ...
随机推荐
- BZOJ1209 [HNOI2004]最佳包裹 三维凸包 计算几何
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1209 题目概括 给出立体的n个点.求三维凸包面积. 题解 增量法,看了一天,还是没有完全懂. 上板 ...
- 076 Apache的HBase与cdh的sqoop集成(不建议不同版本之间的集成)
1.修改sqoop的配资文件 2.从mysql导入到hbase(import) bin/sqoop import \ --connect jdbc:mysql://linux-hadoop3.ibei ...
- 基于python的机器学习开发环境安装(最简单的初步开发环境)
一.安装Python 1.下载安装python3.6 https://www.python.org/getit/ 2.配置环境变量(2个) 略...... 二.安装Python算法库 安装顺序:Num ...
- Linux- Showdown 命令详解
语法 shutdown(选项)(参数) [选项] -c:当执行"shutdown -h 11:50"指令时,只要按+键就可以中断关机的指令: -f:重新启动时不执行fsck: -F ...
- 关于Maven打包Java Web项目以及热部署插件Jrebel的使用
Java Web/Eclipse/Maven/Tomcat 最近有个新项目是java web项目,记录一下,可能比较乱.虽然没接触过Java,但是eclipse还是用过的 初识项目 同事说,项目是ma ...
- 对扫描的pdf文件生成目录
很多pdf文件是直接扫描生成的,于是它的内容都是一张张的图片,当然就更没有目录索引了. 有的时候想找某些内容,只能一点点的移动滚动条,非常不方便. 那么有什么方法能生成目录呢? 方法一:使用福昕pdf ...
- 【Java并发核心七】计划任务ScheduleExecutorService
Java中定时任务Timer工具类提供了计划任务的实现,但是Timer工具类是以队列的方式来管理线程的,并不是以线程池的方式,这样在高并发的情况下,运行效率会有点低. ScheduleExecutor ...
- windows系统,添加网络位置向导。
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha ============ 创建一个文件夹 共享. 共享位置 ,文件夹 图标 修改. 分组 ...
- BZOJ.2437.[NOI2011]兔兔与蛋蛋游戏(二分图博弈 匈牙利)
题目链接 首先空格的移动等价于棋子在黑白格交替移动(设起点移向白格就是黑色),且不会走到到起点距离为奇数的黑格.到起点距离为偶数的白格(删掉就行了),且不会重复走一个格子. (然后策略就同上题了,只不 ...
- 用单片机控制LED灯(项目)
#include <reg52.h> #define uchar unsigned char sbit LED_RED = P2^; sbit LED_GREEN = P2^; sbit ...