应用服务是在容器中运行的,容器随时会被删除,如果是个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. 全面认识golang string

    string我们每天都在使用,可是对于string的细节问题你真的了解吗? 今天我们先以一个问题开篇. 你能猜到下面代码的输出吗? package main import ( "fmt&qu ...

  2. Ioc原理理解

    IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 如果我们打开机械式手表的后盖,就会看到与上面类似 ...

  3. C#线程安全类型

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

  4. C# ThreadPool类(线程池)

    CLR线程池并不会在CLR初始化时立即建立线程,而是在应用程序要创建线程来运行任务时,线程池才初始化一个线程.线程池初始化时是没有线程的,线程池里的线程的初始化与其他线程一样,但是在完成任务以后,该线 ...

  5. 微信开发中网页授权access_token与基础支持的access_token异同 【转载、收藏】

    问题1:网页授权access_token与分享的jssdk中的access_token一样吗? 答:不一样.网页授权access_token 是一次性的,而基础支持的access_token的是有时间 ...

  6. python学习笔记(三)、字典

    字典是一种映射类型的数据类型.辣么什么是映射呢?如果看过<数据结构与算法>这一本书的小伙伴应该有印象(我也只是大学学习过,嘻嘻). 映射:就是将两个集合一 一对应起来,通过集合a的值,集合 ...

  7. HTML 请求头,响应头和 HTTP状态码

    请求头 选项 说明 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8 告诉服务器,当前客户端可以接收的文档类型 ...

  8. TCP 三次握手与四次断开

    三次握手建立连接 TCP连接是通过三次握手来连接的. 第一次握手 当客户端向服务器发起连接请求时,客户端会发送同步序列标号SYN到服务器,在这里我们设SYN为x,等待服务器确认,这时客户端的状态为SY ...

  9. 洛谷P3388 【模板】割点(割顶)(tarjan求割点)

    题目背景 割点 题目描述 给出一个n个点,m条边的无向图,求图的割点. 输入输出格式 输入格式: 第一行输入n,m 下面m行每行输入x,y表示x到y有一条边 输出格式: 第一行输出割点个数 第二行按照 ...

  10. 洛谷P4492 [HAOI2018]苹果树(组合数)

    题意 题目链接 Sol 有点自闭,.我好像对组合数一窍不通(~~~~) Orz shadowice // luogu-judger-enable-o2 #include<bits/stdc++. ...