如何通過(guò)持久化將數(shù)據(jù)存儲(chǔ)到Volume

如何通過(guò)持久化將數(shù)據(jù)存儲(chǔ)到Volume,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

創(chuàng)新互聯(lián)建站-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比同江網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式同江網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋同江地區(qū)。費(fèi)用合理售后完善,十年實(shí)體公司更值得信賴。

有些時(shí)候容器會(huì)產(chǎn)生一些數(shù)據(jù),而我們不希望這些數(shù)據(jù)隨著容器的刪除而刪除。想保證數(shù)據(jù)的安全,一般用在數(shù)據(jù)庫(kù)。

首先看一下container和image的區(qū)別:

如何通過(guò)持久化將數(shù)據(jù)存儲(chǔ)到Volume

container容器是在image之上創(chuàng)建的,container layer可以讀寫數(shù)據(jù),而image是只讀的,而我們?cè)赾ontainer中謝的數(shù)據(jù)僅限于在當(dāng)前container中讀寫,如果把container停止和刪除,那么之前寫的文件和數(shù)據(jù)都刪除了,所以container是臨時(shí)存儲(chǔ)和保存數(shù)據(jù)的。

如果有這樣的需求:如果我們創(chuàng)建一個(gè)MySQL數(shù)據(jù)庫(kù)的container,數(shù)據(jù)都是以文件的形式存儲(chǔ)在本地的,如果把mysql容器刪除,那么數(shù)據(jù)就被刪除了,這是不可取的。

docker引入了一個(gè)持久化的機(jī)制。

如何通過(guò)持久化將數(shù)據(jù)存儲(chǔ)到Volume

默認(rèn)情況下會(huì)將數(shù)據(jù)寫入到Container Layer,但是我們可以通過(guò)持久化將數(shù)據(jù)存儲(chǔ)到Volume。即使容器被刪除了,那么只要Volume還在,我們數(shù)據(jù)就還在,被保存了下來(lái)。

Docker持久化數(shù)據(jù)方案:

  • 基于本地文件系統(tǒng)的Volume??梢栽趫?zhí)行Docker create 或Docker run時(shí),通過(guò)-v參數(shù)將主機(jī)的目錄作為容器的數(shù)據(jù)卷。這部分功能便是基于本地文件系統(tǒng)的volume管理。

  • 基于plugin的volume。支持第三方的存出方案,比如NAS,aws

 Volume的類型:

  • 受管理的data volume,由docker后臺(tái)自動(dòng)創(chuàng)建。

  • 綁定掛在的Volume,具體掛在位置可以由用戶指定。

準(zhǔn)備環(huán)境

創(chuàng)建一個(gè)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表示使用空密碼

查詢鏡像發(fā)現(xiàn)沒有運(yùn)行

查看日志: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

把這個(gè)鏡像刪除,重新創(chuàng)建。

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

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

發(fā)現(xiàn)有很多,都是之前創(chuàng)建的??梢韵葎h除掉:

docker volume rm 01d091f0bc6a045d10d56b5892dc55ccb2c6cda6b19cbcc8ca3c7adc9b3c477b

小技巧:

    可以刪除所有的volume:

docker volume rm $(docker volume ls -q)

重新創(chuàng)建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:~$

現(xiàn)在可以看到mysql已經(jīng)運(yùn)行了,查看volume:

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

這個(gè)就是mysql的volume

查看volume詳細(xì)信息:

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"
    }
]

發(fā)現(xiàn)volume的數(shù)據(jù)是在/var/lib/docker/volumes/575c4038694e1abf8e883fc029813a745de6e5f412412eebec7c1a5b9c46e35d/_data路徑下。

我們?cè)賱?chuàng)建一個(gè)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

查看這個(gè)新的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"
    }
]

實(shí)驗(yàn):如果將容器停止,是否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

確認(rèn)我們本地沒有容器在運(yùn)行:

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起別名,方便以后好使用

先將上面的兩個(gè)volume刪除掉:

docker volume rm 54bbb749bc0b45dfa1de4eff8b94620e3184ade9633ffdeaeef230dbcd20c0cc
docker volume rm 575c4038694e1abf8e883fc029813a745de6e5f412412eebec7c1a5b9c46e35d

新建一個(gè)mysql的容器,并且制定-v選項(xiàng):

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

進(jìn)入mysql-1容器內(nèi)部:

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 - GPL

Copyright (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)

添加了一個(gè)數(shù)據(jù)庫(kù),名叫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

我們創(chuàng)建一個(gè)容器mysql-2,使用這個(gè)volume:

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

然后我們進(jìn)入這個(gè)mysql-2容器中,并且查看數(shù)據(jù)庫(kù):

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 - GPL

Copyright (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)

發(fā)現(xiàn)docker數(shù)據(jù)庫(kù)還在,說(shuō)明和之前的mysql-1的數(shù)據(jù)庫(kù)是同一個(gè)數(shù)據(jù)庫(kù)。

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。

新聞名稱:如何通過(guò)持久化將數(shù)據(jù)存儲(chǔ)到Volume
瀏覽路徑:http://bm7419.com/article4/jdohie.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、企業(yè)建站、云服務(wù)器、定制網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)、品牌網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作