日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

docker 保存 环境持久化_Docker深入浅出系列 | 容器数据持久化

發布時間:2024/3/13 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 docker 保存 环境持久化_Docker深入浅出系列 | 容器数据持久化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Docker深入淺出系列 | 容器數據持久化

Docker已經上市很多年,不是什么新鮮事物了,很多企業或者開發同學以前也不多不少有所接觸,但是有實操經驗的人不多,本系列教程主要偏重實戰,盡量講干貨,會根據本人理解去做闡述,具體官方概念可以查閱官方教程,因為本系列教程對前一章節有一定依賴,建議先學習前面章節內容。

教程目的:

了解Docker怎么實現數據存儲

了解Docker數據掛載方式是什么

了解Docker數據持久化怎么使用

了解Docker不同數據掛載方式的使用場景

Docker數據存儲方式

Docker容器對于宿主機器來說只是一個運行在Linux上的應用,因此它的數據存儲還是會依賴宿主機器,Docker是通過掛載宿主機文件系統或內存的方式來實現數據存儲的,掛載方式有三種:volume、bind mount和tmpfs。

volumes - 在宿主的文件系統上的docker工作路徑下創建一個文件夾(/var/lib/docker/volumes)來存儲數據,其他非docker進程是不能修改該路徑下的文件,完全由docker來管理

bind mounts - 可以存儲在宿主機器任何一個地方,但是會依賴宿主機器的目錄結構,不能通過docker CLI 去直接管理,并且非docker進程和docker進程都可以修改該路徑下的文件

tmpfs - 無論是在Docker主機上還是在容器內,tmpfs掛載都不會持久保存在磁盤上,它會將信息存儲在宿主機器內存里。 容器在其生存期內可以使用它來存儲非持久狀態或敏感信息。 例如,在內部,swarm services 使用tmpfs掛載將機密掛載到服務的容器中 或者 我們一些不需要持久化數據的開發測試環境,可以使用tmpfs

Volumes初體驗

Volumes 是Docker推薦的掛載方式,與把數據存儲在容器的可寫層相比,使用Volume可以避免增加容器的容量大小,還可以使存儲的數據與容器的生命周期獨立。

與bind mounts相比,volumes更易于備份或遷移。

您可以使用Docker CLI命令或Docker API管理Volumes。

volumes在Linux和Windows容器上均可工作。

可以在多個容器之間更安全地共享volumes。

volumes驅動程序使您可以將volumes存儲在遠程主機或云提供程序上,以加密volumes內容或添加其他功能。

Volumes實戰

通過默認-v方式

默認情況下,docker會幫我們創建一個隨機命名的volume

1.利用我們前面章節下載的image,創建一個容器,命名為mysql01

[root@localhost /]# docker run -d --name mysql01 -e MYSQL_ROOT_PASSWORD=evan123 mysql

4dc868313a330840a833d78a1a88462bcfa4562f61f7da5dcecc9a57290bcb82

2.我們可以看看容器到底有沒有自動幫我們創建一個volumes

[root@localhost /]# docker volume ls

DRIVER VOLUME NAME

local cc439258feb4817e1ecfa1f6969613f3e84be9a4499819ec7386f7e443eb6c54

通過上面的輸出結果可以看到,docker 默認幫我創建了一個volume,并且隨機起了一個看不懂的名字

3.通過docker inspect查看volume詳細信息

[root@localhost /]# docker inspect cc439258feb4817e1ecfa1f6969613f3e84be9a4499819ec7386f7e443eb6c54

[

{

"CreatedAt": "2020-02-26T07:39:49Z",

"Driver": "local",

"Labels": null,

"Mountpoint": "/var/lib/docker/volumes/cc439258feb4817e1ecfa1f6969613f3e84be9a4499819ec7386f7e443eb6c54/_data",

"Name": "cc439258feb4817e1ecfa1f6969613f3e84be9a4499819ec7386f7e443eb6c54",

"Options": null,

"Scope": "local"

}

]

