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

这篇具有很好参考价值的文章主要介绍了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文章来源地址https://www.toymoban.com/news/detail-834810.html

到了这里,关于Docker挂载-宿主机软连接目录-问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Docker】在容器中管理数据&&数据卷挂载以及宿主机目录挂载

                                      🎉🎉欢迎来到我的CSDN主页!🎉🎉                         🏅我是平顶山大师,一个在CSDN分享笔记的博主。📚📚         🌟推荐给大家我的博客专栏《【Docker】在容器中管理数据》。🎯🎯                         🎁

    2024年01月16日
    浏览(37)
  • 当docker中容器运行时,如何将目录和宿主机进行挂载

    容器已运行,但还想挂载文件 容器已经运行起来了,突然想给容器的目录进行挂载,通常是在运行容器时加上 -v  命令 进行挂载。运行起来的容器想挂载文件夹可以通过修改容器在宿主机的配置文件进行解决。 在配置文件中加入新的挂载 1.查看容器存放目录 2.进入该目录

    2024年01月25日
    浏览(39)
  • 宿主机无法连接docker里的redis问题解决(生产环境慎用)

    1.连接超时 2.连接能连上但马上断开并报错 3.提示保护模式什么的 链接redis 时只能通过本地localhost (127.0.0.1)这个来链接,而不能用网络ip(192.168…)这个链接 1.打开配置文件把下面对应的注释掉 2.Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进

    2024年04月13日
    浏览(49)
  • Docker之宿主机与容器之间的文件复制与挂载

    宿主机与容器之间的文件挂载与复制 1、从宿主机复制到容器命令格式为:       docker cp 宿主机的本地地址 容器名/容器ID:容器路径  先在宿主机里面创建一个666.txt的文件,然后docker cp 命令把文件复制到容器中。 2、从容器复制到宿主机命令格式:      docker cp 容器名字

    2024年02月13日
    浏览(46)
  • docker简介以及docker安装redis、mysql并实现数据挂载宿主机

    1、简介 官网 docker官网:http://www.docker.com 仓库 Docker Hub官网: https://hub.docker.com/ 2、前提 2.1 前提条件: Docker必须部署在Linux内核的系统上 目前,CentOS 仅发行版本中的内核支持 Docker。Docker 运行在CentOS 7 (64-bit)上, 要求系统为64位、Linux系统内核版本为 3.8以上 2.2查看自己的内核

    2024年02月04日
    浏览(40)
  • 解决docker通过volumes挂载文件,宿主机修改后容器内不同步,重启服务才能同步

    将文件的权限改为777,即 chmod 777 filename 。 详细解释在该文章: https://huaweicloud.csdn.net/633114e5d3efff3090b51a5a.html 说明: 这是由于linux系统文件挂载机制导致的。 docker通过volumes挂载文件到容器中,有以下两种方式: 1、挂载目录 2、挂载具体文件:并不是挂载了某个文件的路径,

    2024年03月10日
    浏览(50)
  • k8s 目录和文件挂载到宿主机

    k8s生产中常用的volumes挂载方式有:hostPath、pv,pvc、nfs 1.hostPath挂载      hostPath是将主机节点文件系统上的文件或目录挂载到Pod 中,同时pod中的目录或者文件也会实时存在宿主机上,如果pod删除,hostpath中的文件不会被删除。( 生成的pod只能在同一个节点上 ,调度到其他节

    2024年01月19日
    浏览(36)
  • Docker容器内连接宿主机的其他服务,比如Mysql

    通过上一篇文章,我们可以解决同一个容器内的通讯问题,大家使用同一个桥接网络的方案是最简便的,但是我们的容器需要访问宿主机怎么办 ? 现实的场景,我们一般都是微服务全部部署到了容器内,但是像数据库这种极其需要稳定性的功能,我们是需要部署到宿主机上

    2024年02月12日
    浏览(40)
  • docker中容器时间和宿主机时间不同步问题解决

    1、容器挂在启动,挂载localtime文件到容器内,共享主机的locactime 2、复制主机的localtime 3、重启容器 4、查看容器时间,检查容器时间是否正常

    2024年02月06日
    浏览(43)
  • docker macvlan虚拟化网络与宿主机通信问题解决——筑梦之路

    默认情况下各个macvlan之间可以通讯,但是不能与宿主机进行通讯!! 主要原因:为了安全而禁止互通 如宿主机ping容器的ip,尽管他们属于同一网段,但也是ping不通的,反过来也是。 这里用两个实例来说明如何解决这个问题。 实例一  实例二 参考资料: 解决Docker macvlan网络

    2024年02月07日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包