docker volume

Volume概念

众所周知,Docker Image可以理解成多个只读文件叠加而成,因此Docker Image是只读的。

当我们将其运行起来,就相当于在只读的Image外包裹了一层读写层变成了容器。

当你删除容器之后,使用这个镜像重新创建一个容器,此时的镜像的只读层还和原来的一样,但是你在读写层的修改全部都会丢失。

那么问题就来了,如果想要持久化在读写层的数据,该怎么利用docker做到呢?

docker使用volume实现数据的持久化,不仅如此volume还能帮助容器和容器之间,容器和host之间共享数据。

Volume如何在mac上持久化数据

如果想要持久化数据,就必须将读写层的数据暂存在host machine,因此当你使用:

  • docker run .... -v /data
  • docker volume create --name **

以上两种指令都可以帮助你创建一个Volume,其实是在host machine上创建一个directory。

常在mac上用docker的人应该知道,和Linux不同,在mac上用docker会在mac上启动一个虚拟机运行docker,因此volume创建的directory并不在你的machine上,而是在虚拟机中。

那么如何知道我的volume创建在host machine的什么位置呢?

  • docker volume ls可以看到当前所有的volume
    image.png

你可以看到上图中有volume有一些是自己命名的有一些是一串数字:
- 自己命名的是使用docker volume create --name **创建的,比如haha 是使用docker volume create --name haha
- 数字Volume是在创建container的同时创建的

  • docker volume inspect [volume name] 即可获取这个volume在docker 虚拟机中的位置,根据上图可以看到haha在虚拟机中的地址是/var/lib/docker/volumes/haha/_data

那么如何登录到docker虚拟机中呢?

  • 执行:screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
    • 注意:当你的docker version是18.06.0-ce-mac70 (26399)采用上面的指令,如果不是这个version请使用screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty
  • 然后你会看到一个新的命令行,请按下enter,此时你就在docker虚拟机中了。
  • 此时cd /var/lib/docker/volumes/haha/_data就是haha这个volume的

使用Volume有什么优势呢

  • Volume可以在容器之间以及容器和主机之间共享和重用
  • Volume在某一挂载的位置被修改,所以使用该volume的地方都会同时更新
  • Volume的大小不会被加到容器本身上
  • Volume会一直存在,直到没有任何容器使用它,才能使用命令docker volume rm [volumes名字]删除

主机和容器之间的数据共享

  • docker run -v /home/adrian/data:/data [image]
    -v A:B A是在主机上的地址,B是在容器中的地址,这两个地址如果不存在都会创建,一旦容器运行,AB的会完全同步。

容器和容器之间的数据共享

使用--volumes-from, docker run -it -h NEWCONTAINER --volumes-from container-test debian /bin/bash 意思是,将container-test这个container中的volume挂载到当前将要运行起来的容器中。前提是container-test中的volumes必须被创建过,但是container-test可以是被stop的,原因是volume只能被手动删除,不是随着容器停止而被删除

数据容器

准备一个容器专门用来做数据容器,比如docker run -d -v /dbdata --name dbdata postgres echo Data-only container for postgres运行postgres这个容器然后给他配置一个volume,其他容器都可以--volumes-from到这个volume,数据容器可以不在运行状态甚至可以被删除,只要volume创建了即可。

docker-compose 配置Volumes

虽然有很多方式创建volume但是感觉最方便的还是用docker-compose

version: "3.2"
services:
  web:
    image: alpine
    volumes:
      - ~/test:/data

docker-compose可以很方便的实现容器和容器间,容器和主机间数据共享。

  • 容器和主机: 在services定义(web)中使用volumes将主机的test挂载到容器的/data

  • 容器和容器:可以通过在和service平级的volumes中定义volumes

    version: "3.2"
    services:
      web:
        image: alpine
        volumes:
          - mydata:/data
      web1:
        image: alpine
        volumes:
          - mydata:/data
    volumes:
      mydata:
      dbdata:
    

    执行之后rundocker volume ls可以看到创建了两个以project name开头的volume

    image.png

就是你创建的,然后volumes: - mydata:/data 就是将你创建的volume挂载到容器中,此时web和web1共享pezhang_mydata volume

  • 不同docker compose文件中container的数据共享和上面的方法一样但是需要external

      version: "3.2"
      services:
        web:
          image: alpine
          volumes:
            - mydata:/data
        web1:
          image: alpine
          volumes:
            - mydata:/data
      volumes:
        mydata:
          external: true
    

    但是前提你必须要有mydata这个volume 如果没有,可以使用docker volume create --name=mydata创建。当你加上external docker不会帮你创建volume而是去找这个volume是否存在,如果找不到就会报错。

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

推荐阅读更多精彩内容