從上面volume詳情可以了解到,現在容器的數據是掛在在宿主機器上 /var/lib/docker/目錄下, scope是本地

4.通過-v指定容器volume的名字,使用我們自定義的一個可讀的名字

[root@localhost /]# docker run -d --name mysql02 -v evan_volume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=evan124 mysql

4d51b14837ab8564b878043420ea923565bafe90880eaa7bf362dbc35c7f756c

5.再次查看下volume是否創建成功

[root@localhost /]# docker volume ls

DRIVER VOLUME NAME

local cc439258feb4817e1ecfa1f6969613f3e84be9a4499819ec7386f7e443eb6c54

local evan_volume

剛才創建的volume已經成功了

6.再查看下volume的詳細信息

[root@localhost /]# docker inspect evan_volume

[

{

"CreatedAt": "2020-02-26T11:00:02Z",

"Driver": "local",

"Labels": null,

"Mountpoint": "/var/lib/docker/volumes/evan_volume/_data",

"Name": "evan_volume",

"Options": null,

"Scope": "local"

}

]

從上面信息可以看到,容器已經成功掛載宿主機器上的evan_volume

通過--mount方式

-v能做的--mount指令都可以做,與-v指令對比,--mount指令更靈活,支持更多復雜操作,并且不需要嚴格按照參數順序,通過key value鍵值對方式進行配置,可讀性更高。

--mount有以下幾個參數:

type - type可以是bind、volume或者tmpfs,默認是volume

source - 宿主機上的目錄路徑,可以用縮寫src

destination - 目標路徑,容器上掛載的路徑,可以用dst或者 target

readonly - 可選項,如果設置了,那么容器掛載的路徑會被設置為只讀

volume-opt - 可選項,當volume驅動接受同時多個參數作為選項時,可以以多個鍵值對的方式傳入

1.創建一個容器,命名為mysql-mount,指定volume名為mysql-mount

[root@localhost /]# docker run --name mysql-mount -e MYSQL_ROOT_PASSOWRD=evan123 --mount type=volume,source=mysql-mount,target=/var/lib/mysql mysql

2020-02-26 12:09:37+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.19-1debian9 started.

2020-02-26 12:09:37+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'

2020-02-26 12:09:37+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.19-1debian9 started.

2020-02-26 12:09:37+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified

You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD

2.查看volume是否創建成功

[root@localhost /]# docker volume ls

DRIVER VOLUME NAME

local cc439258feb4817e1ecfa1f6969613f3e84be9a4499819ec7386f7e443eb6c54

local evan_volume

local mysql-mount

local myvol2

local myvol3

從上面查詢結果可以看出來,mysql-mount已經創建成功

3.查看宿主機器是否存在對應的目錄

"Mounts": [

{

"Type": "volume",

"Name": "mysql-mount",

"Source": "/var/lib/docker/volumes/mysql-mount/_data",

"Destination": "/var/lib/mysql",

"Driver": "local",

"Mode": "z",

"RW": true,

"Propagation": ""

}

]

從輸出結果可以看到,通過--mount可以實現跟-v同樣的操作結果,數據也綁定宿主機器上docker路徑對應目錄

bind mounts初體驗

與volumes相比,bind mount的功能有限。 使用綁定安裝時,會將主機上的文件或目錄安裝到容器中。 文件或目錄由主機上的完整或相對路徑引用。 相比之下,當您使用volume時,將在主機上Docker的存儲目錄中創建一個新目錄,并且Docker管理該目錄的內容。

該文件或目錄不需要在Docker主機上已經存在。 如果尚不存在,則按需創建。 bind mounts性能非常好,但是它們依賴于具有特定目錄結構的主機文件系統。 如果要開發新的Docker應用程序,請考慮使用命名volume。 您不能使用Docker CLI命令直接管理bind mounts

1.創建一個tomcat容器,命名為tomcat-bind,掛載宿主機器路徑為/tmp

[root@localhost /]# docker run -d --name tomcat-bind --mount type=bind,source=/tmp,target=/user/local tomcat

