应用服务是在容器中运行的,容器随时会被删除,如果是个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 任务的同步与通信 --- 消息队列

    简介 使用消息队列可以在任务之间传递多条消息.消息队列由三个部分组成:事件控制块.消息队列和消息. 当把事件控制块成员 OSEventType 的值置为 OS_EVENT_TYPE_Q 时,该事件控制 ...

  2. RNN入门(一)识别MNIST数据集

    RNN介绍   在读本文之前,读者应该对全连接神经网络(Fully Connected Neural Network, FCNN)和卷积神经网络( Convolutional Neural Netwo ...

  3. spring_07使用spring的特殊bean、完成分散配置

    一.   前言   分散配置思路:创建properties文件,添加数据,在beans文件中先配置properties文件,再在bean中使用占位符引用数据 对于bean的生命周期中的很多处理接口,处 ...

  4. python面向对象学习(三)私有属性和私有方法

    目录 1. 应用场景和定义方式 2. 伪私有属性和私有方法 在java或者其他的编程语言中,使用访问修饰符来限制属性和方法的访问级别,一般有public.protected.default.priva ...

  5. 史上最全python面试题详解 (二)(附带详细答案(关注、持续更新))

    23.re的match和search区别? re.match()从开头开始匹配string. re.search()从anywhere 来匹配string. # 多行模式>>> re ...

  6. angularJs学习笔记-路由

    1.angular路由介绍 angular路由功能是一个纯前端的解决方案,与我们熟悉的后台路由不太一样. 后台路由,通过不同的 url 会路由到不同的控制器 (controller) 上,再渲染(re ...

  7. bootstrap网站后台从设计到开发

    前言 毕业后在一家小公司找的工作是做前端,小公司必须要身兼多职,会多门技术,所以为了工作需要自学ps,做过微信运营,后来为了做erp管理系统,又开始学习c# ,之后公司有新项目要用wpf ,我又开始学 ...

  8. CSS3布局之多列布局columns详解

    columns语法:columns:[ column-width ] || [ column-count ]设置或检索对象的列数和每列的宽度 其中:[ column-width ]:设置或检索对象每列 ...

  9. 洛谷P3038 [USACO11DEC]牧草种植Grass Planting

    题目描述 Farmer John has N barren pastures (2 <= N <= 100,000) connected by N-1 bidirectional road ...

  10. 从发布订阅模式到redux(一)

    最近在学习的过程中,学习了一些关于redux的一些知识,学之前用redux,虽然会用但是实现的原理就不是特别清楚,天天沉迷于搬砖 总是这木搬砖也不是个事啊,就准备开始深入了解一些原理性的东西 首先在看 ...