一个因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部署容器须要启动挂载时,经常使用挂载目录的模式,不要间接挂载文件。挂载目录不会出现宿服务器文件更新,而容器中文件没有更新的疑问。