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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

从零开始学习docker(九)持久化存储和数据共享之 Data Volume

發布時間:2024/9/16 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从零开始学习docker(九)持久化存储和数据共享之 Data Volume 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

擼了今年阿里、頭條和美團的面試,我有一個重要發現.......>>>

有些時候容器會產生一些數據,而我們不希望這些數據隨著容器的刪除而刪除。想保證數據的安全,一般用在數據庫。

首先看一下container和image的區別:

container容器是在image之上創建的,container layer可以讀寫數據,而image是只讀的,而我們在container中謝的數據僅限于在當前container中讀寫,如果把container停止和刪除,那么之前寫的文件和數據都刪除了,所以container是臨時存儲和保存數據的。

如果有這樣的需求:如果我們創建一個mysql數據庫的container,數據都是以文件的形式存儲在本地的,如果把mysql容器刪除,那么數據就被刪除了,這是不可取的。

docker引入了一個持久化的機制。

?

默認情況下會將數據寫入到Container Layer,但是我們可以通過持久化將數據存儲到Volume。即使容器被刪除了,那么只要Volume還在,我們數據就還在,被保存了下來。

Docker持久化數據方案:

  • 基于本地文件系統的Volume。可以在執行Docker create 或Docker run時,通過-v參數將主機的目錄作為容器的數據卷。這部分功能便是基于本地文件系統的volume管理。
  • 基于plugin的volume。支持第三方的存出方案,比如NAS,aws

?Volume的類型:

  • 受管理的data volume,由docker后臺自動創建。
  • 綁定掛在的Volume,具體掛在位置可以由用戶指定。

準備環境

創建一個mysql的container,

iie4bu@hostdocker:~$ docker run -d --name mysql-1 -e MYSQL_ALLOW_EMPTY_PASSWORD mysql 886583d9191dd8df6deed609f31e9e15ed854f83a85b4b47c335b04a441b55b3 iie4bu@hostdocker:~$ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

-e?MYSQL_ALLOW_EMPTY_PASSWORD表示使用空密碼

查詢鏡像發現沒有運行

查看日志:docker logs mysql-1

iie4bu@hostdocker:~$ docker logs mysql-1 error: 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

把這個鏡像刪除,重新創建。

先看一下我們本地是否有volume?

iie4bu@hostdocker:~$ docker volume ls DRIVER VOLUME NAME local 01d091f0bc6a045d10d56b5892dc55ccb2c6cda6b19cbcc8ca3c7adc9b3c477b local 0e4b3a8c4be019d86c855a773865e5472dbc0629a7b542d44fe5d132be07ee87

發現有很多,都是之前創建的。可以先刪除掉:

docker volume rm 01d091f0bc6a045d10d56b5892dc55ccb2c6cda6b19cbcc8ca3c7adc9b3c477b

小技巧:

? ? 可以刪除所有的volume:

docker volume rm $(docker volume ls -q)

重新創建mysql鏡像:

?iie4bu@hostdocker:~$ docker run -d --name mysql-1 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes mysql? 48ea258e299a6c74f0762e2bd5ff580422160d02ab600d26aec716ca983fc90e iie4bu@hostdocker:~$ iie4bu@hostdocker:~$ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 48ea258e299a mysql "docker-entrypoint.s…" 37 seconds ago Up 36 seconds 3306/tcp, 33060/tcp mysql-1 iie4bu@hostdocker:~$

現在可以看到mysql已經運行了,查看volume:

iie4bu@hostdocker:~$ docker volume ls DRIVER VOLUME NAME local 575c4038694e1abf8e883fc029813a745de6e5f412412eebec7c1a5b9c46e35d iie4bu@hostdocker:~$

這個就是mysql的volume

查看volume詳細信息:

iie4bu@hostdocker:~$ docker volume inspect 575c4038694e1abf8e883fc029813a745de6e5f412412eebec7c1a5b9c46e35d [{"CreatedAt": "2019-07-01T14:33:51+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/575c4038694e1abf8e883fc029813a745de6e5f412412eebec7c1a5b9c46e35d/_data","Name": "575c4038694e1abf8e883fc029813a745de6e5f412412eebec7c1a5b9c46e35d","Options": {},"Scope": "local"} ]

