docker有四種儲存方式:1、“預設儲存”,資料保存在運行的容器中,容器刪除後,資料也隨之刪除;2、“volumes資料卷”;3、“bind mounts掛載”,直接掛載主機檔案系統的任何目錄或檔案;4、“tmpfs mount”。
本教學操作環境:linux5.9.8系統、docker-1.13.1版、Dell G3電腦。
docker容器的幾種儲存方式
#容器的儲存可以分為兩大類別:
#一種是與映像相關的即我們在《docker容器技術基礎之聯合檔案系統OverlayFS》一文提到的容器層Copy-On-Write特性。預設情況下,在容器內建立的所有檔案都儲存在可寫入容器層上,這種直接將檔案儲存在容器層的方式資料難以持久化和共享,由於依賴儲存驅動程式與使用直接寫入主機檔案系統的資料卷相比,這種額外的抽象會降低效能。
另一中是宿主機儲存即透過將宿主機目錄綁定或掛在容器中使用,容器停止後資料也能持久化。主要介紹後者。
幾種儲存掛載方式
這裡我們根據資料儲存在Docker 主機上的不同位置繪製如下圖:
docker四種儲存方式:預設、volumes資料磁碟區、bind mounts掛載、tmpfs mount(僅在linux環境中提供),其中volumes、bind mounts兩種實作持久化容器資料。
1.預設儲存
資料保存在運行的容器中,容器刪除後,資料也隨之刪除
2. bind mounts
綁定掛載與磁碟區相比,功能有限。使用綁定掛載時,主機上的檔案或目錄會掛載到容器中。檔案或目錄由其在主機上的完整路徑引用。目錄不需要已經存在於 Docker 主機上,如果不存在,docker會幫我們建立。注意一下,只能自動建立目錄哦。
我們透過-v 選項綁定掛載一個目錄/nginx/html 到容器看看
docker run -dt -v /nginx/html:/usr/share/nginx/html --name nginx nginx
透過docker inspect nginx 查看容器Mounts欄位
"Mounts": [ { "Type": "bind", "Source": "/nginx/html", "Destination": "/usr/share/nginx/html", "Mode": "", "RW": true, "Propagation": "rprivate" } ],
接著我們在docker主機上建立一個index.html並寫入hello nginx,然後存取容器IP,顯然我們的掛載已經生效了。
[root@localhost ~]# echo "hello nginx" > /nginx/html/index.html [root@localhost ~]# curl 172.17.0.4 hello nginx
這裡有一個問題,我們可以透過docker主機修改檔案來使容器內檔案生效,反過來也一樣,容器可以修改、建立和刪除主機檔案系統上的內容。處理這個問題我們可以在建立容器的時候配置掛載目錄的權限,例如下面的唯讀權限:
docker run -dt -v /nginx/html:/usr/share/nginx/html:ro --name nginx nginx
所以在我們使用綁定掛載的時候,你操作的是主機檔案系統,你必須清楚如下:
你掛載的目錄包含哪些內容,以免對其他應用程式造成影響。
你的容器是否應該有權利操作這些目錄。
3.volumes資料卷
volume儲存卷由Docker 建立和管理,我們可以使用該docker volume create指令明確的建立卷,或在容器創建時創建卷。
[root@localhost ~]# docker volume create nginx_volume nginx_volume [root@localhost volumes]# docker inspect nginx_volume [ { "CreatedAt": "2021-08-12T01:58:04-04:00", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/nginx_volume/_data", "Name": "nginx_volume", "Options": {}, "Scope": "local" } ]
可以看到掛載點處於docker的根目錄/var/lib/docker/volumes下
透過docker volume rm/prune 清除單一或所有未再使用的捲,可以透過docker 指令來管理磁碟區是對比綁定掛載的一個優點。
[root@localhost ~]# docker volume ls DRIVER VOLUME NAME local owncloud-docker-server_files local owncloud-docker-server_mysql local owncloud-docker-server_redis [root@localhost ~]# docker volume prune WARNING! This will remove all local volumes not used by at least one container. Are you sure you want to continue? [y/N] y Deleted Volumes: owncloud-docker-server_files owncloud-docker-server_mysql owncloud-docker-server_redis Total reclaimed space: 199.4MB
在建立容器時如果未指定容器掛載的來源則docker會自動為我們建立一個匿名卷,同樣位於docker根目錄下。
[root@localhost volumes]# docker run -dt -v /usr/share/nginx/html --name nginx_with_volume nginx d25bdfce9c7ac7bde5ae35067f6d9cf9f0cd2c9cbea6d1bbd7127b3949ef5ac6 [root@localhost volumes]# docker volume ls DRIVER VOLUME NAME local d8e943f57d17a255f8a4ac3ecbd6471a735aa64cc7a606c52f61319a6c754980 local nginx_volume [root@localhost volumes]# ls /var/lib/docker/volumes/ backingFsBlockDev d8e943f57d17a255f8a4ac3ecbd6471a735aa64cc7a606c52f61319a6c754980 metadata.db nginx_volume
當我們建立掛載磁碟區之後,此時的儲存與bind mounts是一致,不過當docker 主機無法保證具有給定的目錄或檔案結構時,磁碟區可協助我們將docker 主機的配置與容器運作時分離。這樣一來當我們需要將資料從一台 Docker 主機備份、還原或遷移到另一台時,磁碟區就很方便了,可以脫離host path的限制。
在使用綁定掛載和磁碟區時我們要注意下面傳播覆蓋原則:
#掛載一個空磁碟區時:容器內目錄的內容會傳播(複製)到卷中。
綁定掛載或非空磁碟區時:容器內目錄的內容會被磁碟區或綁定的主機目錄覆寫。
4.tmpfs mount
tmpfs掛載僅適用於linux主機,當我們使用tmpfs掛載建立容器時,容器可以在容器的可寫入層之外創建文件。將資料保留在記憶體中,當容器停止時,寫入的資料也將被移除。主要用於臨時儲存不想保留在主機或容器可寫層中的敏感檔案。
透過--tmpfs選項掛載一個記憶體區塊。
docker run -dt --name busybox_tmpfs --tmpfs /etc/running busybox
透過--mount的方式帶上參數,指定暫存大小。
docker run -dt --name busybox_tmpfs2 --mount type=tmpfs,tmpfs-size=2048,destination=/etc/running busybox
儲存資料共享
#在容器之间共享数据主要有两种方法,第一种比较简单,只需要将目录或者volume挂载到多个容器中即可。这里不做赘述,我们来看一下通过中间容器实现共享的方式。
我们创建一个中间容器,包含绑定挂载目录和一个卷。
docker create -v /share:/volume1 -v /volume2 --name volume_share busybox
在我们需要共享的容器中通过选项--volumes-from拿过来用即可
docker run -d -t --volumes-from volume_share --name container1 busybox
我们inspect检查一下Mounts字段,此时container1已经挂载到了一个bind目录和一个volume
"Mounts": [ { "Type": "bind", "Source": "/share", "Destination": "/volume1", "Mode": "", "RW": true, "Propagation": "rprivate" }, { "Type": "volume", "Name": "21605e49a0ba90a1b952a32c1b3f0d42735da8bfe718f0dc76c37e91f1e51c0e", "Source": "/var/lib/docker/volumes/21605e49a0ba90a1b952a32c1b3f0d42735da8bfe718f0dc76c37e91f1e51c0e/_data", "Destination": "/volume2", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ],
推荐学习:《docker视频教程》
以上是docker儲存有哪幾種方式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

docker中rm和rmi的区别:rm命令用于删除一个或者多个容器,而rmi命令用于删除一个或者多个镜像;rm命令的语法为“docker rm [OPTIONS] CONTAINER [CONTAINER...]”,rmi命令的语法为“docker rmi [OPTIONS] IMAGE [IMAGE...]”。

docker官方镜像有:1、nginx,一个高性能的HTTP和反向代理服务;2、alpine,一个面向安全应用的轻量级Linux发行版;3、busybox,一个集成了三百多个常用Linux命令和工具的软件;4、ubuntu;5、PHP等等。

docker对于小型企业、个人、教育和非商业开源项目来说是免费的;2021年8月31日,docker宣布“Docker Desktop”将转变“Docker Personal”,将只免费提供给小型企业、个人、教育和非商业开源项目使用,对于其他用例则需要付费订阅。

docker容器重启后数据会丢失的;但是可以利用volume或者“data container”来实现数据持久化,在容器关闭之后可以利用“-v”或者“–volumes-from”重新使用以前的数据,docker也可挂载宿主机磁盘目录,用来永久存储数据。

docker能安装oracle。安装方法:1、拉取Oracle官方镜像,可以利用“docker images”查看镜像;2、启动容器后利用“docker exec -it oracle11g bash”进入容器,并且编辑环境变量;3、利用“sqlplus /nolog”进入oracle命令行即可。

AUFS是docker最早支持的存储引擎。AUFS是一种Union File System,是文件级的存储驱动,是Docker早期用的存储驱动,是Docker18.06版本之前,Ubuntu14.04版本前推荐的,支持xfs、ext4文件。

解决方法:1、停止docker服务后,利用“rsync -avz /var/lib/docker 大磁盘目录/docker/lib/”将docker迁移到大容量磁盘中;2、编辑“/etc/docker/daemon.json”添加指定参数,将docker的目录迁移绑定;3、重载和重启docker服务即可。

容器管理ui工具有:1、Portainer,是一个轻量级的基于Web的Docker管理GUI;2、Kitematic,是一个GUI工具,可以更快速、更简单的运行容器;3、LazyDocker,基于终端的一个可视化查询工具;4、DockStation,一款桌面应用程序;5、Docker Desktop,能为Docker设置资源限制,比如内存,CPU,磁盘镜像大小;6、Docui。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

WebStorm Mac版
好用的JavaScript開發工具

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能