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 須注意的事項:
- 不能重設掛載路徑。
- 要避免掛載多個 volumes 到相同路徑。
- 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
留言
張貼留言