放在最前面说明:
挂载宿主机软连接的路径问题【-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中有文件
[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
[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/
[root@Luna qq]# rm #直接删除,这样/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 可以正常访问有数据;
#欢迎各位大佬斧正
#转载请标明出处:/dP4B5