卷(Volume)
眾所周知卷(Volume)是容器中的一個數據掛載點,卷可以繞過聯合文件系統,從而為Docker 提供持久數據,所提供的數據還可以在宿主機-容器或多個容器之間共享。通過卷,我們可以可以使修改數據直接生效,而不必重新構建鏡像。
一、數據卷
數據卷是一個可以繞過聯合文件系統的,專門指定的可在一或多個容器間共享目錄。卷為提供為持久化或共享數據提供了一些有用的特性。
數據卷設計的初哀是提供持久化數據,而與容器的生命周期無關。因此,在刪除容器時,Docker不會自動刪除卷,直到沒有容器再引用。
1.1 添加數據卷
可以在docker create和docker create命令創建容器時,通過-v參數為容器添加數據卷。-v參數參數可以多次使用,以添加多個數據卷。
如,可以像下面這樣為容器添加一個卷:
$ sudo docker run -t -i -v /home/test --name test itbilu/test /bin/bash
這樣就會在容器內/webapp位置創建一個卷。
除了在創建容器時添加數據卷外,還可以通過Dockerfile文件中通過Volume指令添加,Volume可以多次使用以添加多個數據卷。
說明:本文中使用的示例鏡像(itbilu/test)通過以下Dockerfile文件創建:
# Version: 0.0.3FROM ubuntu:16.04MAINTAINER 何民三 "cn.liuht@gmail.com"RUN apt-get updateRUN apt-get install -y nginxRUN echo 'Hello World, 我是個容器' / > /var/www/html/index.htmlRUN mkdir /home/itbilu/ENV ITBILU_PATH /home/itbilu/VOLUME [$ITBILU_PATH]EXPOSE 80
1.2 卷位置
添加卷后,可以通過docker inspect來查看數據卷在容器中的位置:
$ sudo docker inspect test
docker inspect可以用來查看容器或鏡像的詳細配置信息。可以在容器的Mounts節點下,查看容器的卷信息:
..."Mounts": [{ "Type": "volume", "Name": "5f869c580c06e6079b0de2c5ce682c1c9467286c76b506703d87bf11d1271c24", "Source": "/var/lib/docker/volumes/5f869c580c06e6079b0de2c5ce682c1c9467286c76b506703d87bf11d1271c24/_data", "Destination": "/home/test", "Driver": "local", "Mode": "", "RW": true, "Propagation": ""},{ "Type": "volume", "Name": "e4fd6c3a91ba2e03b14cf174c2023f366abbe9f2f73ca07e6bac223f68e47773", "Source": "/var/lib/docker/volumes/e4fd6c3a91ba2e03b14cf174c2023f366abbe9f2f73ca07e6bac223f68e47773/_data", "Destination": "[/home/itbilu/]", "Driver": "local", "Mode": "", "RW": true, "Propagation": ""}],...在以上示例中,有兩個掛載卷,一個是在docker run創建容器時創建的,而另一個是在創建運行容器鏡像的Dockerfile文件中通過VOLUME指令創建。其中,Source表示宿主機源文件位置,Destination表示數據卷在容器中的掛載位置,而RW表示卷是否可讀/寫。
1.3 掛載本地數據到容器數據卷
在前面示例中,我們運行容器時并沒有指定要掛載到容器中數據卷的本地目錄,所在Docker使用一個默認數據目錄。 -v參數除了可以在容器中創建數據卷外,還可以將宿主機中的目錄掛載到容器中的數據卷。
如,運行容器,并將本地的~/code/itbilu目錄掛載到容器的/home/itbilu數據卷上:
$ sudo docker run -t -i -v ~/code/itbilu:/home/itbilu --name test itbilu/test /bin/bas
|
新聞熱點
疑難解答