Docker volumes 筆記

  • 9240
  • 0
  • 2016-07-10

Docker Volume 是個介於主機與容器間的共享資料夾,可用來匯入或匯出容器內的資料,或者共享容器間的資料

Usage:

 

  • 在使用 docker create 或者 docker run 指令時加上 -v 旗標,並且 -v 旗標可以同時下很多次
  • $ docker run -d -P --name web -v <host path>:<container path> training/webapp python app.py
  • Read Only
  • $ docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py

    當加上 ro 選項時,表示 Container 內的綁定目錄是唯讀

  • 使用自定義的 volume

  • $ docker run -d -P --volume-driver=flocker -v my-named-volume:/opt/webapp --name web training/webapp python app.py
    #or
    $ docker volume create -d flocker --name my-named-volume -o size=20GB
    $ docker run -d -P -v my-named-volume:/opt/webapp --name web training/webapp python app.py

    如果 -v 參數後面放的格式是 <volume name>:<container path> 的話,那 docker 會為我們建立一個 volume 並且放在 /var/lib/docker/volumes底下,就跟我們只有指定 container 內的位置是一樣的

  • Creating and mounting a data volume container

  • 新增一個被命名且帶有 volume 的 Container,雖然這 Container 內的應用程式並不會被執行

    $ docker create -v /dbdata --name dbstore training/postgres /bin/true

    然後我們就可以在啟動 Container 的時候使用 --volumes-from 參數將剛建立的 Data Volume Container 帶進去

  • $ docker run -d --volumes-from dbstore --name db1 training/postgres

    並且還可以

  • $ docker run -d --name db2 --volumes-from db1 training/postgres

    這樣子就能直接將某個 Container 所用到的 Volumes 直接套用在其他的 Container 上面了,並且共享 Container 間的資料

  • Backup, restore, or migrate data volumes
  • 這指令把 /dbdata 裡的東西打包後放在 backup 的資料夾內,並且因為 backup 資料夾與本機當前的目錄是連通的,所以在本機當前目錄也會取得備份檔

    $ docker create -v /dbdata --name dbstore training/postgres /bin/true
    $ docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata

    這指令會讓資料復原回來

  • $ docker run -v /dbdata --name dbstore2 ubuntu /bin/bash
    $ docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1"

    其實就是東西透過 Container 移來移去而已

  • Removing volumes

  • $ docker run --rm -v /foo -v awesome:/bar busybox top

    因為有參數 --rm 的關係,所以當 busybox 因為不再運作而被自動刪除時本機對應到 Container 內 /foo 的 volume 也會自動被刪除,但是被命名為 awesome 的 volume 卻還會留著

  • 如果已在執行的 Container 並沒有設定任何的 volume ,卻需要對容器內的資料進行匯入或匯出時該怎麼辦呢

    使用 docker cp 指令就行了,例如:
  • $ docker cp <Container Name or ID>:<Container Source Path> <Host Destination Path> #將 Container 的資料匯出
    $ docker cp <Host Source Path> <Container Name or ID>:<Container Destination Path> #將資料匯入到 Container

     

參考來源