Docker学习五、docker容器数据卷

前言、Docker中的数据管理

Docker镜像是由多个只读层叠加而成,启动容器时,Docker会加载只读层并会在镜像栈顶部添加一个读写层,如果运行中的容器修改了现有的一个文件,那么该文件就会从只读层复制一份到读写层中,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏,这就是docker的写时复制机制。关闭重启容器,其数据不受影响,但是删除容器时,其改变的读写层数据就会丢失。

图片.png

容器在运行项目时会产生数据,比如运行的mysql容器,那么一定会有数据的产生,那么问题来了,数据是保存在容器内部还是保存在外部?如果将数据保存在内部,那么也就意味着我们改变了原有镜像,这种做法是不可取的,因为在后期的镜像升级将变得不可能了。除非我们在改变镜像后commit提交打成一个新的镜像。显然,数据是应该保存在容器的外部,也就是说保存在主机上。那么问题又来了,数据保存在主机上,那么容器该如何读取主机中的数据呢?

为了能够持久化数据以及共享容器间的数据,Docker提出了Volume的概念。简单来说,Volume就是目录或者文件,它可以绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。

容器中管理数据主要有两种方式:

  • 数据卷(Data volumes):容器内数据直接映射到本地主机环境
  • 数据卷容器(Data Volume Containers):使用特定容器维护数据卷,数据卷容器挂载数据卷,其他容器通过挂载数据卷容器实现数据传递共享

一、数据卷的概念

数据卷就是由docker挂载到容器中的目录或者文件,但是不属于UnionFS。数据卷的生命周期完全独立于容器,docker不会在容器被删除时而删除其挂载的数据卷,因此可以实现持久化或共享数据。

特点:

  • 数据卷可以在不同容器之间共享或重用数据
  • 数据卷中的更改直接生效
  • 数据卷中的更改不会包含在镜像的更新之中

1-1、创建容器时添加数据卷

数据卷是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于linux中的mount操作。在create或者run容器时,可以通过-v参数指定主机的目录,挂载到容器中的某一个目录上,这样,容器就在这个目录读写数据了。从而实现了容器和数据的分离。例如:

docker run --name 容器名 -v /宿主机绝对路径:/容器内路径 镜像名

docker run -p 3306:3306 --name mymysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql

二、Docker实战案例五:Docker安装MySQL实现宿主机和容器之间的数据共享

2-1、查找镜像

docker search mysql
图片.png

2-2、拉取镜像

docker pull mysql

默认拉取tag为latest的mysql官方镜像

latest: Pulling from library/mysql
683abbb4ea60: Pull complete 
0550d17aeefa: Pull complete 
7e26605ddd77: Pull complete 
9882737bd15f: Pull complete 
999c06ab75f6: Pull complete 
c71d695f9937: Pull complete 
c38f847c1491: Pull complete 
5e0cb05a8fc3: Pull complete 
c89e3e373fca: Pull complete 
fa39a2c9922d: Pull complete 
b293d9c897c4: Pull complete 
3dc061869740: Pull complete 
Digest: sha256:43ed4f8c9d1695e97a39cdfe9475af9096e3723cfb79d820d8da00d61a277a85
Status: Downloaded newer image for mysql:latest

2-3、创建容器

新建本地映射到docker镜像的mysql文件目录,/mysql/conf、/mysql/logs、/mysql/data。

图片.png

使用如下命令将提前创建好的/mysql/conf、/mysql/logs、/mysql/data挂载到容器中MySQL对应的目录中:

docker run -p 3306:3306 --name mymysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql

2-4、查看并验证

查看MySQL容器是否正常运行:

图片.png

进入容器内部并进入MySQL:

图片.png

三、数据卷容器

如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,但是它的目的是专门用来提供数据卷供其他容器挂载。如果要授权一个容器访问另一个容器的Volume,我们可以使用--volumes-from参数来实现。可以使用数据卷容器对其中的数据卷进行备份、恢复、以实现数据的迁移。

首先创建一个数据卷容器dbdata,并在其中创建一个数据卷挂载到/dbdata。

//创建一个数据卷容器
[root@xxx ~]# docker run -it -v /dbdata --name dbdata ubuntu

//查看目录
root@d4bb57243d45:/# ls
bin  boot  dbdata  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

然后,可以在其他容器中使用--volumes-from来挂载dbdata容器中的数据卷,例如创建db1和db2两个容器,并从dbdata容器挂载数据卷:

// 创建2个容器挂载dbdata容器中的数据卷
[root@xxx ~]# docker run -it --volumes-from dbdata --name db1 ubuntu
[root@xxx ~]# docker run -it --volumes-from dbdata --name db2 ubuntu

此时,容器db1和容器db2都挂载同一个数据卷到相同的dbdata目录。三个容器任何一方在该目录下的写入,其他容器都可以看到。例如,在dbdata容器中创建一个test文件,在db1容器中可能查看到它:

//在dbdata容器的数据卷中创建文件a
root@9e90f695bcb8:/dbdata# touch a
root@9e90f695bcb8:/dbdata# ll
total 4
drwxr-xr-x.  2 root root   14 Apr 14 10:02 ./
drwxr-xr-x. 22 root root 4096 Apr 14 10:01 ../
-rw-r--r--.  1 root root    0 Apr 14 10:02 a

//在db1容器中查看数据卷目录dbdata,也发现了文件a
root@ab4426a23cb4:/dbdata# ll
total 4
drwxr-xr-x.  2 root root    6 Apr 14 10:01 ./
drwxr-xr-x. 22 root root 4096 Apr 14 10:02 ../
root@ab4426a23cb4:/dbdata# ls     
a

//db2结果和db1一样
root@b4bea0f56613:/# cd dbdata/
root@b4bea0f56613:/dbdata# ll
total 4
drwxr-xr-x.  2 root root   14 Apr 14 10:02 ./
drwxr-xr-x. 22 root root 4096 Apr 14 10:03 ../
-rw-r--r--.  1 root root    0 Apr 14 10:02 a

可以多次使用--volumes-from参数来从多个容器挂载多个数据卷。还可以从其他已经挂载了容器卷的容器来挂载数据卷。

使用--volumes-from参数所挂载数据卷的容器自身并不需要保持在运行状态。如果删除了挂载容器(包括dbdata、db1和bd2),数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显示使用docker rm -v命令来指定同时删除关联的数据卷。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容