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

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

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

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

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

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

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

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

#列出volume
[root@ /]# docker volume ls
DRIVER VOLUME NAME
#查看docker volume 帮助
[root@ /]# docker volume --help Usage: docker volume COMMAND Manage volumes Commands:
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 volumes Run 'docker volume COMMAND --help' for more information on a command.
# 先测试通过docker volume创建卷,并关联给容器使用。这个卷里保存容器的持久化数据
#新建一个卷,卷名=nginx-vol
[root@ /]# docker volume create nginx-vol
nginx-vol
#列出volume,确认卷创建成功
[root@ /]# docker volume ls
DRIVER VOLUME NAME
local nginx-vol
#查看卷详细信息
[root@ /]# 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@ /]# cd /var/lib/docker/volumes/nginx-vol/_data
#列出当前目录下文件
[root@ _data]# ls
#列出当前存在的镜像文件
[root@ _data]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 881bd08c0b08 days ago 109MB
busybox latest d8233ab899d4 weeks ago .2MB
centos 1e1148e4cc2c months ago 202MB
centos latest 1e1148e4cc2c months ago 202MB
java d23bdf5b1b1b years ago 643MB
#列出最近的容器
[root@ _data]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5e67c2448806 nginx "nginx -g 'daemon of…" days ago Up hours 0.0.0.0:->/tcp trusting_banach
#停止指定容器
[root@ _data]# docker container stop 5e67c2448806
5e67c2448806
[root@ _data]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
#启动指定容器
[root@ _data]# docker container start 5e67c2448806
5e67c2448806
#停止指定容器
[root@ _data]# docker container stop 5e67c2448806
5e67c2448806
#启动一个容器,--mount src=nginx-vol,dst=/usr/share/nginx/html 将宿主机的nginx-vol卷,挂在到容器中的 /usr/share/nginx/html目录
# docker volume特点,volume和容器中数据实时同步了,不论在那端修改了数据,会实时同步,2边数据会保持一致。 删除volume时,如果有关联的容器存在(停止和运行状态),那么无法删除volume. 只有移除容器,volume才能被删除
[root@ _data]# docker container run -d --mount src=nginx-vol,dst=/usr/share/nginx/html -p : nginx
6886984c9b2df1dec674abb72a659e02d6a98afbb11dccdddb926571b08085b2
[root@ _data]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6886984c9b2d nginx "nginx -g 'daemon of…" seconds ago Up seconds 0.0.0.0:->/tcp eloquent_jackson
#进入nginx-vol卷
[root@ _data]# cd /var/lib/docker/volumes/nginx-vol/_data
#查看是否存在文件,发现2个文件
[root@ _data]# ls
50x.html index.html
#进入容器
[root@ _data]# docker container exec -it 6886984c9b2d bash
#进入dst目录
root@6886984c9b2d:/# cd /usr/share/nginx/html/
#列出文件,发现源和目标文件时一致的,测试在源和目标修改index.html,都会生效
root@6886984c9b2d:/usr/share/nginx/html# ls
50x.html index.html
root@6886984c9b2d:/usr/share/nginx/html# cat index.html
<h1>Welcome to volume test!</h1>
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 container
root@6886984c9b2d:/usr/share/nginx/html# exit
exit
[root@ _data]# cd /
#下面测试在容器运行中删除卷,删除卷失败。
[root@ /]# docker volume rm nginx-vol
Error response from daemon: remove nginx-vol: volume is in use - [6886984c9b2df1dec674abb72a659e02d6a98afbb11dccdddb926571b08085b2]
#下面测试在容器状态时停止时删除卷,删除卷失败。
[root@ /]# docker container stop 6886984c9b2df1dec674abb72a659e02d6a98afbb11dccdddb926571b08085b2
6886984c9b2df1dec674abb72a659e02d6a98afbb11dccdddb926571b08085b2
[root@ /]# docker volume rm nginx-vol
Error response from daemon: remove nginx-vol: volume is in use - [6886984c9b2df1dec674abb72a659e02d6a98afbb11dccdddb926571b08085b2]
[root@ /]# docker container ps -qa
6886984c9b2d
5e67c2448806
[root@ /]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
#下面测试,删除容器后,删除卷,卷删除成功
[root@ /]# docker container rm 6886984c9b2df1dec674abb72a659e02d6a98afbb11dccdddb926571b08085b2
6886984c9b2df1dec674abb72a659e02d6a98afbb11dccdddb926571b08085b2
[root@ /]# docker volume rm nginx-vol
nginx-vol
[root@ /]# docker volume ls
DRIVER VOLUME NAME
# 下面测试数据持久化的第2种方式:bind mount ,可以将宿主机的任意文件位置挂载到容器的任意位置,容器中的路径下如果存在文件,这些文件将会被隐藏
# 新建目录 wwwroot
[root@ /]# mkdir wwwroot
# 启动一个容器,--mount type=bind,src=$PWD/wwwroot,dst=/usr/share/nginx/html, 将宿主机src目录,挂在到容器/usr/share/nginx/html的目录
[root@ /]# docker container run -d -p : --mount type=bind,src=$PWD/wwwroot,dst=/usr/share/nginx/html nginx
dbc6252103716d58aa7897919e98025e51972149246b9f078304a3e26ce8d6a0
# 查看宿主机wwwroot目录下,不存在文件
[root@ /]# ls wwwroot/
[root@ /]# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var wwwroot
# 查看容器/usr/share/nginx/html的目录下,不存在文件;
[root@ /]# docker container exec -it dbc6252103716d58aa7897919e98025e51972149246b9f078304a3e26ce8d6a0 bash
root@dbc625210371:/# cd /usr/share/nginx/html/
root@dbc625210371:/usr/share/nginx/html# ls
root@dbc625210371:/usr/share/nginx/html# exit
exit
# 在宿主机wwwroot目录下,创建文件
[root@ /]# cd wwwroot/
[root@ wwwroot]# ls
[root@ wwwroot]# touch index.html
[root@ wwwroot]# vi index.html
# 进入容器,查看是否存在文件,观察到也存在文件了
[root@ wwwroot]# docker container exec -it dbc6252103716d58aa7897919e98025e51972149246b9f078304a3e26ce8d6a0 bash
root@dbc625210371:/# cd /usr/share/nginx/html/
root@dbc625210371:/usr/share/nginx/html# ls
index.html
# 在容器中创建文件
root@dbc625210371:/usr/share/nginx/html# touch a.out
root@dbc625210371:/usr/share/nginx/html# exit
exit
# 在宿主机观察到,在容器中创建的文件存在,说明在2边的操作,会互相同步。
[root@ wwwroot]# ls
a.out index.html

总结:

Volume特点:

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

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

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

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

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

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

Bind Mounts特点:

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

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

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

作者: 梅梅~

出处: https://www.cnblogs.com/keeptesting

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

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

Docker: docker container常用命令实战(2)-数据持久化的更多相关文章

  1. Docker: docker container常用命令实战

    容器管理,容器常用选项 选项 描述 -i, –interactive 交互式 -t, –tty 分配一个伪终端 -d, –detach 运行容器到后台 -e, –env 设置环境变量 -p, –pub ...

  2. Docker 入门指南——常用命令

    前面已经介绍了 Docker 的安装方式,本文总结一下使用 Docker 的基本概念和常用命令. 基本概念 镜像 Image 镜像是一些打包好的已有的环境,可以被用来启动和创建容器 容器 Contai ...

  3. Docker基础和常用命令

    Docker基础和常用命令 一,Docker 简介 1.1,什么是 Docker Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,nam ...

  4. docker 安装与常用命令与常用容器(containers)环境

    注意区别 container 与 image 的关系,container 的建立需要 image 的承载,也即 container 依赖 image,停止并删除了 container 并不会删除 im ...

  5. Docker系列之常用命令操作手册

    目录 1.安装虚拟机 2.安装Docker 3.Docker镜像操作 4.Docker容器操作 Docker系列之常用命令操作手册 继上一篇博客Docker系列之原理简单介绍之后,本博客对常用的Doc ...

  6. 在Docker中安装配置Oracle12c并实现数据持久化

    在Docker中安装配置Oracle12c并实现数据持久化 选定镜像,并pull到系统中,一定要先配置加速,不然超级慢 eric@userver:~$ docker pull sath89/oracl ...

  7. iOS中常用的四种数据持久化方法简介

    iOS中常用的四种数据持久化方法简介 iOS中的数据持久化方式,基本上有以下四种:属性列表.对象归档.SQLite3和Core Data 1.属性列表涉及到的主要类:NSUserDefaults,一般 ...

  8. Docker: docker image常用命令实战

    #docker列出镜像[root@192 ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEnginx latest 881bd08c0b08 ...

  9. Docker安装和常用命令

    Docker安装 Docker的安装可以参考 https://docs.docker.com/ 下面的 Get Docker / Docker CE / Linux, 需要关注的主要是CentOS和U ...

随机推荐

  1. μC/OS-II 任务的同步与通信 --- 信号量

    任务间通信 系统中的多个任务在运行时,经常需要互相无冲突地访问同一个共享资源,或者需要互相支持和依赖,甚至有时还要互相加以必要的限制和制约,才保证任务的顺利运行.因此,操作系统必须具有对任务的运行进行 ...

  2. Python系列:四、Python函数--技术流ken

    Python函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可 ...

  3. (1)编译安装lamp三部曲之apache-技术流ken

    简介 采用yum安装lamp简单,快捷,在工作中也得到了普遍应用.但是如果我们需要某些特定模块功能,以及制定安装位置等,就需要用到编译安装了,接下来将编译安装lamp之apache. 系统环境及服务版 ...

  4. 使用Topshelf开发Windows服务、log4net记录日志

    开发windows服务,除了在vs里新建服务项目外(之前有写过具体开发方法,可点击查看),还可以使用Topshelf. 不过使用topshelf需要.netframework 4.5.2版本,在vs2 ...

  5. 线程 线程池 Task

    首先声明 这是读了 愉悦的绅士 文章 <菜鸟之旅——学习线程(线程和线程池)> <Task与线程> 的一些个人总结,还是那句话,如有不对,欢迎指正 文章以代码加注释的方法展示. ...

  6. 27.QT-QProgressBar动态实现多彩进度条(详解)

    如下图所示: 效果如下: (gif录制的动画效果不好,所以颜色有间隙) 介绍 通过qss实现,只需要一个多彩背景图,通过QImage获取颜色,然后来设置进度条,便可以实现动态多彩进度条(根据图片设定颜 ...

  7. redis.conf 常见配置介绍

    参数说明redis.conf 配置项说明如下: 1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 daemonize no 2. 当Redis以守护进程方式运 ...

  8. JavaWeb学习日记----XML的解析

    XML的解析简介: 在学习JavaScript时,我们用的DOM来解析HEML文档,根据HTML的层级结构在内存中分配一个树形结构,把HTML的标签啊,属性啊和文本之类的都封装成对象. 比如:docu ...

  9. Java并发编程-CountDownLatch

    基于AQS的前世今生,来学习并发工具类CountDownLatch.本文将从CountDownLatch的应用场景.源码原理解析来学习这个并发工具类. 1. 应用场景 CountDownLatch是并 ...

  10. Javascript 跨域知识详细介绍

    JS跨域知识总结: 在“跨域”一词经常性地出现以前,我们其实已经频繁地使用它了.如在A网站的img,src指向B网站的某一图片地址,毫无疑问,这在通常情况下都是能正常显示的(且不论防盗链技术):同样, ...