18.1 Data Volume

Docker持久化数据方案

基于本地文件系统的Volume

可以在执行docker create或者docker run的时候,通过-v参数将主机的目录作为容器的数据卷。这部分功能便是基于本地文件系统的Volume管理。

基于plugin的Volume

支持第三方的存储方案,比如NAS、AWS等。

Data Volume 类型

受管理的data volume,由docker后台自动创建

绑定挂载的volume,具体挂载位置可以由用户指定

通过例子来查看

以MySQL为例,可以查看官方的Dockerfile,当中用到了Volume。

# 查看volume

[root@docker ~]# docker volume ls

[root@docker ~]#

# 创建一个MySQL的容器

[root@docker ~]# docker run -d --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql

# 查看MySQL容器跑起来之后的volume

[root@docker ~]# docker volume ls

DRIVER VOLUME NAME

local e3c54bb7b620d86524b6cebc4c28568a2a81a104871a5baf41e22c02bd8d7bac

[root@docker ~]#

# 查看这个volume的想象信息

[root@docker ~]# docker volume inspect e3c54bb7b620d86524b6cebc4c28568a2a81a104871a5baf41e22c02bd8d7bac

[

{

"CreatedAt": "2018-06-07T09:13:24Z",

"Driver": "local",

"Labels": null,

"Mountpoint": "/var/lib/docker/volumes/e3c54bb7b620d86524b6cebc4c28568a2a81a104871a5baf41e22c02bd8d7bac/_data",

"Name": "e3c54bb7b620d86524b6cebc4c28568a2a81a104871a5baf41e22c02bd8d7bac",

"Options": null,

"Scope": "local"

}

]

[root@docker ~]#

可以看到,这个volume并不在容器当中,而是挂载到了宿主机的/var/lib/docker/volumes/e3c54bb7b620d86524b6cebc4c28568a2a81a104871a5baf41e22c02bd8d7bac/_data目录下。

再创建一个mysql2的容器:

[root@docker ~]# docker run -d --name mysql2 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql

[root@docker ~]# docker volume ls

DRIVER VOLUME NAME

local a3c730f24ca254cabbd328b4c5a6e7fa1822d7e1b2e54c9ac9104839295e5225

local e3c54bb7b620d86524b6cebc4c28568a2a81a104871a5baf41e22c02bd8d7bac

[root@docker ~]# docker volume inspect a3c730f24ca254cabbd328b4c5a6e7fa1822d7e1b2e54c9ac9104839295e5225

[

{

"CreatedAt": "2018-06-07T09:22:18Z",

"Driver": "local",

"Labels": null,

"Mountpoint": "/var/lib/docker/volumes/a3c730f24ca254cabbd328b4c5a6e7fa1822d7e1b2e54c9ac9104839295e5225/_data",

"Name": "a3c730f24ca254cabbd328b4c5a6e7fa1822d7e1b2e54c9ac9104839295e5225",

"Options": null,

"Scope": "local"

}

]

[root@docker ~]#

删除这两个容器:

[root@docker ~]# docker stop mysql1 mysql2

[root@docker ~]# docker rm mysql1 mysql2

[root@docker ~]# docker volume ls

DRIVER VOLUME NAME

local a3c730f24ca254cabbd328b4c5a6e7fa1822d7e1b2e54c9ac9104839295e5225

local e3c54bb7b620d86524b6cebc4c28568a2a81a104871a5baf41e22c02bd8d7bac

[root@docker ~]#

可以发现,volume在容器删除之后也不会被删除,可以防止容器删除之后数据也不存在了的问题。但是volume的名字非常不友好,不方便我们使用,但是我们可以在创建或者启动容器的时候给volume设置别名来方便我们使用。

给volume起别名

重新创建mysql1容器,在启动的时候给volume设置别名

[root@docker ~]# sudo docker run -d -v mysql:/var/lib/mysql --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql

[root@docker ~]# docker volume ls

DRIVER VOLUME NAME

local mysql

[root@docker ~]# docker volume inspect mysql

[

{

"CreatedAt": "2018-06-07T09:30:33Z",

"Driver": "local",

"Labels": null,

"Mountpoint": "/var/lib/docker/volumes/mysql/_data",

"Name": "mysql",

"Options": null,

"Scope": "local"

}

]

[root@docker ~]#

验证一下这个mysql的volume是否已经被使用:进入mysql1容器,创建一个数据库

[root@docker ~]# docker exec -it mysql1 /bin/bash

