一个因docker容器挂载引发的事故

一、背景

使用 docker 部署的 nginx,并且已经配置了文件挂载,参数如下:

  • -v /deploy/nginx/conf.d/doc.crt:/etc/nginx/conf.d/doc.crt
  • -v /deploy/nginx/conf.d/doc.key:/etc/nginx/conf.d/doc.key
  • -v /deploy/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf

后续因为技术原因,需要将一个 location 加上 *.html 禁用缓存,如下配置

if ($request_filename ~* .*\\.(htm|html)$) {
    add_header Cache-Control "no-store";
}

于是就在宿主机上直接修改 /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映射文件时可能会出现问题 。

三、实践

复现场景,验证问题

  1. 创建文件
mkdir -p /opt/nginx
cd /opt/nginx
vi demo.conf

nginx内容如下:

server {
    listen 80;
    server_name gateway.cn;
  
    location / {
          proxy_pass http://localhost:7001/;
    }
}
  1. 创建2个容器,一个映射目录,一个映射文件

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

  1. 再开启两个 shell ,进入容器内,查看文件

docker exec -ti n1-dir /bin/bash

docker exec -ti n2-file /bin/bash

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

  1. 修改外部文件
  • 简单修改,加一行注释# fadsff
  1. 重新查看文件
  • 但是得到了相同的结果,这与预期不符,使用stat命令,容器外和2个容器内的demo.conf 文件都是同一个inode

和线上的环境得到的结果不一致,这就很令人费解。想到线上的环境不是用的root账号部署的,难道和用户也有关系?

创建demo用户,再次尝试

重试刚才的步骤,得到结果

n3

n4

得到结果,在挂载conf.d 目录时,文件可以得到正常更新,但是如果直接挂载文件,文件的内容并不会实时更新。

四、小结

docker部署容器需要进行挂载时,使用挂载目录的方式,不要直接挂载文件。 挂载目录不会出现宿主机文件更新,而容器中文件没有更新的问题。

最后。

我创建了一个副业交流群,方便我的读者可以在群里讨论、交流大家尝试过的副业。


但是任何人在群里打任何广告,都会被我T掉。

如果你对这个特别的群,感兴趣,请加我微信回复:888,微信通过后会拉你入群。


加我微信,备注:副业

相关推荐

  • Star马上破万,这款开源AI知识库你一定要看看
  • 中文排版指南(有点变态)
  • 写给大家看的中文排版指南!
  • 每个人都需要的中文排版指南
  • 中文文案排版指南:提升网站气质的开源项目
  • 高赞 GitHub 项目盘点:美观的中文排版样式
  • 中文网页终于有了排版规范
  • 中文网页重设与排版-typo.ss
  • Spring Boot集成Akka remoting快速入门Demo
  • 据传,阿里云盘惊现灾难级bug,可看别人隐私照片
  • 一呼百应 !!! Modbus广播这么强
  • 19.6 K Star 超级路由器 !!! 黑客开发,支持1790种设备
  • 概率、统计学在机器学习中应用:20个Python示例
  • OpenAI o1模型问世,比 GPT-4 还强!
  • 创业失败后,如何找到下一个千万级风口?对话天才搞钱女友邓怡然
  • 中秋3天,足够你用AI编程,做个赚钱小产品
  • 奇舞周刊第541期:暗水印显隐术助力生产排障提效|得物技术
  • 2024 互联网公司中秋礼盒大盘点!
  • 全球第二大成人网站OnlyFans年度收入曝光,超过硅谷AI初创公司总和
  • 甲骨文正式发布VirtualBox 7.1:采用基于Qt6的全新现代化UI、更换Logo、“古董”画风官网也彻底改版