zoukankan      html  css  js  c++  java
  • 多个docker 挂载VOLUME的心得

    假如有一个mysql镜像

    在Dockerfile中制定VOLUME /var/lib/mysql

    那么当执行:

    docker run -d -e MYSQL_ROOT_PASSWORD=root --name=hzbtest 172.16.71.199/common/mysql:5.6

    1)上面没有指定 -v,新建的容器会自动在主机上建立一目录来挂载/var/lib/mysql

    docker inspect hzbtest"Mounts": [  
            {  
                "Name": "6407cbb6700a4076cdeeef60629f1748ff34310102480a3f702fd3fee9e69134",  
                "Source": "/var/lib/docker/volumes/6407cbb6700a4076cdeeef60629f1748ff34310102480a3f702fd3fee9e69134/_data",  
                "Destination": "/var/lib/mysql",  
                "Driver": "local",  
                "Mode": "",  
                "RW": true  
            }  
        ]

    2)当执行-v,只指定容器内部的目录

    docker run -d -e MYSQL_ROOT_PASSWORD=root --name=hzbtest2 -v /var/lib/mysql 172.16.71.199/common/mysql:5.6

    这种方式的效果和1)的效果一样。

    3)当执行:

    docker run -d -e MYSQL_ROOT_PASSWORD=root --name=hzbtest3 -v /root/data:/var/lib/mysql 172.16.71.199/common/mysql:5.6

    这种情况,容器启动后会把/var/lib/mysql里面的文件迁移到宿主机的/root/data目录下

    4)当执行:

    docker run -d -e MYSQL_ROOT_PASSWORD=root --name=hzbtest4 -v /root/data:/var/log 172.16.71.199/common/mysql:5.6

    由于容器的镜像的dockerfile并没有给/var/log指定volume,所以,容器内的/var/log/里面的文件并不会迁移到/root/data里面,相反/var/log/的文件会变成/root/data里面的所有文件。

    可以用多个 -v标签为容器添加多个volume,还可以使用:ro指定该volume为只读。

    docker run -d -e MYSQL_ROOT_PASSWORD=root --name=hzbtest4 -v /root/data:/var/log:ro 172.16.71.199/common/mysql:5.6

    现在假如再有一个mongoDB的镜像

    在Dockerfile中制定VOLUME /data/db,这个文件夹本身带有文件.

    当执行:

    docker run -d -e MYSQL_ROOT_PASSWORD=root --name=hzbtest5 -v /root/data:/data/db 172.16.71.199/common/mongodb:3.0.9

    这种情形hzbtest5的/data/db的文件会迁移到/root/data/文件夹下,这时候/roo/data里面就会同时有mysql挂载过来的/var/lib/mysql和mongodb挂载过来的/data/db里面的文件。

    hzbtest3的/var/lib/mysql目录和hzbtest5的/data/db目录都能看到/root/data里面的全部文件。

    5)使用Dockerfile添加volume

    FROM mysql:latest  
    RUN useradd root   
    VOLUME /data   
    RUN touch /data/aa  
    RUN chown -R root:root /data 

    这种情况和docker run -v /data是一样的。注意,dockerfile中使用volume是不能挂载宿主机中指定的文件夹。这时为了保证Dockerfile的可移植性,因为不能保证所有的宿主机都有对应的文件夹。

    6)共享volume/数据卷容器(--volumes-from)

    首先创建一个数据卷容器,在/root/data下面放一个文件test.txt

    docker run -it -v /root/data --name=dbdata mysql:latest /bin/bash

    创建一个容器testa引用这个卷

    docker run -it --name=testa --volumes-from dbdata mysql:latest /bin/bash

    创建一个容器testb引用这个卷

    docker run -it --name=testb --volumes-from dbdata mysql:latest /bin/bash

    可以看到testa和testb的/root/data目录下都会有test.txt文件

    当在testb的/root/data下新增aa.txt文件时,testb的/root/data下也将看到aa.txt文件,说明他们是共用的一个数据卷。

  • 相关阅读:
    用node.js从零开始去写一个简单的爬虫
    如何在手机上查看测试vue-cli构建的项目
    【干货】听说你想成为一名6的飞起的黑客,这些资料怎么能少
    用node.js从零开始去写一个简单的爬虫
    如何在手机上查看测试vue-cli构建的项目
    一个好用的在线微信二维码设计网站
    ES6-----学习系列十五(Iterator)
    js学习总结----js中常用的四种输出方式
    js学习总结----javascript引入到页面的方式和细节
    ES6-----学习系列十四(promise)
  • 原文地址:https://www.cnblogs.com/boshen-hzb/p/7383985.html
Copyright © 2011-2022 走看看