3dab7d9f469b231ff68072ff8b910e25270c1ab28a944efc0a2b0c9c321e57df

2.通過docker inspect tomcat-mount查看容器信息

"Mounts": [

{

"Type": "bind",

"Source": "/tmp",

"Destination": "/user/local",

"Mode": "",

"RW": true,

"Propagation": "rprivate"

}

],

可以看到容器已經成功掛載到宿主機器上的/tmp目錄,而不是前面我們演示的docker管理路徑下

tmpfs初體驗

使用tmpfs不會持久化數據,數據只會存放在宿主機器內存中

1.創建一個tomcat容器,命名為tomcat-tmps,指定掛載方式為temps

[root@localhost /]# docker run -d --name tomcat-tmpfs --mount type=tmpfs,target=/tmp tomcat

fdf6c8a7ae067db01ed97dc3c3a6903f615a8b687e9b06cd70218a0e8a2d6bf4

2.我們通過docker container inspect tomcat-tmpfs查看下是否會創建任務目錄在宿主機器

"Mounts": [

{

"Type": "tmpfs",

"Source": "",

"Destination": "/tmp",

"Mode": "",

"RW": true,

"Propagation": ""

}

],

從上面輸出結果可以看到,宿主機器上并沒有任何目錄,只是在目標路徑也就是容器里指定了/tmp作為數據存儲路徑

驗證docker數據存儲

思路:我們嘗試在mysql容器創建一個數據庫,然后退出后把容器刪除掉,再創建一個新的容器,數據存儲路徑指向同一個volume,觀察是否在新的容器可以看到上一個容器創建好的數據庫

1.進入我們上面創建的mysql

[root@localhost /]# docker exec -it mysql01 bash

2.創建數據庫eshare

mysql> create database eshare

-> ;

Query OK, 1 row affected (0.00 sec)

mysql> show databases;

+--------------------+

| Database |

+--------------------+

| eshare |

| information_schema |

| mysql |

| performance_schema |

| sys |

+--------------------+

5 rows in set (0.00 sec)

從輸出結果可以看到,數據庫已經創建成功

3.退出容器,刪除mysyql01容器

mysql> exit

Bye

root@4dc868313a33:/# exit

exit

[root@localhost /]# docker container rm -f mysql01

mysql01

容器mysql01已經順利刪除

4.查看mysql01掛載的volume是否還在

[root@localhost /]# docker volume ls

DRIVER VOLUME NAME

local cc439258feb4817e1ecfa1f6969613f3e84be9a4499819ec7386f7e443eb6c54

local evan_volume

local mysql-mount

local myvol2

local myvol3

可以看到,對應的volume還在

DRIVER VOLUME NAME

local cc439258feb4817e1ecfa1f6969613f3e84be9a4499819ec7386f7e443eb6c54

5.創建一個新mysql容器,命名為mysql-volume,并且綁定mysql01的volume

[root@localhost /]# docker run -d --name mysql-volume -v cc439258feb4817e1ecfa1f6969613f3e84be9a4499819ec7386f7e443eb6c54:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=evan123 mysql

360127340b462c3539f158c776aef03fd8f58c5a2aafdd622e0f1c161a1bd189

6.驗證新的容器mysql-volume 中,是否存在已經創建好的數據庫eshare

[root@localhost /]# docker exec -it mysql-volume bash

root@360127340b46:/# mysql -uroot -pevan123

mysql> show databases;

+--------------------+

| Database |

+--------------------+

| eshare |

| information_schema |

| mysql |

| performance_schema |

| sys |

+--------------------+

5 rows in set (0.00 sec)

從上面輸出結果可以看到,新的容器已經存在之前創建好的數據庫,這就證明了docker不僅可以持久化數據,并且不同容器還可以共享同一個volume。

有興趣的朋友,歡迎加我公眾號一起交流,有問題可以留言,平時工作比較忙,我也抽時間盡量回復每位朋友的留言,謝謝!

總結

以上是生活随笔為你收集整理的docker 保存 环境持久化_Docker深入浅出系列 | 容器数据持久化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。