多个容器可以共享docker宿主机本地的某个目录,会大大提高使用效率。docker提供了一个-v参数,可以很好的解决这个问题。

如下,我们创建两台容器:

[root@localhost ~]# docker run -itd --name test2 -v /data01:/data01 centos7:latest /bin/bash
8930d4bef57c43137f7d901ed6b1f67ec906f155eea87d32b5e0b0b759612530
[root@localhost ~]# docker run -itd --name test3 -v /data01:/data01 centos7:latest /bin/bash
755d8fcb39afb23ae9c93466c5a3334397e8843216b9f8592527e1e3e405a754
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
755d8fcb39af        centos7:latest      "/bin/bash"         3 seconds ago       Up 2 seconds                            test3
8930d4bef57c        centos7:latest      "/bin/bash"         10 seconds ago      Up 9 seconds                            test2
这里我们使用了--name参数,给容器重命名,方便区分。

使用-v指定了宿主机的本地需要共享的目录为/data01,容器内共享的目录也为/data01

先看看效果,首先我们在宿主机的/data01目录里touch 1个文件,理论上在其他两个容器内是可以看到的。

[root@localhost ~]# cd /data01/
[root@localhost data01]# ls
[root@localhost data01]# touch 1
[root@localhost data01]# ls
1
[root@localhost data01]# docker exec -it test2 /bin/bash
[root@8930d4bef57c /]# ls /data01/
1
[root@8930d4bef57c /]# exit
exit
[root@localhost data01]# docker exec -it test3 /bin/bash
[root@755d8fcb39af /]# ls /data01/
1
可见,这个目录是生效的。

这里需要注意:

1,-v /data01:/data01中,冒号前面的/data01,指的是宿主机目录的绝对路径。我们在创建容器时,可以提前创建好,也可以启动完成在创建,都不会影响这个功能的使用。同样,冒号后面的/data01目录,也必须是绝对路径。如果目标容器内没有这个文件,那么他就会自动创建一个。

这个功能类似于nfs

2,权限问题。共享目录内的文件如果需要正常读取,文件的权限必须一致。我们如果使用的是root用户创建的文件,容器使用的是普通用户启动的业务的话,文件是无法读取的。为了保证业务的规范性,建议容器和宿主机的用户一致,包括GID和UID都要一致。这个和nfs也是同样的原理。

 

3,当容器里的文件存入共享目录之后,如果该容器被销毁,该文件是否还存在呢?我们来做个实验:

首先在test3的/data01目录里touch 2

[root@755d8fcb39af /]# cd /data01/
[root@755d8fcb39af data01]# ls
1
[root@755d8fcb39af data01]# touch 2
[root@755d8fcb39af data01]# ls
1  2
然后退出容器,删除容器test3

docker rm -f test3

再看本地:

[root@localhost data01]# ls
1  2
这个文件依然存在,并且依然能够被test2读取

[root@localhost data01]# docker exec -it test2 /bin/bash
[root@8930d4bef57c /]# ls /data01/
1  2
 

 


 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