共計 3658 個字符,預計需要花費 10 分鐘才能閱讀完成。
這篇文章給大家分享的是有關 docker 中如何管理容器數據的內容。丸趣 TV 小編覺得挺實用的,因此分享給大家做個參考,一起跟隨丸趣 TV 小編過來看看吧。
主要有兩種方法來管理 docker 數據。
Data volumes, and
Data volume containers.
數據卷的作用:
Data volumes
A data volume is a specially-designated directory within one or more containers that bypasses the Union File System to provide several useful features for persistent or shared data(在一個或多個容器中一個特別指定的目錄,通過繞過聯合文件系統提供多個有用的特性用于儲存或共享數據):
Data volumes can be shared and reused between containers(可分享,可重用)
Changes to a data volume are made directly(直接的更改)
Changes to a data volume will not be included when you update an image(當你更新鏡像時,對 volume 的更改不會被包含其中)
Volumes persist until no containers use them(保存至容器不再使用它)
實質:不就是一個目錄嘛
實踐:
使用 - v 在容器內增加一個數據卷(即 /webapp 目錄):
docker run -d -P --name web -v /webapp training/webapp python app.py
進入容器查看(需要先安裝 nsenter,這里我用了腳本):
root@docker:~# accessdock
Please input the specific container s name:web
root@831a05306ec7:/# ls
bin dev home lib64 mnt proc run selinux sys usr webapp
boot etc lib media opt root sbin srv tmp var
root@831a05306ec7:/#
可以看到在容器根目錄下多了一個 webapp 文件夾。
關于在 dockerfile 中的用法(使用 VOLUME)標識:
You can also use the VOLUME instruction in a Dockerfile to add one or more new volumes to any container created from that image.
使用 - v 掛載本地目錄到容器內作為數據卷(如果該目錄不在,docker 會自動創建):
PS: 在我的試驗中,官方手冊中這個命令會導致容器自己退出,把 /opt 更改為其他目錄就不會出問題了:
docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
看看效果:
root@docker:~# docker run -d -P --name web -v /src/webapp:/webapp training/webapp python app.py # : 前的是本地目錄,: 后的是容器內目錄
a1c6d9d20eb47a77e526d8b6f8af2926a253afd9112ec32480b5c060fceceff7
root@docker:~# cd /src/webapp/
root@docker:/src/webapp# ls
root@docker:/src/webapp#
我的宿主機本來沒有 /src/webapp 目錄,但是 docker 自動創建了它。
先進入容器看看:
root@docker:~# accessdock
Please input the specific container s name:web
root@7d201fd35578:/# ls
bin dev home lib64 mnt proc run selinux sys usr webapp
boot etc lib media opt root sbin srv tmp var
root@7d201fd35578:/# cd webapp/
root@7d201fd35578:/webapp# touch hellp
root@7d201fd35578:/webapp# ls
hellp
root@7d201fd35578:/webapp# exit
logout
root@docker:~# cd /src/webapp/
root@docker:/src/webapp# ls
hellp
通過這樣的試驗,可以了解到數據卷的共享特性。在容器內的數據卷創建文件,宿主機上也會看到。
默認情況下,容器對這個目錄是可讀可寫的。如果你想讓容器對 /src/webapp 只有讀屬性,使用以下命令:
docker run -d -P --name web -v /src/webapp:/webapp:ro training/webapp python app.py
在容器目錄后加上一個 :ro 即可。
當我想從容器刪除 hellp 文件時,提示只能讀:
root@08fae41a534b:/webapp# rm hellp
rm: cannot remove `hellp : Read-only file system
在容器之間共享數據卷:
在某些情況下,需要為多個容器提供共享數據,你可以啟動一個數據卷容器并把數據掛載到此。這樣一來,其他連接到此數據卷容器的容器都可以訪問那些被掛載的數據。在這里,我先啟動一個數據卷容器并把主機的 /var/data 掛載上去。再啟動其他容器,使他們能訪問數據卷容器的共享數據卷。
啟動數據卷容器:
docker run -d -p 1000:5000 -v /var/data:/data --name data1 training/webapp python app.py
啟動一個附加容器:
docker run -d -p 2000:5000 --volumes-from data1 --name data2 training/webapp python app.py
這里我們使用了 –volumes-from 標識(指定數據卷容器),把它和 data1 連接起來,因此,在 data2 中也會有相同的 /data 目錄。
進行驗證:
root@docker:/var/data# mkdir test
root@docker:/var/data# touch test/hello
root@docker:/var/data# ls # 在數據卷中創建點東西
abc test
root@docker:/var/data# ls test/
hello
root@docker:/var/data# accessdock
Please input the specific container s name:data1
root@9795da386459:/# cd /data
root@9795da386459:/data# ls
abc test
root@9795da386459:/data# cd test/
root@9795da386459:/data/test# ls # 在 data1 上也能訪問
hello
root@9795da386459:/data/test#
root@9795da386459:/data/test# exit
logout
root@docker:/var/data# accessdock
Please input the specific container s name:data2
root@2b383ccacd05:/# cd data/
root@2b383ccacd05:/data# ls
abc test
root@2b383ccacd05:/data# cd test/
root@2b383ccacd05:/data/test# ls # 在 data2 上也能訪問
hello
當你刪除掛載卷的 data1 容器,包括初始化數據化容器,或者隨后的容器,該卷將不會被刪除, 直到沒有容器使用該卷。這允許你升級,或者把有效的數據卷在容器之間遷移。
思考:我嘗試把可執行文件放到共享數據卷中,設置了 read-only。但是依然能在容器中執行該文件。恐怕這在生產環境中是個問題可能出現的地方,必須采取限制訪問等方式,即使容器的操作對主機構成威脅,也可以保護主機不受影響。這個問題必須得到重視。
感謝各位的閱讀!關于“docker 中如何管理容器數據”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!