為什么不推薦Docker文件掛載?
今天群里小伙伴發了一個疑問,它通過docker啟動了個nginx,nginx的一些相關配置文件都是通過文件的方式進行映射的,疑問的點在于,在宿主機上修改了文件,為什么對應映射到容器里面的文件內容沒有改變?
話不多說,起個容器看
- docker run --name nginx -p 8082:80 -v /opt/nginx/nginx.conf:/etc/nginx.conf -d nginx
- Unable to find image 'nginx:latest' locally
- latest: Pulling from library/nginx
- a2abf6c4d29d: Pull complete
- a9edb18cadd1: Pull complete
- 589b7251471a: Pull complete
- 186b1aaa4aa6: Pull complete
- b4df32aa5a72: Pull complete
- a0bcbecc962e: Pull complete
- Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
- Status: Downloaded newer image for nginx:latest
- 3d669ab21cfc6845f8f7105233215c9ab9002ddd06af1132fba257e14f93121e
我這里直接映射了個nginx的主配置文件,別管目錄對不對,只是驗證文件修改
然后此時的文件內容應該是一致的,現在直接修改宿主機上的/opt/nginx/nginx.conf文件,首行加一個注釋
保存后,進容器,看下容器內的nginx.conf文件內容,也可以直接執行命令查看
- 進入容器
- docker exec -it 3d /bin/bash
- 查看文件開頭
- head /etc/nginx.conf
- 或者直接在宿主機查看
- docker exec 3d cat /etc/nginx.conf
可以看到,文件內容未改變
這是為什么呢?
這個問題,和Linux文件的inode有關系
第一次啟動容器的時候,看下兩個文件的inode
- 宿主機
- 容器
可以看到是同一個inode,也就是同一個文件,宿主機修改了文件內容后,再對比
- 宿主機
兩個就不是一個文件,此時想要容器內文件生效,需要重啟容器,重新加載新的文件
再看下目錄映射的情況,還是啟動個容器
- docker run --name nginx -p 8082:80 -v /opt/nginx:/opt/ -d nginx
- 537fc0c513d3bb83bb78d4f8333ede6a8a9d53070108ab55be5a8b9f2347ac9c
這次用目錄掛載,本地/opt/nginx掛載到容器/opt/下面 ,之后重復上面的操作,查看inode,修改文件,對比inode
可以看到,目錄掛載是沒有問題的,容器內文件隨宿主機文件實時改變的
為什么目錄可以呢?實際上就是那句經典,Linux下,一切皆文件,目錄也是一種特殊的文件,實際上它也是有自己的inode,掛載目錄的話,它實際上是將容器內目錄的inode指向到了宿主機的目錄
所以目錄內文件的改變,會實時改變,而文件掛載的話,實際容器內指向的inode還是原來的,而現在的文件實際上已經不是該inode了
本文轉載自微信公眾號「運維研習社」,可以通過以下二維碼關注。轉載本文請聯系運維研習社公眾號。