docker 存儲卷 Volumes

一,docker容器面臨的困境:

  • 容器運行中產生的數據,是放到容器棧的最頂層,當容器中止並被刪除後,這些數據就被刪除了。
  • docker採用COW(寫時複製)策略,致使性能低下。好比有個mysql容器,會有頻繁的I/O處理。

二,解決策略:給容器外掛一個存儲文件系統,它就叫docker存儲卷(Volumes),它獨立於容器的生命週期,刪除容器時不會刪除卷(讓然也能夠作到,刪除容器的時候也刪除卷,但沒有這麼幹的)。

讓容器裏面的某個目錄綁定到宿主機的某個目錄。html

容器寫數據時,寫到/下的數據,最後被寫到了容器的可讀寫層;寫到/data下的數據,最後被寫到了宿主機的/data目錄下了。以下圖:mysql

下圖的宿主機A,B,C是文件系統NFS的客戶端。宿主機A的文件目錄A,宿主機B的文件目錄B,宿主機C的文件目錄C,都是訪問NFS上的同一個目錄。nginx

使用docker存儲卷功能,讓宿主機A上運行的mysql容器,產生的數據目錄,綁定到宿主機A的文件目錄A,因此當由mysql容器產生的數據,就存放到了宿主機A的文件目錄A上了,進而就存到到了NFS上了。c++

當宿主機A上運行的mysql容器被刪除了,數據仍是在的,存在NFS上了。sql

當在宿主機B或者宿主機C上運行剛纔那個mysql容器,也讓產生的數據目錄,綁定到宿主機B或者宿主機C,能夠從NFS上能夠拿到數據,因此數據和在宿主機A上運行是同樣的。docker

這就給運維提供了極大的便利,容器能夠隨便部署到集羣裏的任何機器上了。shell

能夠用【存儲】,【狀態】來劃分4個象限。tomcat

nginx只做爲反向代理服務器,因此它沒有狀態也不須要存儲。服務器

三,docker存儲卷有2種策略,都是使用-v選項。

  • bind mount volume:手動指定宿主機目錄。微信

    命令:docker run -v HOSTDIR:CONTAINERDIR

    #  docker run --name b1 -it --rm -v /tmp/html:/data busybox:latest
  • docker-managed volume:由docker本身決定宿主機目錄。

    命令:docker run -v CONTAINERDIR

    # docker run --name b1 -it --rm -v /data busybox:latest

    咱們不知道被關聯的宿主機的目錄是啥,使用docker inspect b1,找到【Mount】裏的【Source】,就能夠看到了。可是你下次再啓動容器是,關聯的目錄也會變化。

    也能夠看到Volumes。

    # docker inspect b1
    "Mounts": [
                {
                    "Type": "volume",
                    "Name": "2eeb1bdee5c83a304d101a98b06430af3aff27a578ad38c7e23423f317db9063",
                    "Source": "/var/lib/docker/volumes/2eeb1bdee5c83a304d101a98b06430af3aff27a578ad38c7e23423f317db9063/_data",
                    "Destination": "/data",
                    "Driver": "local",
                    "Mode": "",
                    "RW": true,
                    "Propagation": ""
                }
            ],
    "Volumes": {
                    "/data": {}
                },

    使用:docker inspect -f {{.Mounts}} b1,也能夠看到。注意大括號裏的key是區分大小寫的。

四,活用volume

  • 讓2個容器綁定到宿主機的同一個目錄,以達到2個容器的通訊。

    # docker run --name b1 -it --rm -v /tmp/html:/data busybox:latest
    # docker run --name b2 -it --rm -v /tmp/html:/data2 busybox:latest

    2個容器都綁定到了宿主機的/tmp/html上了。

  • 當另外一個容器想和某個容器綁定到宿主機的同一個目錄時,可是又不知道宿主機的目錄,這時,可讓這個容器直接使用某個容器的volume,這樣一來,就不用知道宿主機的目錄了。

    命令:docker run --volumes-from b1

    # docker run --name b2 -it --rm --volumes-from b1 busybox:latest
  • volume和joined containers(參考:二,host章節 )一塊兒使用,建立nginx容器和tomcat容器,共享base容器的網絡空間和volume。

    • 找一個容器,做爲基礎,它使命是:

      • 指定宿主機的目錄
      • 提供統一的對外網絡接口,外部客戶端直接能夠訪問nginx服務,可是看不到tomcat
      • nginx和tomcat使用lo(127.0.0.1)通訊。
      # docker run --name base -it -v /tmp/html:/data busybox:latest
    • 啓動nginx容器:--network container:base --volumes-from base

      # docker run --name nginx -it --rm --network container:base --volumes-from base busybox:latest
    • 啓動tomcat容器:--network container:base --volumes-from base

      # docker run --name tomcat -it --rm --network container:base --volumes-from base busybox:latest

c/c++ 學習互助QQ羣:877684253

本人微信:xiaoshitou5854

相關文章
相關標籤/搜索