为什么不推荐Docker文件挂载?

开发 前端
今天群里小伙伴发了一个疑问,它通过docker启动了个nginx,nginx的一些相关配置文件都是通过文件的方式进行映射的,疑问的点在于,在宿主机上修改了文件,为什么对应映射到容器里面的文件内容没有改变?

今天群里小伙伴发了一个疑问,它通过docker启动了个nginx,nginx的一些相关配置文件都是通过文件的方式进行映射的,疑问的点在于,在宿主机上修改了文件,为什么对应映射到容器里面的文件内容没有改变?

话不多说,起个容器看

  1. docker run --name nginx -p 8082:80 -v /opt/nginx/nginx.conf:/etc/nginx.conf -d nginx 
  2. Unable to find image 'nginx:latest' locally 
  3. latest: Pulling from library/nginx 
  4. a2abf6c4d29d: Pull complete 
  5. a9edb18cadd1: Pull complete 
  6. 589b7251471a: Pull complete 
  7. 186b1aaa4aa6: Pull complete 
  8. b4df32aa5a72: Pull complete 
  9. a0bcbecc962e: Pull complete 
  10. Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31 
  11. Status: Downloaded newer image for nginx:latest 
  12. 3d669ab21cfc6845f8f7105233215c9ab9002ddd06af1132fba257e14f93121e 

我这里直接映射了个nginx的主配置文件,别管目录对不对,只是验证文件修改

然后此时的文件内容应该是一致的,现在直接修改宿主机上的/opt/nginx/nginx.conf文件,首行加一个注释

保存后,进容器,看下容器内的nginx.conf文件内容,也可以直接执行命令查看

  1. 进入容器 
  2. docker exec -it 3d /bin/bash 
  3. 查看文件开头 
  4. head /etc/nginx.conf 
  5. 或者直接在宿主机查看 
  6. docker exec 3d cat /etc/nginx.conf 

可以看到,文件内容未改变

这是为什么呢?

这个问题,和Linux文件的inode有关系

第一次启动容器的时候,看下两个文件的inode

  • 宿主机

  • 容器

可以看到是同一个inode,也就是同一个文件,宿主机修改了文件内容后,再对比

  • 宿主机

  • 容器

两个就不是一个文件,此时想要容器内文件生效,需要重启容器,重新加载新的文件

再看下目录映射的情况,还是启动个容器

  1. docker run --name nginx -p 8082:80 -v /opt/nginx:/opt/ -d nginx 
  2. 537fc0c513d3bb83bb78d4f8333ede6a8a9d53070108ab55be5a8b9f2347ac9c 

这次用目录挂载,本地/opt/nginx挂载到容器/opt/下面 ,之后重复上面的操作,查看inode,修改文件,对比inode

可以看到,目录挂载是没有问题的,容器内文件随宿主机文件实时改变的

为什么目录可以呢?实际上就是那句经典,Linux下,一切皆文件,目录也是一种特殊的文件,实际上它也是有自己的inode,挂载目录的话,它实际上是将容器内目录的inode指向到了宿主机的目录

所以目录内文件的改变,会实时改变,而文件挂载的话,实际容器内指向的inode还是原来的,而现在的文件实际上已经不是该inode了

本文转载自微信公众号「运维研习社」,可以通过以下二维码关注。转载本文请联系运维研习社公众号。

 

责任编辑:武晓燕 来源: 运维研习社
相关推荐

2024-11-12 10:30:54

Docker部署数据库

2024-06-04 00:10:00

开发拷贝

2015-07-01 10:25:07

Docker开源项目容器

2024-09-12 08:32:42

2020-07-02 14:12:52

C++语言编程

2021-08-23 13:02:50

MySQLJOIN数据库

2023-11-06 13:04:59

Python日志库

2023-09-27 23:03:01

Java虚拟线程

2021-01-13 09:55:29

try-catch-fJava代码

2018-11-29 14:30:42

数据库外键约束应用程序

2021-09-08 07:58:58

字节系统双写

2021-07-04 14:19:03

RabbitMQ消息转换

2020-08-24 10:55:41

数据库双写代码

2015-07-03 09:37:21

程序员外包公司

2020-08-31 11:20:53

MySQLuuidid

2024-07-29 09:03:00

2020-11-13 09:22:32

Docker数据库容器

2020-12-29 05:29:39

DockerK8s容器

2021-09-07 14:01:39

手机内存技术

2021-09-17 22:51:21

手机内存技术
点赞
收藏

51CTO技术栈公众号