當我們使用docker run -v /host/something:/container/something
嘗試掛載默寫目錄到容器內時,期待的效果是容器內的文件和本地目錄的文件相互映射,但實際效果宿主機目錄會直接覆蓋掉容器內的目錄,但容器內文件並非被刪除,這個后面會討論到。
本文觀點主要參看如下文章,因為國內少有討論volume掛載覆蓋問題,故簡翻記錄核心要義。
- http://container-solutions.com/understanding-volumes-docker/
- http://www.alexecollins.com/docker-persistence/
容器內的文件被刪除了嗎?
都按時否定的,容器的鏡像自帶的文件並沒有被重寫覆蓋,而是被隱藏了,原理類似於linux mount
的掛載,所以與其說是覆蓋,不如說是目錄掛載會掩蓋。
目前解決辦法
使用docker volume create
創建,這種方法創建的是數據卷
,而通過在創建容器時將主機本地任意路徑掛載到容器作為數據卷的方式稱為綁定數據卷
。
當我們需要將容器內文件映射,或者說是同步至宿主機的的文件夾里的時候,就可以通過數據卷的方式,具體指令如下:
docker run -it --name somename -v volume-name:/container-src anyimage /bin/bash
#數據卷的兩種方式
具名掛載: 指的是volume-name,主要不要添加`/`路徑符,添加路徑符則表示使用的是上文中綁定數據卷的方式,使用綁定數據卷是,宿主機路徑必須是絕對路徑.
匿名掛載: 指的是-v 后面只有/container-src,這樣容器目標路徑會掛載在隨機名的volume上.
# 可以查看具體的volumen列表
docker volume ls