机器环境
本实践将在 Ubuntu 22.04.3LTS 系统上进行安装测试
docker 版本Docker Engine - Community 24.0.6
,原则上docker版本无影响
背景
因项目需求,需要再docker容器里面添加额外的hosts文件内容,想在通过 -v 挂载hosts文件,但是发现docker容器里面无法加载外部的hosts文件
操作过程记录
运行容器脚本
docker run -d -p 8088:80 -p 8081:8081 -v /root/deploy/nginx/hosts:/ect/hosts -v /root/deploy/nginx/nginx.conf:/etc/nginx/nginx.conf -v /root/deploy/nginx/default.conf:/etc/nginx/conf.d/default.conf --restart=always --name nginx-example nginx:1.23.0
现象1:上 面
/ect/hosts
无法被外面覆盖 , 当前docker机制为自动生成和维护
/var/lib/docker/containers/208b5870ad6889327a29e4ced312a66c377c885188303706a682793f72425125/hosts
文件为容器内的hosts文件的物理位置
通过docker inspect nginx-example
获取到
```bash
vim /var/lib/docker/containers/208b5870ad6889327a29e4ced312a66c377c885188303706a682793f72425125/hosts
修改也无效,且重启后
cat /var/lib/docker/containers/208b5870ad6889327a29e4ced312a66c377c885188303706a682793f72425125/hosts
重新变回容器文件
```
现象2:
etc/nginx/nginx.conf
/etc/nginx/conf.d/default.conf
两个文件, 在宿主机更改,不重启容器容器无法感知到,重启后可以感知到现象3:
在容器里面更改上述两个文件,宿主机可以感知到
现象4:家目录,如 home、xx , 现象同3
分析
现象3,现象4 这是由于linux系统文件挂载机制导致的。可以通过挂在目录的形式来实现
docker挂载文件时,并不是挂载了某个文件的路径,而是挂载了对应的文件,即挂载了linux指定的 inode 文件。
当使用vim之类的编辑器进行保存时,它不是直接保存文件,而是采用了备份、替换的策略,就是编辑时,是创建一个新的文件,在保存的时候,把备份文件替换源文件,这个时候文件的 inode 就发生了变化,而原来 inode 对应的文件其实并没有修改,也就是容器内的文件没有变化。当重启容器的时候,会挂载新的 inode 文件,所以容器内的文件没有变化。
此路不同,就像其他路径
脚本修改完配置文件后,重启容器
docker restart nginx-example