tft每日頭條

 > 科技

 > docker容器技術及管理

docker容器技術及管理

科技 更新时间:2025-01-09 17:12:40
概述

docker 主要有兩種數據存儲形式, 一種是storage driver(也叫做 Graph driver), 另一種是 volume driver. stroage driver主要是存儲那些無狀态的數據, 寫入密集型的場景應該使用 volume driver.

storage driver

容器運行的文件系統是鏡像層和容器層組成的, 一層一層疊加, 隻有最上面的那層是可寫的, 其他層都是隻讀的. Docker通過Union FS技術支持文件的讀寫和新建, Docker 采用插件式的方式支持多種Union FS實現, 官方文檔中一般使用stroage driver術語, 目前已經有多種實現的插件, 比如: aufs/overlay/overlay2/devicemanger等等.

boot2docker 缺省使用的storage-driver 為 aufs, 下面命令将創建一個使用 overlay2 的 storage driver docker運行環境.

docker-machine create --driver virtualbox --engine-storage-driver overlay2 test2

正式的docker 環境, 需要修改 /etc/docker/daemon.json 文件

{ "storage-driver": "btrfs" }

幾個查詢storage driver的命令:

docker info 命令, 查詢docker運行環境使用的storage-driver.

docker image inspect 命令,查看鏡像使用的存儲driver.

docker container inspect 命令,查看容器使用的存儲driver.

volume driver

volume driver 經常用來實現數據持久化和文件共享功能, 具體有兩種存在方式, 分别是:

1. bind mount 方式:

是将host的目錄或文件直接mount到容器中, host的目錄或文件既可以容器運行之前就已存在的, 也可以是在容器運行之前不存在的.

如果在docker run 命令中采用了 -v /host/dir_or_file:/container/dir_or_file的形式, 就是bind mount方式, 即指定了host的挂載點的絕對路徑.

2. volume 方式

是由 Docker 管理, 該volume最終存儲到host的 /var/lib/docker/volumes 下. volume 方式還分為 named volume 和 Anonymous volume.

named volume 有兩種創建方法,

(1) docker run 命令中采用了 -v one_volume_name:/container/dir_or_file , 這裡的one_volume_name不是host中的絕對路徑, 而是一個名稱.

(2) 通過 docker volume create 創建的, 該命令支持更多的選項, 推薦使用.

匿名volume方式 是通過 docker run 命令中傳入了 -v /container/dir 類型的參數.

3. bind mount 方式和volume方式的簡單對比:

bind mount方式, docker容器直接訪問host的目錄或文件, 性能是最好的.

bind mount方式, docker容器直接訪問host的目錄或文件, 對于該host絕對目錄可能會引入權限問題. 如果容器僅需要隻讀訪問權限, 最好是顯式設定隻讀方式.

對于 volume方式, 如果host中落地目錄為空, docker先将容器中的對應目錄複制到host下, 然後再進行挂載操作; 對于bind mount方式, 挂載之前沒有複制操作.

容器要依賴host主機的一個絕對路徑, 使得容器的移植性變差, docker 官方并不推薦這個方法, 而是推薦使用volume.

docker容器技術及管理(詳解docker容器數據持久化和數據共享)1

docker容器技術及管理(詳解docker容器數據持久化和數據共享)2

幾個示例說明:

docker run -d --name web0 -v myetc:/etc busybox /bin/sh -c "while true; do echo hello world; sleep 1; done" #創建了一個named volume, 該volume 在 /var/lib/docker/volume/myetc 下. docker run -d --name web1 -v /etc busybox /bin/sh -c "while true; do echo hello world; sleep 1; done" #創建了一個匿名的volume, 該volume在/var/lib/docker/volume父目錄下, 具體子目錄不确定, #比如 /var/lib/docker/volume/9170d32e15b7578240afde81d5514637beece7d469b7ea253e23759a23b0a397 docker run -d --name web2 -v /etc2:/etc busybox /bin/sh -c "while true; do echo hello world; sleep 1; done" #使用 bind mount 方式, host上的目錄為 /etc2

docker run 命令的--volume 和 --mount 參數

--volume 和 --mount 兩種參數寫法都支持上述volume和bind mount方式, --mount 采用key-value的寫法, 支持更多的設置選項, docker 新版更加推薦使用 --mount 參數寫法, 但 --volume 寫法更加簡潔, 仍然給廣泛使用.

另一種推薦的volume寫法是, 顯式地使用 docker volume create 命令創建 named volume,

有了上面的知識, 很容易就能實現容器和Host之間共享數據. 對于同一Host下多個容器共享數據, 直接docker run -v參數非常不方便, 最好是使用 data container作為橋梁. 一般data container 不啟任何應用, 也不需要将容器真正運行起來, 僅僅是挂載一下 volume, data container除了用于多個容器之間數據共享之外, 也可用于volume的備份和恢複.

data container和volume的備份恢複

#創建一個名 為 dbstore 的數據容器, 設置一個匿名的/dbdata volume. docker create -v /dbdata --name dbstore busybox /bin/sh #創建一個名為 web3 的應用容器, 将 dbstore 數據容器的volume 挂載過來. docker run -d --name web3 --volumes-from dbstore busybox /bin/sh -c "while true; do echo hello world; sleep 1; done" #備份數據容器 dbstore 的/dbdata目錄到容器到host的host_backup目錄下, 最終在host上的文件名為 /host_backup/backup.tar docker run --rm --volumes-from dbstore -v /host_backup:/backup busybox tar -cvf /backup/backup.tar /dbdata #恢複數據容器dbstore 的/dbdata目錄, 數據源為host上的文件 /host_backup/backup.tar docker run --rm --volumes-from dbstore -v /host_backup:/backup busybox /bin/sh -c "cd /dbdata && tar -xvf /backup/backup.tar --strip 1"


之所以介紹持久化概念,是因為docker的容器設計理念是可以即開即用,用完可以随意删除,而新建容器是根據鏡像進行渲染,容器的修改是不會影響到鏡像,但是有時候容器裡面運行的産生的數據(如mysql)或者配置項(如nginx的nginx.conf)我們又需要保存起來的,因而我們需要對容器某些修改的數據進行挂載,也就是把這些數據持久化。

後面會分享更多關于devops和DBA内容,感興趣的朋友可以關注下!!

docker容器技術及管理(詳解docker容器數據持久化和數據共享)3

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved