应用服务是在容器中运行的,容器随时会被删除,如果是个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. MySQL系列详解三:MySQL中各类日志详解-技术流ken

    前言 日志文件记录了MySQL数据库的各种类型的活动,MySQL数据库中常见的日志文件有 查询日志,慢查询日志,错误日志,二进制日志,中继日志 .下面分别对他们进行介绍. 查询日志 1.查看查询日志变 ...

  2. C#线程安全类型

    1.IProducerConsumerCollection (线程安全接口) 此接口的所有实现必须都启用此接口的所有成员,若要从多个线程同时使用. using System; using System ...

  3. 禅道导入bugfree 3.0的数据

    禅道项目导入bugfree功能只支持到2.0, 官方不提供3.0的导入,只好自己写了一个.因为bugfree 3.0换人开发了,表结构和禅道差别很大,所以,这个工具不是完全转换,一些History表内 ...

  4. ECharts中color : function的用法(转)

    ECharts图表实战经验1:如何设置图表同序列不同数据点的独立颜色值   最近有不少朋友在追问这样一个问题:我单序列的柱状图,我想让每一个根柱子的颜色都不一样,应该如何做? 针对这个问题,其实我只想 ...

  5. AnnotationConfigBeanDefinitionParser are only available on JDK 1.5 and higher

    報錯: org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML ...

  6. Spring Boot(Spring的自动整合框架)

    Spring Boot 是一套基于Spring框架的微服务框架,由于Spring是一个轻量级的企业开发框架,主要功能就是用于整合和管理其他框架,想法是将平时主流使用到的框架的整合配置预先写好,然后通过 ...

  7. 小tips:JS中typeof与instanceof用法

    介绍 typeof typeof用以获取一个变量或者表达式的类型,typeof一般只能返回如下几个结果: number boolean string function(函数) object(NULL, ...

  8. 2018-05-14 代码考古-Python3官方教程字典例程

    知乎原链 Data Structures中的第一个例程: >>> tel = {'jack': 4098, 'sape': 4139} >>> tel['guido ...

  9. ThreadLocal 类 的源码解析以及使用原理

    1.原理图说明 首先看这一张图,我们可以看出,每一个Thread类中都存在一个属性 ThreadLocalMap 成员,该成员是一个map数据结构,map中是一个Entry的数组,存在entry实体, ...

  10. Android 实现锚点定位

    相信做前端的都做过页面锚点定位的功能,通过<a href="#head"> 去设置页面内锚点定位跳转. 本篇文章就使用tablayout.scrollview来实现an ...