對Docker鏡像layer的理解
轉自:https://blog.csdn.net/u011069294/article/details/105583522
FROM python:3.6.1-alpine
RUN pip install flask
CMD [“python”,“app.py”]
COPY app.py /app.py
上面是一個Dockerfile的例子,每一行都會生成一個新的layer。 每一個層是上一層的增量或者是一些改變。
除了最上面的layer,鏡像的每一層都是只讀的。最上面的layer是為container創建的,是可讀可寫的,用來實現“copy-on-write",意思就是僅當對一些位于只讀層的文件需要被編輯時,存儲在較低layer層中的文件就會被拉到讀/寫容器層(最上面的一層),然后將那些更改存儲在容器層中。
可以使用 docker diff [container id]
查看哪些文件被拉到了容器層。參考文檔:https://docs.docker.com/engine/reference/commandline/diff/
由于有些layer層是只讀的,因此這些只讀的layer可以被image和運行容器共享。 例如,使用自己的Dockerfile創建具有相似基礎層的新Python應用程序,將共享與第一個Python應用程序相同的所有層。
從同一 image 啟動多個容器時,也可以看到layer層共享。 因為容器使用相同的只讀層,所以可以想象啟動容器非常快,并且在主機上的占用空間非常小。
對于Dockerfile中重復的部分的利用
可以將兩個Dockerfile的公共代碼放到一個基本Dockerfile中,然后在子Dockerfile使用FROM命令來使用公共的父Dockerfile。