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 数据卷容器做处理。

相关推荐
love530love9 分钟前
Windows 11 中利用 WSL - Linux 虚拟环境部署 ChatTTS-Enhanced 项目教程
linux·运维·windows
冷曦_sole13 分钟前
linux-22 目录管理(二)rmdir命令,删除目录
linux·运维·服务器
群联云防护小杜23 分钟前
服务器被攻击怎么办
运维·服务器·网络·网络协议·安全·web安全
颜淡慕潇44 分钟前
【K8S问题系列 | 20 】K8S如何删除异常对象(Pod、Namespace、PV、PVC)
后端·云原生·容器·kubernetes
lmxnsI1 小时前
docker使用笔记
笔记·docker·容器
木卫二号Coding1 小时前
Docker-构建自己的Web-Linux系统-镜像webtop:ubuntu-kde
linux·ubuntu·docker
IT 古月方源1 小时前
ospf 的 状态机详解
运维·网络·tcp/ip·智能路由器
九河云1 小时前
Amazon Bedrock Claude 3 在客户服务自动化中的应用方法
运维·人工智能·自动化·aws
hc_bmxxf1 小时前
Linux应用软件编程-多任务处理(进程)
linux·运维·服务器
M-C-B2 小时前
配置带外与更改密码
运维·服务器