root@5aa496b309cc:/# mysql -uroot

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 8

Server version: 8.0.11 MySQL Community Server - GPL

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;

+--------------------+

| Database |

+--------------------+

| information_schema |

| mysql |

| performance_schema |

| sys |

+--------------------+

4 rows in set (0.01 sec)

mysql> create database docker;

Query OK, 1 row affected (0.07 sec)

mysql> show databases;

+--------------------+

| Database |

+--------------------+

| docker |

| information_schema |

| mysql |

| performance_schema |

| sys |

+--------------------+

5 rows in set (0.00 sec)

mysql> \q

Bye

root@5aa496b309cc:/# exit

[root@docker ~]# 停止mysql1容器,并删除mysql1容器

[root@docker ~]# docker stop mysql1

[root@docker ~]# docker rm mysql1

[root@docker ~]# 创建一个新的mysql2的容器,急需使用mysql这个volume

[root@docker ~]# sudo docker run -d -v mysql:/var/lib/mysql --name mysql2 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql

[root@docker ~]# 进入mysql2查看是否存在之前的数据

[root@docker ~]# docker exec -it mysql2 /bin/bash

root@cf1cc3ad331e:/# mysql -uroot

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 8

Server version: 8.0.11 MySQL Community Server - GPL

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;

+--------------------+

| Database |

+--------------------+

| docker |

| information_schema |

| mysql |

| performance_schema |

| sys |

+--------------------+

5 rows in set (0.00 sec)

mysql> \q

Bye

root@cf1cc3ad331e:/# exit

可以发现,volume中的数据并不会因为容器的删除二消失,实现了数据持久化的目标。但是这种方式的volume需要在Dockerfile中使用VOLUME来预先指定容器中的数据存放路径。

18.2 Bind Mounting

Bind Mounting跟上面的方式不一样,可以动态的指定容器内文件存放路径和宿主机上的数据库卷目录。

构建一个docker-nginx的镜像:

# Dockerfile

[root@docker docker-nginx]# cat Dockerfile

# this same shows how we can extend/change an existing official image from Docker Hub

FROM nginx:latest

# highly recommend you always pin versions for anything beyond dev/learn

WORKDIR /usr/share/nginx/html

# change working directory to root of nginx webhost

# using WORKDIR is prefered to using 'RUN cd /some/path'

COPY index.html index.html

# I don't have to specify EXPOSE or CMD because they're in my FROM

[root@docker docker-nginx]# cat index.html

hello

Hello Docker!

[root@docker docker-nginx]# 构建镜像

[root@docker docker-nginx]# docker build -t staryjie/docker-nginx .

[root@docker docker-nginx]# 创建容器

[root@docker docker-nginx]# docker run -d -p 80:80 --name web staryjie/docker-nginx

[root@docker docker-nginx]# 本地访问

[root@docker docker-nginx]# curl 127.0.0.1

hello

Hello Docker!

[root@docker docker-nginx]#

但是index.html文件是无法更改的,如果要更改必须要重新构建镜像,这样非常不便。

[root@docker docker-nginx]# 强制删除web容器

[root@docker docker-nginx]# docker rm -f web

[root@docker docker-nginx]# 重新创建一个容器,指定宿主机上index.html的目录到容器中nginx的html目录

[root@docker docker-nginx]# docker exec -it web1 /bin/bash

root@18af473954f1:/usr/share/nginx/html# ls

Dockerfile index.html

root@18af473954f1:/usr/share/nginx/html# touch test.txt

root@18af473954f1:/usr/share/nginx/html# exit

[root@docker docker-nginx]# ls

Dockerfile index.html test.txt

[root@docker docker-nginx]# curl 127.0.0.1

hello

Hello Docker!

[root@docker docker-nginx]# 修改index.html

[root@docker docker-nginx]# cat index.html

hello

Hello Docker!

Hello, I have changed this file!

[root@docker docker-nginx]# curl 127.0.0.1

hello

Hello Docker!

Hello, I have changed this file!

[root@docker docker-nginx]#

采用Bind Mounting的方式实现volume的话,容器内外的数据是同步的,只需要修改一个地方,容器内或者容器外都会同步修改,非常的方便快捷。

采用Bind Mounting的方式,将docker作为开发环境可以使我们的开发环境和生产环境保持一致,这也是实现DevOps的第一步。(很多开发使用的都是Windows的系统,但是服务器一般都是Linux的,无法保持环境的一致性,影响开发效率。)

