在很早的一篇帖子裏 dockone.io/question/24 就有人問:「請教下代碼放在 Docker 裏面仍是外面呢」多數人評論相似下面的觀點:java
因爲開發環境代碼一直在變更,並且多人經過 git 協做,因而代碼都是放在外面,構建一個運行環境的 image,而後代碼部分用 volume 映射進去,方便隨時調整。git
個人觀點也是這樣的,目前我學習的 docker 更多的是本地開發使用,還未到測試或者真實環境下部署的時候,因此我目前贊同將 docker 做爲部署開發環境使用,而後將代碼和數據庫用 volume 映射到容器中。web
因此今天的文章話題是:學習 Docker Volumedocker
A volume is a specially-designated directory within one or more containers that bypasses the Union File System. Volumes are designed to persist data, independent of the container’s life cycle. Docker therefore never automatically delete volumes when you remove a container, nor will it 「garbage collect」 volumes that are no longer referenced by a container. Also known as: data volume數據庫
There are three types of volumes: host, anonymous, and named:tomcat
A host volume lives on the Docker host’s filesystem and can be accessed from within the container.bash
A named volume is a volume which Docker manages where on disk the volume is created, but it is given a name.app
An anonymous volume is similar to a named volume, however, it can be difficult, to refer to the same volume over time when it is an anonymous volumes. Docker handle where the files are stored.webapp
主要有兩種參數方式掛載,一種是 -v,另外一種是建立數據卷容器,以--volumes-from 掛載。ide
-v [host-dir]:[container-dir]:[rw|wo]複製代碼
其中,
· host-dir:表示主機上的目錄,若是不存在,Docker 會自動在主機上建立該目錄。
· container-dir:表示容器內部對應的目錄,若是該目錄不存在,Docker 也會在容器內部建立該目錄。
· rw|ro:用於控制卷的讀寫權限。
因此[host-dir]:[container-dir] 一共就有四種組合,其中 container-dir 有沒有存在,先不作嘗試考慮。
1、假如不指定 host-dir,咱們看看:
docker run -it -p 8890:8080 --rm -v /usr/local/tomcat/webapps --name test1 tomcat:8.0複製代碼
接着使用查看容器中掛載數據卷的狀況:
docker inspect test1複製代碼
這時候看到的掛載的路徑是臨時的;而容器中對應的目錄,也沒有被覆蓋:
2、假如指定了 host-dir,咱們來看看:
docker run -it -d -p 8891:8080 --rm -v /Users/ye/docker/learning/javademo/volume2:/usr/local/tomcat/webapps --name test2 tomcat:8.0複製代碼
接着使用查看容器中掛載數據卷的狀況:
docker inspect test2複製代碼
能夠看出,將主機本地的文件夾掛在上去了:
這時候咱們能夠看到,在容器中對應的目錄下的文件,和主機目錄下的保持一致了
若是在主機中增長一個文件 world.java,咱們再看看:
保持一致了!
不少時候,咱們會將一些相關的容器部署到同一個主機上,這時候但願這些容器之間能夠共享一些數據。這時,咱們能夠建立一個數據卷容器,而後就能夠供多個容器掛載使用了。
這裏我就不繼續往下進行闡述了,由於我學到 Docker Volume 還沒真正使用過數據卷容器,因此沒有發言權,等我使用過了,我將補充這方面的學習內容。
主要有create、inspect、ls、prune、rm這幾個命令,其中拿 ls 舉個例子。
List volumes
顯示全部數據卷
命令:
docker volume ls [OPTIONS]複製代碼
如:
其中:[OPTIONS] 命令:
Name, shorthand | Default | Description |
---|---|---|
--filter, -f | Provide filter values (e.g. ‘dangling=true’) | |
--format | Pretty-print volumes using a Go template | |
--quiet, -q | false | Only display volume names |
具體其它的幾個個命令,都比較簡單:
Command | Description |
---|---|
docker volume create | Create a volume |
docker volume inspect | Display detailed information on one or more volumes |
docker volume ls | List volumes |
docker volume prune | Remove all unused volumes |
docker volume rm | Remove one or more volumes |
更多參考官網說明:docs.docker.com/engine/refe…
雖然在學習過程當中,發現使用 -v 的掛載方式要多於使用數據卷容器的方式,主要是由於在本地學習爲主,或者以單項目開發爲主。但在現實產品開發中,我相信用--volume from 的方式會不少,尤爲是生產環境下。有待於咱們繼續學習,也但願有人能提點我~~~,萬謝!
coding01 期待您關注
也很感謝您能看到這了