Docker (5) Volumes

1. Volumes:

Volumes 是 Docker 一個開空間存放檔案的機制,主要分成 Bind mount volumes 和 Docker-managed volumes。

  • Bind mount volumes: 和 host 機的 filesystem 路徑對接。
  • Docker-managed volumes: 不會和 host 機的 filesystem 路徑對接。

2. Bind mount volumes:

把主機的路徑(/home/cooper) 掛載到 container 的路徑(/home/host)下:

$ sudo docker run -it \
 --rm \
 --name ubuntu1 \
 --hostname ubuntu1 \
 -v /home/cooper:/home/host \
 ubuntu

觀察 container 中的路徑,你會發現它連到主機的路徑去了,所以它們裡面有一樣的檔案。

ubuntu$ cd /home/host
ubuntu$ ls

由於主機和 container 是連動的,所以你在 container 的行為會影響到主機,假設你想要建立只讀的 Bind mount volumes 可以用 ro flag。

$ sudo docker run -it \
 --rm \
 --name ubuntu1 \
 --hostname ubuntu1 \
 -v /home/cooper:/home/host:ro \
 ubuntu

這樣可以確保你主機的檔案不會被修改到。


3. Docker-managed volumes:

Docker-managed volumes 和 Bind mount volumes 差不多,差別只在於 Docker-managed volumes 不會和 host 機的 filesystem 路徑對接。

$ sudo docker run -it \
 --rm \
 --name ubuntu1 \
 --hostname ubuntu1 \
 -v /home/managed \
 ubuntu

再觀察一下我們創造出來的路徑,這次路徑內是空的。

ubuntu$ cd /home/managed/
ubuntu$ ls

4. Sharing volumes:

看完上面的例子,你應該很困惑會決得 Docker-managed volumes 一點用都沒有,只是建立一個資料夾出來而已。 其實所有的 Volumes 是可以被共享的,如果你想再容器間建立一個共享空間並不想影響主機上的檔案,你就可以把 Docker-managed volumes 分享出去。

先開一台名為 ubuntu1 的 cotainer,並建立一個名為 /home/share 的 Docker-managed volumes。

$ sudo docker run -it \
 --rm \
 --name ubuntu1 \
 --hostname ubuntu1 \
 -v /home/share \
 ubuntu

再開一個名為 ubuntu2 的 container,我們指定它要使用 ubuntu1 所提供的 Volume。

$ sudo docker run -it \
 --rm \
 --name ubuntu2 \
 --hostname ubuntu2 \
 --volumes-from ubuntu1 \
 ubuntu

試著在 ubuntu2 的共享路徑下建立檔案。

ubuntu2$ cd /home/share
ubuntu2$ touch hello.txt 

你會發現 ubuntu1 的共享路徑下會有一樣的檔案。

ubuntu1$ cd /home/share
ubuntu1$ ls 

host 上可以用指令看到這個 Volume。

$ sudo docker volume ls

5. 使用 --volumes-from 須注意的事項:

  1. 不能重設掛載路徑。
  2. 要避免掛載多個 volumes 到相同路徑。
  3. volumes 的讀寫權限不能重設。

6. Create volumes:

反過來先建立一個 volume 再分享出去也是可行的。

先在 host 上建立一個名為 my-vol 的 volume。

$ sudo docker volume create my-vol
$ sudo docker volume ls

建立兩個使用 my-vol 的 container,這兩個 container 的 /vol 是連通到 my-vol。

$ sudo docker run -it \
 --rm \
 --name ubuntu1 \
 --hostname ubuntu1 \
 -v my-vol:/vol \
 ubuntu
$ sudo docker run -it \
 --rm \
 --name ubuntu2 \
 --hostname ubuntu2 \
 -v my-vol:/vol \
 ubuntu

最後來把 my-vol 刪掉。

$ sudo docker volume rm my-vol 

留言

熱門文章