docker 保存 环境持久化_18、docker的持久化存储和数据共享相关推荐

  1. docker 保存 环境持久化_为什么 Docker 适合微服务架构?

    ContainerDevOps时代 微服务架构日益成熟,不但得到了初创公司和创新型公司的认可,一些传统企业也在逐步接受微服务架构.我们仍然在学习如何利用其在扩展性,易于维护和构建等方面的优势.当然我们 ...

  2. docker 保存 环境持久化_Docker深入浅出系列 | 容器数据持久化

    Docker深入浅出系列 | 容器数据持久化 Docker已经上市很多年,不是什么新鲜事物了,很多企业或者开发同学以前也不多不少有所接触,但是有实操经验的人不多,本系列教程主要偏重实战,尽量讲干货,会 ...

  3. 从零开始学习docker(九)持久化存储和数据共享之 Data Volume

    撸了今年阿里.头条和美团的面试,我有一个重要发现.......>>> 有些时候容器会产生一些数据,而我们不希望这些数据随着容器的删除而删除.想保证数据的安全,一般用在数据库. 首先看 ...

  4. 【Docker】(四)使用volume持久化Docker容器中的Redis数据

    1.前言 本系列文章记录了从0开始学习Docker的过程,Docker系列历史文章: (一)基本概念与安装使用 (二)如何使用Docker发布一个SpringBoot服务 (三)使用registry远 ...

  5. 【Linux】22.当前运行的docker修改环境后,想在本地保存为镜像的方法

    当前运行的docker修改环境后,想在本地保存为镜像的方法 docker images 查看所有镜像 docker ps # 查看当前运行的镜像 docker commit -m="123& ...

  6. 【Docker系列 Swarm】 swarm volume 数据持久化

    Docker Swarm volume 数据持久化 volume 是将宿主级的目录映射到容器中,以实现数据持久化. 可以用两种方式来实现: volume 默认模式:工作节点宿主机数据同步到容器内. v ...

  7. docker anaconda_深度学习炼丹炉配置[1] Docker+sshfs环境配置

    感谢 @田文善 同学供稿 目录 一.需求二.方案(一)docker 配置1.dockerfile 制作2.构建 docker 镜像3.运行 docker 容器4.使用 docker 容器5.环境复用( ...

  8. Docker全环境操作手册(更新中)

    Docker全环境操作手册 编者寄语 本文面向人群 序言 目录 (标准篇:1-5 / 中级篇:6-7 / 高级篇:8-12) 正文 1.如何理解docker 2.如何安装docker 2.1文件下载 ...

  9. IFTTT在开发环境中使用Docker的经验

    本文讲的是IFTTT在开发环境中使用Docker的经验,[编者的话]IFTTT是"if this then that"的缩写,事实上是让你的网络行为能够引发连锁反应.让你使用更为方 ...

最新文章

  1. Glide的缓存机制
  2. LAMP之二:LAMP的性能测试以及安装xcache,为php加速
  3. 在目录下所有文件中查找字符串
  4. mongo 3t 处理时间
  5. html禁止手机页面放大缩小
  6. 平滑均值滤波讲解-Matlab
  7. android 摄像头参数,获取Android设备上的详细的摄像头信息
  8. python函数参数类型及顺序_python函数参数类型及其顺序
  9. 电脑技巧:如何更改Win10桌面文件路径,轻松给系统盘瘦身!
  10. 工业级光纤收发器和协议转换器有什么区别呢?
  11. 字符串10进制、16进制、ASSIC的互转
  12. import threading线程进程
  13. 热备份路由协议(HSRP)
  14. Android笔记 actionbar学习
  15. 观察者-学历差距造成的差距有多大
  16. pip 安装GDAL
  17. 三层中如何在服务器与客户端之间传输自定义的'Record'类型数据的例子
  18. 今天学得有点多——end用法
  19. 查找国外硕士博士论文
  20. 如何制作刷爆朋友圈的H5

热门文章

  1. 使用Poco实现插件方式加载动态库
  2. Day_04-数组,元组,列表
  3. sql根据某个字段拼接另外字段
  4. vtigercrm安装
  5. [bzoj 4869] [六省联考2017] 相逢是问候
  6. 第四章,简答题4-5,2017-4-6
  7. 使用 CSS3 Flexible Boxes 布局
  8. Linux服务器程序编程的几个坎
  9. c++/c SM4加密解密算法代码实现
  10. 计算机组成原理知识点概叙--计算机系统简介