Docker挂载-宿主机软连接目录-问题

放在最前面说明:

挂载宿主机软连接的路径问题【-v /usr/local/nginx/:/home/test/nginx/】,软连接可以映射任何路径,但有一个前提是:其所映射的路径必须要在容器中存在,否则就无法访问到数据

1、如果软连接路径在容器中已经存在,如/root/home,或者在当前挂载命令 -v 前面的 -v 命令已经将软连接映射的路径包含了进去,如此就不需要额外进行软连接目录的挂载;

2、此时需要注意,如果挂载之后的文件在容器中的访问路径与软连接的路径不一致,则依然需要进行额外挂载;

 软连接目录挂载说明:

例如目录A: A -> /usr/local/nginx/

启动命令:docker run -dit --name test5 -v /usr/local/nginx/:/home/A/ ubuntu-ping

因为A是软连接,所以容器实际上挂载的命令是:

docker run -dit --name test5 -v /usr/local/nginx/:/usr/local/nginx/ ubuntu-ping

Docker中的-v命令会在容器中自动创建不存在的目录,因此目录/usr/local/nginx/在容器中会被创建出来,然后由于目录A通过软连接与/usr/local/nginx/进行映射,正好此时容器中该目录(/usr/local/nginx/)已经被创建出来并且也进行了挂载,所以此时目录A可以正常访问有数据;

工作中遇到一个问题,想要迁移宿主机中的一个已经存在的目录A的位置,但是又不想修改Docker应用程序中指定的A目录的读取和存储的位置

于是想到了两种方式类解决:

1、通过将目录A中的数据全部迁移到位置B,然后在原来位置创建空文件夹A,然后在容器启动时,将位置B与空目录A进行挂载映射来解决;

2、通过将目录A中的数据全部迁移到位置B,然后在原来位置创建一个名称为A的软连接,软连接指向迁移后的位置B,并且在容器启动时,将位置B与空目录A进行挂载映射来解决;

以上两种方式各各有不同

方式1:

容器中位置A与B直接映射,在宿主机中访问位置A为空目录,容器中访问有数据,实际指向位置B;如果通过ngin下载位置A中文件,没有迁移到B之前可以正常访问,但是迁移之后,文件实际都在B中,A中为空,所有此时下载失败;

方式2:

在容器和宿主机中,目录A都是一个软连接方式,则,在宿主机中访问位置A有数据,如果通过nginx下载文件,则都能正常下载;由于在容器启动时对目录A进行了目录挂载,所以容器中A同样有数据;

方式一流程:

原本文件目录样式:

[root@Luna test]# pwd
/home/admin/test
[root@Luna test]# ll

-rw-r--r-- 2 root root   16 Aug  7 13:54 3333

lrwxrwxrwx 1 root root   17 Sep  8 12:30 nginx
drwxrwxrwx 1 root root   16 Sep  7 18:53 qq

如上,目录qq中有文件 123.txt

[root@Luna qq]# 
[root@Luna qq]# pwd
/home/admin/test/qq
[root@Luna qq]# ll

-rw-r--r-- 1 root  root          0 Sep  8 14:12 123.txt

[root@Luna qq]#

将目录qq迁移到/var目录下(也可以使用mv命令,保险起见使用cp,然后再删除)

[root@Luna qq]# pwd
/home/admin/test/qq
[root@Luna qq]# cp -rp /home/admin/test/qq/  /var/
[root@Luna qq]# ls /var/qq/
123.txt
[root@Luna qq]# rm 123.txt  #直接删除123.txt,这样/home/admin/test/qq/中就是空的

启动容器,添加挂载命令

[root@Luna qq] docker run -dit --name test1 -v /home/admin/test:/home/test -v /var/qq/:/home/test/qq/ ubuntu-ping

说明:

宿主机 /home/admin/test 下含有目录qq,当通过第一个 -v 挂载到容器中的 /home/test 下之后,容器中的qq路径为 /home/test/qq

重点就是第二个 -v ,该操作将宿主机中的 /var/qq/ 目录挂载到了刚刚被启动自动创建的目录 /home/test/qq 目录下

注意:宿主机中qq路径为:/home/admin/test/qq/,但是经过第一个-v挂载后,容器中的qq路径就变成了 /home/test/qq ,而此时第二个-v实际上是要给容器中的qq进行挂载,所以容器的映射路是的 /home/test/qq 而不是 /home/admin/test/qq,一定要注意

此时,容器中的目录qq中就有数据,可以访问,但是宿主机中的qq中是空的,因为实际目录被映射在了/var/qq/中;

方式二流程:

原本文件目录样式:

[root@Luna test]# pwd
/home/admin/test
[root@Luna test]# ll

-rw-r--r-- 2 root root   16 Aug  7 13:54 3333

drwxrwxrwx 1 root root   17 Sep  8 12:30 nginx
drwxrwxrwx 1 root root   16 Sep  7 18:53 qq

[root@Luna test]# ls nginx
client_body_temp  conf  fastcgi_temp  html  logs  proxy_temp  sbin  scgi_temp  uwsgi_temp

如上,目录 nginx中存放的是 nginx的安装文件,现在将其中文件迁移到 /usr/local/nginx/ 目录下

[root@Luna test]# pwd
/home/admin/test
[root@Luna test]# cp -rp /home/admin/test/nginx/  /usr/local/
[root@Luna test]# ls /usr/local/nginx
client_body_temp  conf  fastcgi_temp  html  logs  proxy_temp  sbin  scgi_temp  uwsgi_temp

[root@Luna test]# rm -rf nginx  #直接删除目录nginx

[root@Luna test]# ln -s /usr/local/nginx/ nginx/  #创建名称nginx的软连接到 /usr/local/nginx/
[root@Luna test]# ll

-rw-r--r-- 2 root root   16 Aug  7 13:54 3333


lrwxrwxrwx 1 root root   17 Sep  8 12:30 nginx -> /usr/local/nginx/
drwxrwxrwx 1 root root   16 Sep  7 18:53 qq

1、此时创建一个【有问题的容器

假如我们不对这个软连接进行单独的挂载处理,我们看一下文件夹能否访问到数据,会报异常:bash: cd: nginx: No such file or directory

[root@Luna qq] docker run -dit --name test2 -v /home/admin/test:/home/test ubuntu-ping


[root@Luna test]# 
[root@Luna test]# docker exec -it test2 bash  #进入容器
root@e1b96f042447:/# cd /home/test/    #进入挂载的目录

root@e1b96f042447:/home/test# ll

drwxrwxr-x 3 1000 1000 4096 Sep  8 04:30 ./
drwxr-xr-x 1 root root 4096 Sep  8 06:52 ../
-rw-r--r-- 2 root root   16 Aug  7 05:54 3333

lrwxrwxrwx 1 root root   17 Sep  8 04:30 nginx -> /usr/local/nginx/
lrwxrwxrwx 1 root root   16 Sep  7 10:53 qq

root@e1b96f042447:/home/test# cd nginx         #进入nginx
bash: cd: nginx: No such file or directory       #无法进入,失败
root@e1b96f042447:/home/test# 

说明:此时,容器内无法访问该目录,但是宿主机中可以正常访问;

2、此时创建一个【正常的容器

[root@Luna qq] docker run -dit --name test3 -v /home/admin/test:/home/test -v /usr/local/nginx/:/home/test/nginx/ ubuntu-ping
[root@Luna test]# 
[root@Luna test]# docker exec -it test3 bash  #进入容器
root@e1b96f042447:/# cd /home/test/    #进入挂载的目录

root@e1b96f042447:/home/test# ll


-rw-r--r-- 2 root root   16 Aug  7 05:54 3333

lrwxrwxrwx 1 root root   17 Sep  8 04:30 nginx -> /usr/local/nginx/
lrwxrwxrwx 1 root root   16 Sep  7 10:53 qq


root@e1b96f042447:/home/test# cd nginx         #成功进入nginx

root@b5b6de009c3a:/home/test/nginx# ll
total 44
drwxr-xr-x 11 root   root 4096 Jun 30  2022 ./
drwxr-xr-x  1 root   root 4096 Sep  8 07:01 ../
drwx------  2 nobody root 4096 Jun 30  2022 client_body_temp/
drwxr-xr-x  3 root   root 4096 Jun 11 01:50 conf/
drwx------  2 nobody root 4096 Jun 30  2022 fastcgi_temp/
drwxr-xr-x  2 root   root 4096 Aug 11 13:34 html/
drwxr-xr-x  2 root   root 4096 Aug 25 09:57 logs/
drwx------  2 nobody root 4096 Jun 30  2022 proxy_temp/
drwxr-xr-x  2 root   root 4096 Nov 15  2022 sbin/
drwx------  2 nobody root 4096 Jun 30  2022 scgi_temp/
drwx------  2 nobody root 4096 Jun 30  2022 uwsgi_temp/
root@b5b6de009c3a:/home/test/nginx# pwd
/home/test/nginx

说明,此时,容器中目录nginx可以访问且有数据,宿主机中也可以访问也有数据;

软连接目录挂载说明:
例如目录A: nginx -> /usr/local/nginx/
启动命令:docker run -dit --name test3  -v /usr/local/nginx/:/home/test/nginx  ubuntu-ping
因为 nginx 是软连接,所以容器实际上挂载的命令是:
docker run -dit --name test5  -v /usr/local/nginx/:/usr/local/nginx/  ubuntu-ping
Docker中的 -v 命令会在容器中自动创建不存在的目录,因此目录 /usr/local/nginx/ 在容器中会被创建出来,然后由于目录A通过软连接与 /usr/local/nginx/ 进行映射,正好此时容器中该目录(/usr/local/nginx/)已经被创建出来并且也进行了挂载,所以此时目录 nginx 可以正常访问有数据;

软连接目录挂载说明:

例如目录nginx nginx -> /usr/local/nginx/

启动命令:docker run -dit --name test3 -v /usr/local/nginx/:/home/test/nginx ubuntu-ping

因为 nginx 是软连接,所以容器实际上挂载的命令是:

docker run -dit --name test5 -v /usr/local/nginx/:/usr/local/nginx/ ubuntu-ping

Docker中的 -v 命令会在容器中自动创建不存在的目录,因此目录 /usr/local/nginx/ 在容器中会被创建出来,然后由于目录 nginx 通过软连接与 /usr/local/nginx/ 进行映射,正好此时容器中该目录(/usr/local/nginx/)已经被创建出来并且也进行了挂载,所以此时目录 nginx 可以正常访问有数据;

#欢迎各位大佬斧正

#转载请标明出处:http://t.csdn.cn/dP4B5

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值