• Docker---初识数据卷


    数据卷的介绍

    一、docker的理念

    将应用和环境打包成一个镜像

    二、为什么学习数据卷

    1. 如果数据都在容器中,那么我们删除容器的时候,数据就会丢失。需求:数据可以持久化,数据可以存储在本地!

    2. 容器之间可以有一个数据共享的技术,docker容器中产生的数据,同步到本地。这就是卷技术,说白了就是目录的挂载,将我们容器内的目录,挂载到linux上面。

    3. 总结:容器的持久化和同步操作。容器之间也是可以数据共享的。

    数据卷的使用

    方式一:直接使用命令来挂载:-v

    [root@localhost ~]# docker run -it -v 主机目录:容器内目录          # 同步的过程,双向绑定。修改任何一个地方,另一个都会受到影响。
    [root@localhost ~]# docker run -it -v /home/test:/home centos /bin/bash
    
    [root@localhost ~]# docker inspect 690a419bf263                    # 查看容器的详细信息。这里只看打印出来的Mounts参数信息即可。
    
    [root@localhost ~]# docker stop 690a419bf263                       # 停止容器
    [root@localhost ~]# docker start 690a419bf263                      # 启动容器
    [root@localhost ~]# docker attach 690a419bf263                     # 进入容器

    停止容器之后,在宿主机上修改文件,然后启动容器,发现容器内的数据依旧是同步的。以后修改只需要在本地修改即可,容器内会自动同步。

    方式二:数据卷之Dockerfile

    Dockerfile就是用来构建docker镜像的构建文件,由一条条命令组成的脚本,通过这个脚本可以生成镜像。镜像是一层一层的,脚本一个个的命令,每个命令都是一层。

    1. 创建一个dockerfile文件,文件名字可以随意,建议使用Dockerfile作为文件名。我这里使用的是MyDockerfile,文件内容如下:

    FROM centos                      # 指令(大写)
    
    VOLUME ["volume01","volume02"]   # 这里的volume01与volume02指的是容器内路径,宿主机路径没有指定。
    
    CMD echo '------end------'
    CMD /bin/bash

    2. 运行这个dockerfile文件,生成镜像

    [root@localhost ~]# docker build -f dockerfile文件名 -t imagename Dockerfilepath
    [root@localhost ~]# docker build -f /home/MyDockerfile -t my_images .
    [root@localhost ~]# docker build -f /home/MyDockerfile -t my_images /home

    3. 查看镜像是否生成,如果镜像生成则运行镜像,生成容器。并查看数据卷挂载情况。

    [root@localhost ~]# docker images                           # 查看所有镜像,查看上面的命令是否生成了镜像
    
    [root@localhost ~]# docker run -it my_images /bin/bash      # 启动镜像,生成容器。通过镜像id也可以启动,这里使用的是镜像名称
    
    [root@localhost ~]# docker inspect 容器id
    [root@localhost ~]# docker inspect 3a0f07d50891             # 查看容器信息,信息中包含了数据卷挂载的路径。查看结果显示的是匿名挂载。

    具名挂载和匿名挂载

    一、示例如下

    [root@localhost ~]# docker run -d -P --name nginx01 -v /etc/nginx nginx                # 匿名挂载
    [root@localhost ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx   # 具名挂载
    
    [root@localhost ~]# docker volume --help  
    [root@localhost ~]# docker volume ls                       # 查看所有的卷的情况
    [root@localhost ~]# docker volume inspect juming-nginx     # 查看某一个卷的情况

    我们通过具名挂载可以方便的找到我们的一个卷,大多数情况在使用的就是具名挂载。

    二、如何确定是具名挂载还是匿名挂载,还是指定路径挂载

    • -v 容器内路径                          # 匿名挂载
    • -v 卷名:容器内路径                  # 具名挂载
    • -v /宿主机路径:容器内路径      # 指定路径挂载

    三、拓展

    docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx     # ro:readonly,只读
    docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx     # rw:readwrite,可读可写,默认的

    一旦设置了容器权限,容器对我们挂载出来的内容就有限定了。设置了ro,就说明这个路径只能通过宿主机来操作,容器内部是无法操作的。

    实战:Mysql同步数据(宿主机与容器之间)

    一、下载mysql镜像

    [root@localhost ~]#  docker search mysql
    [root@localhost ~]#  docker pull mysql:5.7

    二、运行mysql镜像,生成mysql容器,指定路径挂载

    [root@localhost ~]#  docker run -d -p 3120:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

    数据卷容器

    一、解决了什么问题?

    两个或者多个容器之间实现数据共享。

    二、示例1:使用上面自己构建的镜像(容器与容器之间)

    [root@localhost ~]# docker run -it --name docker01 my_images                              # docker01就是数据卷容器,有两个数据卷:volume01和volume02
    [root@localhost ~]# docker run -it --name docker02 --volumes-from docker01 my_images      # 继承docker01,也有volume01和volume02
    [root@localhost ~]# docker run -it --name docker03 --volumes-from docker01 my_images      # 同理
    
    [root@localhost ~]# docker attach 容器id
    [root@localhost ~]# docker attach 1e476e287b2b       # 进入docker01容器
    

    进入docker01容器,在docker01的数据卷目录下修改数据,则docker02的数据卷目录内容也会发生改变。反过来也一样,在docker02的数据卷目录下修改数据,则docker01的数据卷目录内容也会发生改变。即数据同步是双向的。

    只要通过 --volumes-from,我们就可以实现容器间的数据共享了。

    三、示例2:多个 Mysql 实现数据共享(容器与容器之间)

    [root@localhost ~]# docker run -d -p 3120:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
    [root@localhost ~]# docker run -d -p 3120:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7

    容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。

  • 相关阅读:
    代理模式的理解和示例
    模板方法模式的理解和使用
    ubuntu16.04安装matlab_R2018a/R2017a
    c++ 智能指针用法详解
    ORBSLAM2单目初始化过程
    ROS launch 总结
    组合导航初理解
    对极几何-本质矩阵-基本矩阵
    学习OpenCV双目测距原理及常见问题解答
    Ubuntu 16.04 一系列软件安装命令,包括QQ、搜狗、Chrome、vlc、网易云音乐安装方法(转载)
  • 原文地址:https://www.cnblogs.com/liuhaidon/p/13619125.html
Copyright © 2020-2023  润新知