為什么不推薦Docker文件掛載?
今天群里小伙伴發(fā)了一個(gè)疑問,它通過docker啟動(dòng)了個(gè)nginx,nginx的一些相關(guān)配置文件都是通過文件的方式進(jìn)行映射的,疑問的點(diǎn)在于,在宿主機(jī)上修改了文件,為什么對應(yīng)映射到容器里面的文件內(nèi)容沒有改變?
話不多說,起個(gè)容器看
- 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
我這里直接映射了個(gè)nginx的主配置文件,別管目錄對不對,只是驗(yàn)證文件修改
然后此時(shí)的文件內(nèi)容應(yīng)該是一致的,現(xiàn)在直接修改宿主機(jī)上的/opt/nginx/nginx.conf文件,首行加一個(gè)注釋
保存后,進(jìn)容器,看下容器內(nèi)的nginx.conf文件內(nèi)容,也可以直接執(zhí)行命令查看
- 進(jìn)入容器
- docker exec -it 3d /bin/bash
- 查看文件開頭
- head /etc/nginx.conf
- 或者直接在宿主機(jī)查看
- docker exec 3d cat /etc/nginx.conf
可以看到,文件內(nèi)容未改變
這是為什么呢?
這個(gè)問題,和Linux文件的inode有關(guān)系
第一次啟動(dòng)容器的時(shí)候,看下兩個(gè)文件的inode
- 宿主機(jī)
- 容器
可以看到是同一個(gè)inode,也就是同一個(gè)文件,宿主機(jī)修改了文件內(nèi)容后,再對比
- 宿主機(jī)
兩個(gè)就不是一個(gè)文件,此時(shí)想要容器內(nèi)文件生效,需要重啟容器,重新加載新的文件
再看下目錄映射的情況,還是啟動(dòng)個(gè)容器
- docker run --name nginx -p 8082:80 -v /opt/nginx:/opt/ -d nginx
- 537fc0c513d3bb83bb78d4f8333ede6a8a9d53070108ab55be5a8b9f2347ac9c
這次用目錄掛載,本地/opt/nginx掛載到容器/opt/下面 ,之后重復(fù)上面的操作,查看inode,修改文件,對比inode
可以看到,目錄掛載是沒有問題的,容器內(nèi)文件隨宿主機(jī)文件實(shí)時(shí)改變的
為什么目錄可以呢?實(shí)際上就是那句經(jīng)典,Linux下,一切皆文件,目錄也是一種特殊的文件,實(shí)際上它也是有自己的inode,掛載目錄的話,它實(shí)際上是將容器內(nèi)目錄的inode指向到了宿主機(jī)的目錄
所以目錄內(nèi)文件的改變,會(huì)實(shí)時(shí)改變,而文件掛載的話,實(shí)際容器內(nèi)指向的inode還是原來的,而現(xiàn)在的文件實(shí)際上已經(jīng)不是該inode了
本文轉(zhuǎn)載自微信公眾號「運(yùn)維研習(xí)社」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系運(yùn)維研習(xí)社公眾號。