Docker -v 挂载主机目录到容器中(及数据卷容器)

一、简单挂载

  • 使用 Docker 的过程中,经常需要挂载主机上的目录或文件到 Docker 容器中,以实现数据的共享或持久化。而 docker run -v 命令便是用于挂载主机目录到 Docker 容器中的常用命令。

  • 在创建启动容器时,使用 -v 参数设置数据卷

    sh 复制代码
    # 挂载单个
    $ docker run ... -v [主机目录]:[容器目录] [镜像名称]
    
    # 挂载多个
    $ docker run -v [主机目录1]:[容器目录1] -v [主机目录2]:[容器目录2] -v [主机目录3]:[容器目录3] [镜像名称]

    注意事项:

    • 目录必须是绝对路径

    • 如果目录不存在,会自动创建

    • 可以挂载多个数据卷,写多个 -v 就行

二、简单挂载案例

  • centos 举例挂载

    sh 复制代码
    # 拉取最新 centos
    $ docker pull centos
    
    # 一般可以放在 root 目录下,这里为了测试,随便写个文件名 dzmtest 作为效果区分
    $ docker run -it --name dzm -v /dzmtest/data:/dzmtest/data_container centos /bin/bash
  • 进入容器后,查看容器目录

    sh 复制代码
    # 或者 $ ls -l
    $ ls
    # dzmtest 文件夹就被创建了,里面还有个 data_container 文件夹
    bin  dev  dzmtest  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
  • 查看宿主机目录,需要回到宿主机最外层

    sh 复制代码
    # 或者 $ ls -l
    $ ls
    # 需要通过 $ cd .. 回到宿主机文件最外层,根目录,会发现创建好了 dzmtest,里面还有个 data 文件夹
    Docker  bin  boot  dev  dzmtest  etc  home  init  lib  lib32  lib64  libx32  lost+found  media  mnt  opt  proc  root  run  sbin  snap  srv  sys  tmp  usr  var
  • 测试数据同步功能,在宿主机(/dzmtest/data)或容器(/dzmtest/data_container)内添加文件,或修改文件内容都会互相同步。

    sh 复制代码
    # 或 $ cd /dzmtest/data_container
    $ cd /dzmtest/data
    
    # 随便创建一个文件
    $ touch dzm.txt

    如果创建文件报错 touch: cannot touch 'dzm.txt': Permission denied 是没有权限,加个权限就行。

    如果报错 -bash: cd: data/: Permission denied 也是一样,加个最高权限就行了。

    sh 复制代码
    # 回到上层文件夹
    $ cd ..
    
    # 对 data 文件添加权限
    # chmod 修改权限指令
    # -R 对目前目录下的所有档案与子目录进行相同的权限变更
    # 777 是所有用户都拥有最高权限
    $ sudo chmod -R 777 ./data/

    然后再次执行创建文件命令,就能创建成功了

    sh 复制代码
    dengzemiao@DESKTOP-D06B2J2:/dzmtest/data$ ls
    # 宿主机上文件就创建好了,然后去容器内的绑定文件夹内查看下是否存在文件
    dzm.txt
    sh 复制代码
    [root@037524b9fb04 /]# cd dzmtest/data_container/
    [root@037524b9fb04 data_container]# ls
    # 容器内也存在同样的文件了,这样就实现了共享
    dzm.txt
  • 举例挂载多个目录

    sh 复制代码
    # 通过 \ + 回车进行换行输入
    $ docker run -it --name dzm \
    > -v /dzmtest/data1:/dzmtest/data1 \
    > -v /dzmtest/data2:/dzmtest/data2 \
    > centos /bin/bash

三、数据卷容器

  • 如果是多容器数据共通,那么按上面的办法就是每个容器都关联宿主机的一个文件夹,这样就能多容器数据共通

    还有种方式就是 数据卷容器,就是创建一个容器专门挂载宿主机文件夹,然后其他容器关联到这个容器即可。

    1、创建启动 c3 数据卷容器,使用 -v 设置数据卷

    sh 复制代码
    # -v /volume 这种写法会在容器内创建一个 /volume 目录,然后 docker 会在宿主机上自动分配一个目录作为绑定目录
    $ docker run -it --name=c3 -v /volume centos:7 /bin/bash
    
    # 执行命令后,如何查看容器自动分配的宿主机绑定目录呢
    $ docker inspect c3
    [
        {
            ......
            "HostConfig": {
                // 如果指定数据卷目录,这里会列出绑定信息
                "Binds": null,
                ......
            },
            ......
            // 挂着信息
            "Mounts": [
                {
                    "Type": "volume",
                    "Name": "8d89f84aa486fcf706e180e6aa17649929147bdbc32e8aa3391b4dffdce27d09",
                    // 宿主机中的目录
                    "Source": "/var/lib/docker/volumes/8d89f84aa486fcf706e180e6aa17649929147bdbc32e8aa3391b4dffdce27d09/_data",
                    // 容器中的目录
                    "Destination": "/dzmtest1",
                    "Driver": "local",
                    "Mode": "",
                    "RW": true,
                    "Propagation": ""
                }
            ],
            .....
        }
    ]
    dengzemiao@DESKTOP-D06B2

    2、创建启动 c1 c2 容器,使用 --volumes-from 设置数据卷容器

    sh 复制代码
    $ docker run -it --name=c1 --volumes-from c3 centos:7 /bin/bash
    $ docker run -it --name=c2 --volumes-from c3 centos:7 /bin/bash

    3、然后就在 c1 c2 容器中正常增删改文件,实现互通了,同时也可以单独访问 c3 数据卷容器做处理。

相关推荐
王燕龙(大卫)23 分钟前
linux下共享内存的3种使用方式
linux·运维·服务器
沈艺强32 分钟前
伊犁-linux root 密码忘记咋办
linux·运维·服务器
是芽芽哩!1 小时前
【Kubernetes】常见面试题汇总(三十)
云原生·容器·kubernetes
Data 3171 小时前
hql杂谈二
大数据·运维·数据库
好哈优学编程2 小时前
操作系统知识1
运维·系统安全
很透彻2 小时前
vscode连Linux虚拟机(超简单)
linux·运维·服务器
是芽芽哩!7 小时前
【Kubernetes】常见面试题汇总(二十三)
云原生·容器·kubernetes
King without kingdom8 小时前
面试题(三)
运维·服务器·网络
Sam90298 小时前
828华为云征文|Flexus云服务器X实例部署宝塔运维面板
运维·服务器·华为云
元素之窗9 小时前
如何在 CentOS 中管理用户、组和服务状态
linux·运维·centos