一个因Docker容器挂载引发的意外

背景

经常使用 docker 部署的 nginx,并且曾经性能了文件挂载,参数如下:

后续由于技术要素,须要将一个 location 加上*.html禁用缓存,如下性能

 $request_filename  \\htmhtml$ {add_header CacheControl }

于是就在宿服务器上间接修正/deploy/nginx/conf.d/default.conf文件。

而后运转docker exec -it pc-nginx nginx -s reload,使性能失效。

但是实践测试结果并没有失效

还以为是性能加的不对,花了好长期间,改了几种模式,结果都不行。

直到进入容器内,检查容器内的文件发现,文件基本就没有改变!!!

重启了这个容器,性能文件才启动了更新,疑问获取处置。

思索

docker容器的挂载难道不是失效,而是要容器启动的时刻才会更新?

必需不是这样,容器内发生的日志内容,在容器外可以实时检查,难道是内->外是实时,外->内 是启动的时刻才加载?

假设是这样,那我不时以为的docker挂载是了解错了吗,越想越不对???

探求

经过一番查阅资料,发现了这个:

Docker 中,mount volume 的原理是借用了Linux Namespace中的 Mount NameSpace,隔离系统中不同进程的挂载点视图,实践文件是没有变动。

在container中,bash 实践就是一个运转在宿服务器上的进程,被Docker用Linux区分隔离了 Mount Namespace、UTS Namespace、IPC Namespace、PID Namespace、Network Namespace和User Namespace,使得它看上去如同运转在了一个独立的、相对隔离的系统上,但实践它的一切资源都是宿服务器在不同Namespace中的一个投影,文件也不例外。

Linux中,证实文件能否相反的基本路径是,经常使用stat命令,判别其 inode,假设两个文件的inode相反,两个文件肯定为同一文件,从而两个文件的内容也肯定相反。

docker自身不允许间接映射文件,经常使用docker映射文件时或许会出现疑问 。

通常

复现场景,验证疑问

mkdir p optnginxcd optnginxvi democonf

nginx内容如下:

server {listen server_name gatewaycnlocation  {proxy_pass http:}}

docker run --name n1-dir -v /opt/nginx:/etc/nginx/conf.d -d nginx

docker run --name n2-file -v /opt/nginx/demo.conf:/etc/nginx/conf.d/demo.conf -d nginx

docker exec -ti n1-dir /bin/bash

docker exec -ti n2-file /bin/bash

cat /etc/nginx/conf.d/demo.conf

和线上的环境获取的结果不分歧,这就很令人隐晦。想到线上的环境不是用的root账号部署的,难道和用户也有相关?

创立demo用户,再次尝试

重试刚才的步骤,获取结果:

获取结果,在挂载conf.d目录时,文件可以获取反常更新,但是假设间接挂载文件,文件的内容并不会实时更新。

小结

docker部署容器须要启动挂载时,经常使用挂载目录的模式,不要间接挂载文件。挂载目录不会出现宿服务器文件更新,而容器中文件没有更新的疑问。

您可能还会对下面的文章感兴趣: