`

docker -v 挂载

 
阅读更多

转自:https://blog.csdn.net/hnmpf/article/details/80924494

 

Docker容器启动的时候,如果要挂载宿主机的一个目录,可以用-v参数指定。-v参数中,冒号":"前面的目录是宿主机目录,后面的目录是容器内目录。

譬如要启动一个centos容器,宿主机的/test目录挂载到容器的/soft目录,可通过以下方式指定:

# docker run -it -v /test:/soft centos /bin/bash

其中使用-v指定挂载有以下几点要注意:

一、容器目录不可以为相对路径

[root@localhost ~]# docker run -it -v /test:soft centos /bin/bash
invalid value "/test:soft" for flag -v: soft is not an absolute path
See 'docker run --help'.

直接报错,提示soft不是一个绝对路径,所谓的绝对路径,必须以下斜线“/”开头。

二、宿主机目录如果不存在,则会自动生成

如果宿主机中存在/test目录,首先删除它

[root@localhost ~]# rm -rf /test
[root@localhost ~]# ls /
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

启动容器

[root@localhost ~]# docker run -it -v /test:/soft centos /bin/bash
[root@a487a3ca7997 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  soft  srv  sys  tmp  usr  var

查看宿主机,发现新增了一个/test目录

[root@localhost ~]# ls /
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  test  tmp  usr  var

三、宿主机的目录如果为相对路径呢?

这次,我们换个目录名test1试试

# docker run -it -v test1:/soft centos /bin/bash

再到宿主机上查看是否新增了一个/test1目录,结果没有,是不是因为我用的是相对路径,所以生成的test1目录在当前目录下,结果发现还是没有。那容器内的/soft目录挂载到哪里去了?通过docker inspect命令,查看容器“Mounts”那一部分,我们可以得到这个问题的答案。

 "Mounts": [
        {
            "Name": "test1",
            "Source": "/var/lib/docker/volumes/test1/_data",
            "Destination": "/soft",
            "Driver": "local",
            "Mode": "z",
            "RW": true
        }
    ],

可以看出,容器内的/soft目录挂载的是宿主机上的/var/lib/docker/volumes/test1/_data目录

原来,所谓的相对路径指的是/var/lib/docker/volumes/,与宿主机的当前目录无关。

四、如果只是-v指定一个目录,这个又是如何对应呢?

启动一个容器

[root@localhost ~]# docker run -it -v /test2 centos /bin/bash
[root@ea24067bc902 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  test2  tmp  usr  var

同样使用docker inspect命令查看宿主机的挂载目录

 "Mounts": [
        {
            "Name": "96256232eb74edb139d652746f0fe426e57fbacdf73376963e3acdb411b3d73a",
            "Source": "/var/lib/docker/volumes/96256232eb74edb139d652746f0fe426e57fbacdf73376963e3acdb411b3d73a/_data",
            "Destination": "/test2",
            "Driver": "local",
            "Mode": "",
            "RW": true
        }
    ],

可以看出,宿主机随机生成的一个目录名,命令中的路径指定的是容器内目录。

五、如果在容器内修改了目录的属主和属组,那么对应的挂载点是否会修改呢?

首先开启一个容器,查看容器内/soft目录的属性

[root@localhost ~]# docker run -it -v /test:/soft centos /bin/bash
[root@b5ed8216401f /]# ll -d /soft/
drwxr-xr-x 2 root root 6 Sep 24 03:48 /soft/

查看宿主机内/test目录的属性

[root@localhost ~]# ll -d /test/
drwxr-xr-x 2 root root 6 Sep 24 11:48 /test/

在容器内新建用户,修改/soft的属主和属组

[root@b5ed8216401f /]# useradd victor
[root@b5ed8216401f /]# chown -R victor.victor /soft/
[root@b5ed8216401f /]# ll -d /soft/
drwxr-xr-x 2 victor victor 6 Sep 24 03:48 /soft/

再来看看宿主机内/test目录的属主和属组是否会发生变化?

[root@localhost ~]# ll -d /test/
drwxr-xr-x 2 mycat mycat 6 Sep 24 11:48 /test/

竟然变为mycat了。。。

原来,这个与UID有关系,UID,即“用户标识号”,是一个整数,系统内部用它来标识用户。一般情况下它与用户名是一一对应的。

首先查看容器内victor对应的UID是多少,

[root@b5ed8216401f /]# cat /etc/passwd | grep victor
victor:x:1000:1000::/home/victor:/bin/bash

victor的UID为1000,那么宿主机内1000对应的用户是谁呢?

[root@localhost ~]# cat /etc/passwd |grep 1000
mycat:x:1000:1000::/home/mycat:/bin/bash

可以看出,宿主机内UID 1000对应的用户是mycat。

六、容器销毁了,在宿主机上新建的挂载目录是否会消失?

在这里,主要验证两种情况:一、指定了宿主机目录,即 -v /test:/soft。二、没有指定宿主机目录,即-v /soft

第一种情况:

[root@localhost ~]# rm -rf /test    --首先删除宿主机的/test目录
[root@localhost ~]# ls /    --可以看到,宿主机上无/test目录
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@localhost ~]# docker run -it --name=centos_test -v /test:/soft centos /bin/bash  --启动容器,为了删除方便,我用--name参数指定了容器的名字
[root@82ad7f3a779a /]# exit
exit
[root@localhost ~]# docker rm centos_test   --删除容器
centos_test
[root@localhost ~]# ls /   --发现 /test目录依旧存在
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  test  tmp  usr  var

可以看出,即便容器销毁了,新建的挂载目录不会消失。进一步也可验证,如果宿主机目录的属主和属组发生了变化,容器销毁后,宿主机目录的属主和属组不会恢复到挂载之前的状态。

第二种情况,通过上面的验证知道,如果没有指定宿主机的目录,则容器会在/var/lib/docker/volumes/随机配置一个目录,那么我们看看这种情况下的容器销毁是否会导致相应目录的删除

首先启动容器

[root@localhost ~]# docker run -it --name=centos_test -v /soft centos /bin/bash
[root@6b75579ec934 /]# exit
exit

通过docker inspect命令查看容器在宿主机上生成的挂载目录

 "Mounts": [
        {
            "Name": "b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301",
            "Source": "/var/lib/docker/volumes/b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301/_data",
            "Destination": "/soft",
            "Driver": "local",
            "Mode": "",
            "RW": true
        }
    ],

对应的是/var/lib/docker/volumes/b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301/_data目录

销毁容器,看目录是否存在

[root@localhost ~]# docker rm centos_test
centos_test
[root@localhost ~]# ll /var/lib/docker/volumes/b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301
total 0
drwxr-xr-x 2 root root 6 Sep 24 14:25 _data

发现该目录依旧存在,即便重启了docker服务,该目录依旧存在

[root@localhost ~]# systemctl restart docker
[root@localhost ~]# ll /var/lib/docker/volumes/b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301
total 0
drwxr-xr-x 2 root root 6 Sep 24 14:25 _data

七、挂载宿主机已存在目录后,在容器内对其进行操作,报“Permission denied”。

可通过两种方式解决:

1> 关闭selinux。

临时关闭:# setenforce 0

永久关闭:修改/etc/sysconfig/selinux文件,将SELINUX的值设置为disabled。

2> 以特权方式启动容器 

指定--privileged参数

如:# docker run -it --privileged=true -v /test:/soft centos /bin/bash

分享到:
评论

相关推荐

    docker-compose 容器部署 nsq

    如果需要持久化NSQ的数据,可以挂载一个卷来保存队列的状态: ```yaml volumes: - nsq_data:/data ``` 其中,`nsq_data`是一个需要在宿主机上创建的目录。 现在,当运行`docker-compose up`时,Docker ...

    docker-otrs:包含可运行 OTRS 的 docker 镜像

    OTRS Docker容器 该项目创建了一个安装了完整 OTRS 堆栈的 Docker 容器(带有 MySQL 数据库的 PERL 应用程序)。 要求 您需要安装最新的docker版本,请...$ docker run -t -p 80:80 -v /otrs/data:/var/lib/mysql/otrs

    centos 7.6可用的docker-compose,最新版本,2.24.6

    Docker Compose version v2.24.6 **Docker Compose是一个用于定义和运行多容器Docker应用程序的工具**。 Docker Compose 通过使用YAML文件格式来配置应用服务,允许用户在一个配置文件中定义多个服务的运行参数,...

    boot2docker-automounter:一个在boot2docker主机上自动挂载Virtualbox共享文件夹的Docker容器

    boot2docker-automounter 一个docker容器,可在boot2docker主机上自动挂载Virtualbox共享文件夹... docker run -d --restart=always --privileged -v /proc:/hproc --name automounter jrotter/boot2docker-automount

    docker-thunder-xware:Docker雷鸣般的倒塌

    Dockerizing thunder xware 迅雷离线下载 docker 镜像, 随便一台能上网的服务器都能... -v $(pwd)/data:/app/TDDOWNLOAD \ yinheli/docker-thunder-xware 查看运行情况 docker ps // output: CONTAINER ID IMAGE COMMA

    docker里面nginx目录挂载启动失败

    首先,当我们运行Docker容器时,通常会用`-v`参数来挂载宿主机的目录到容器内,以便于我们能直接在宿主机上编辑配置文件或查看日志,如`/Docker/nginx/conf/nginx.conf`挂载到`/etc/nginx/nginx.conf`,`/Docker/...

    docker运行容器远程挂载卷的方法

    在Docker环境中,数据持久化是非常重要的,而挂载卷是实现这一目标的主要方式之一。在本地挂载卷可以方便地管理容器内的数据,但在分布式系统中,有时我们需要将容器的数据挂载到远程主机上,这就是远程挂载卷的需求...

    docker-registry-mirror:Docker 私有注册表 + 镜像 + Web UI

    将本地目录挂载到容器中的镜像注册表上以实现持久性 将 Docker Private Registry Web UI 作为容器运行 要求 >= v4.3.18 >= v1.6.5 启动 Docker 私有注册表 + 镜像 $ git clone ...

    docker-php-yaf:用于构建 php yaf 框架的 Dockerfile

    docker run -p 8881:80 -v $your_workdir:/data/workdir -d leozvc/docker-php-yaf 支持的标签 见: : 更多的 获取更多信息: : 什么是雅夫? Yaf 是用 c 编写的 PHP 框架,并作为 PHP 扩展构建。 git

    docker-volume-pool

    因此,docker -V将始终为给定的映像和容器名称自动挂载卷。 懒人@ 前任: docker run \ -v 0:/data0 \ -v 1:/data1 \ -v 2:/data2 \ -v 3:/data3 \ -v 4:/data4 \ -v 5:/data5 \ -v 6:/data6 \ -v 7:/...

    docker-adb:适用于ADB的Docker

    docker-adb 适用于ADB的Docker映像内置最新的Debian 的openjdk 7 Android SDK 24.3.4运行adb devices命令 docker run --privileged -v /dev/bus/usb:/dev/bus/usb softsam/adb adb devices

    vagrant-docker-review:关于

    回复:使用 Vagrant 和 Docker 查看是一个易于...VIEW 映像,并将当前的vagrant-docker-review docker vagrant-docker-review文件夹挂载到 boot2docker VM 中的/vagrant 。以 PDF 格式构建样书适用于 Mac $ cd revie

    40-Docker挂载主机目录1

    5. `-v /root/dockerdata/imgs:/usr/local/tomcat/webapps/imgs`: 这就是挂载主机目录的关键。`-v`参数后面跟着两部分,用冒号分隔,左边是主机的绝对路径,右边是容器内的路径。在这个例子中,我们把主机的`/root/...

    docker-volume-efs:适用于AWS EFS(弹性文件系统)的Docker插件

    请创建一个EFS挂载点挂载到本地文件系统和容器环境致谢 (用作引导程序)路线图检查系统是否已安装NFS utils(在启动时)要求主机上安装的NFS工具( ) Docker 1.8+ AWS EFS支持的区域上的AWS EC2主机用法启动插件$ ...

    docker-nginx-hhvm:这是一个带有Nginx,HHVM和Ubuntu 14.04的简单容器

    docker run --name mywebapp -d -P -v /src/html:/var/www/html vutran/docker-nginx-hhvm 在浏览器中打开URL open http://$(boot2docker ip):$(docker port mywebapp 80 | sed 's/0.0.0.0://g') Docker文件 您还...

    docker-libreoffice:支持jre8的libfreoffice转换

    从公共下载: docker pull renothing/libreoffice (或者,您可以从Dockerfile构建映像:docker docker build -t="renothing/libreoffice:tag" http://github.com/renothing/docker-libreoffice )通过卷挂载会添加...

    使用docker -v 和 Publish over SSH插件实现war包自动部署到docker的操作步骤

    `docker -v`是Docker中的一个选项,用于在运行容器时挂载宿主机的目录到容器内,实现数据持久化和方便更新。例如,以下命令创建了一个名为`tomcat_xiao_volume`的容器,将宿主机`/home/xiaochangwei/test`目录挂载到...

    java8看不到源码-docker-jenkins:詹金斯容器

    java8 看不到源码[] () [] () 信息 基本泊坞窗图像: GitHub 项目: 此容器中安装了什么: Oracle-java8 ...docker ...docker-jenkins docker ...配置启动并挂载一个卷: docker run -d -v ~/volumes/jenki

    docker-xampp:Dockerfile构建包含在带有SSH服务器的Debian系统上运行的XAMPP(MySQL + PHP + PHPMyAdmin)的映像

    docker run --name myXampp -p 41061:22 -p 41062:80 -d -v ~ /my_web_pages:/www tomsik68/xampp:8 docker-xampp 该图像用于PHP + MySQL开发。 为了方便起见,它还运行SSH服务器进行连接。 MySQL和phpmyadmin都...

    docker-nginx-php5-fpm:这是一个带有Nginx,PHP5-FPM和Ubuntu 14.04的简单容器

    docker run --name mywebapp -d -P -v /src/html:/var/www/html vutran/docker-nginx-php5-fpm 在浏览器中打开URL open http://$(boot2docker ip):$(docker port mywebapp 80 | sed 's/0.0.0.0://g') Dock

Global site tag (gtag.js) - Google Analytics