發現volume的數據是在/var/lib/docker/volumes/575c4038694e1abf8e883fc029813a745de6e5f412412eebec7c1a5b9c46e35d/_data路徑下。

我們再創建一個mysql:

iie4bu@hostdocker:~$ docker run -d --name mysql-2 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes mysql 200afb2c335e45bd76ad9b3b8d97f29a23972702ae2c4f82be9ebde1d619b644 iie4bu@hostdocker:~$ docker volume ls DRIVER VOLUME NAME local 54bbb749bc0b45dfa1de4eff8b94620e3184ade9633ffdeaeef230dbcd20c0cc local 575c4038694e1abf8e883fc029813a745de6e5f412412eebec7c1a5b9c46e35d

查看這個新的volume:

iie4bu@hostdocker:~$ docker volume inspect 54bbb749bc0b45dfa1de4eff8b94620e3184ade9633ffdeaeef230dbcd20c0cc [{"CreatedAt": "2019-07-01T14:50:46+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/54bbb749bc0b45dfa1de4eff8b94620e3184ade9633ffdeaeef230dbcd20c0cc/_data","Name": "54bbb749bc0b45dfa1de4eff8b94620e3184ade9633ffdeaeef230dbcd20c0cc","Options": {},"Scope": "local"} ]

實驗:如果將容器停止,是否volume是否還在:

先將mysql-1和mysql-2停止:

iie4bu@hostdocker:~$ docker container stop mysql-1 mysql-2 mysql-1 mysql-2

然后將mysql-1和mysql-2刪除:

iie4bu@hostdocker:~$ docker container rm mysql-1 mysql-2 mysql-1 mysql-2

確認我們本地沒有容器在運行:

iie4bu@hostdocker:~$ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES iie4bu@hostdocker:~$

但是volume還在:

iie4bu@hostdocker:~$ docker volume ls DRIVER VOLUME NAME local 54bbb749bc0b45dfa1de4eff8b94620e3184ade9633ffdeaeef230dbcd20c0cc local 575c4038694e1abf8e883fc029813a745de6e5f412412eebec7c1a5b9c46e35d iie4bu@hostdocker:~$

給volume起別名,方便以后好使用

先將上面的兩個volume刪除掉:

docker volume rm 54bbb749bc0b45dfa1de4eff8b94620e3184ade9633ffdeaeef230dbcd20c0cc docker volume rm 575c4038694e1abf8e883fc029813a745de6e5f412412eebec7c1a5b9c46e35d

新建一個mysql的容器,并且制定-v選項:

docker run -d -v mysql:/var/lib/mysql --name mysql-1 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes mysql 7a4ec8f6b8409c7877683d7cd7d2ce3bc85e029aab561b36aea3970a2e8ddcdb

-v 表示本地的volume是mysql,映射到容器中是/var/lib/mysql,查看volume:

docker volume ls DRIVER VOLUME NAME local mysql

進入mysql-1容器內部:

docker exec -it mysql-1 /bin/bash root@7a4ec8f6b840:/# mysql -u root Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 8.0.16 MySQL Community Server - GPLCopyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec)mysql> create database docker; Query OK, 1 row affected (0.01 sec)

添加了一個數據庫,名叫docker

然后退出容器,并將mysql-1容器停止,然后刪除:

docker container stop mysql-1 mysql-1 docker container rm mysql-1 mysql-1

但是我們使用docker volume ls 仍然可以看到mysql的volume

docker volume ls DRIVER VOLUME NAME local mysql

我們創建一個容器mysql-2,使用這個volume:

docker run -d -v mysql:/var/lib/mysql --name mysql-2 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes mysql fb66669da26a8ada40b276e3ae972e8597d911822ef6e4ea90fed211c46eeb1e

然后我們進入這個mysql-2容器中,并且查看數據庫:

docker exec -it mysql-2 /bin/bash root@fb66669da26a:/# mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 8.0.16 MySQL Community Server - GPLCopyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> show databases; +--------------------+ | Database | +--------------------+ | docker | | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.01 sec)

發現docker數據庫還在,說明和之前的mysql-1的數據庫是同一個數據庫。

總結

以上是生活随笔為你收集整理的从零开始学习docker(九)持久化存储和数据共享之 Data Volume的全部內容,希望文章能夠幫你解決所遇到的問題。

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