Docker容器启动的时候,如果要挂载宿主机的一个目录,可以用-v参数指定。
譬如我要启动一个centos容器,宿主机的/test目录挂载到容器的/soft目录,可通过以下方式指定:
docker run -it -v /test:/soft centos /bin/bash
这样在容器启动后,容器内会自动创建/soft的目录。通过这种方式,我们可以明确一点,即-v参数中,冒号":"前面的目录是宿主机目录,后面的目录是容器内目录。
貌似简单,其实不然,下面我们来验证一下。
[root@localhost ~]
invalid value "/test:soft" for flag -v: soft is not an absolute path
See 'docker run --help'.
直接报错,提示soft不是一个绝对路径,所谓的绝对路径,必须以下斜线“/”开头。
如果宿主机中存在/test目录,首先删除它:
[root@localhost ~]
[root@localhost ~]
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
启动容器:
[root@localhost ~]
[root@a487a3ca7997 /]
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin soft srv sys tmp usr var
查看宿主机,发现新增了一个/test目录:
[root@localhost ~]
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/,与宿主机的当前目录无关。
启动一个容器:
[root@localhost ~]
[root@ea24067bc902 /]
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
可以看出,同3中的结果类似,只不过,它不是相对路径的目录名,而是随机生成的一个目录名。
首先开启一个容器,查看容器内/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
[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
通过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
可通过两种方式解决:
1> 关闭selinux。
临时关闭:# setenforce 0
永久关闭:修改/etc/sysconfig/selinux文件,将SELINUX的值设置为disabled。
2> 以特权方式启动容器
指定–privileged参数
如:# docker run -it --privileged=true -v /test:/soft centos /bin/bash
原文链接:https://www.cnblogs.com/ivictor/p/4834864.html
volumes:
- ./init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js:ro
- ./mongo-volume:/data/db
会将当前路径下的init-mongo.js文件挂载到容器中的/docker-entrypoint-initdb.d/init-mongo.js,并且设置为只读方式;
会将当前路径下的mon
如果是多容器数据共通,那么按上面的办法就是每个容器都关联宿主机的一个文件夹,这样就能多容器数据共通。,就是创建一个容器专门挂载宿主机文件夹,然后其他容器关联到这个容器即可。容器中正常增删改文件,实现互通了,同时也可以单独访问。的过程中,经常需要挂载主机上的目录或文件到。)内添加文件,或修改文件内容都会互相同步。容器中,以实现数据的共享或持久化。然后再次执行创建文件命令,就能创建成功了。查看宿主机目录,需要回到宿主机最外层。是没有权限,加个权限就行。在创建启动容器时,使用。进入容器后,查看容器目录。
转载:https://www.cnblogs.com/mybxy/p/10393935.htmlDocker 目录挂载详述Docker容器启动的时候,如果要挂载宿主机的一个目录,可以用-v参数指定。
nginx.conf文件的内容,不管你是去网上搜也好,起了一个nginx容器进去复制也好[1],都要找到一个完整正确的对应文件的内容,写入宿主机中你想要挂载目录下的对应文件中,文件名要和Docker中的一致。需要我们去把vim装上。需要说明的是,以后两种方式进行挂载的,是不能自己指定目录位置的,一般是docker会在安装目录下的指定目录下面生成一个目录来绑定容器的匿名卷(这个指定目录不同版本的docker会有所不同),我当前的目录为:/var/lib/docker/volumes/{容器ID}[3]。
默认情况下,在Docker容器内创建的所有文件都只能在容器内部使用。容器删除后,数据也跟着删除,虽然通常我们不会删除容器,但是一旦宿主机发生故障,我们重新创建容器恢复服务,那么之前容器创建的文件就会丢失。所以我们需要将容器数据写到宿主机内,方便我们数据的存储、修改和共享。
当容器启动时,会在镜像的基础上添加一个可写层,容器中的所有修改都会保存在这个可写层中。在Docker中,可以通过挂载目录的方式将宿主机上的目录共享到容器中。由于容器中的文件系统是只读的,因此容器中的文件的权限可能会与宿主机上的不同。这样,在容器中创建的文件就会使用指定的用户和用户组,与宿主机上的文件权限保持一致。在Docker中,容器与宿主机之间的文件传输主要有两种方式:挂载目录和使用。例如,以下命令将在容器中将挂载的目录的权限设置为。这样,在容器中就无法修改挂载的目录中的文件了。例如,如果要将容器中的。
Docker容器启动的时候,如果要挂载宿主机的一个目录,可以用-v参数指定。
譬如我要启动一个centos容器,宿主机的/test目录挂载到容器的/soft目录,可通过以下方式指定:
docker run -it -v /test:/soft centos /bin/bash
这样在容器启动后,容器内会自动创建/soft的目录。通过这种方式,我们可以明确一点,即-v参数中,冒号":"前面.