從零開始學習docker(九)持久化存儲和數據共享之 Data Volume

有些時候容器會產生一些數據,而咱們不但願這些數據隨着容器的刪除而刪除。想保證數據的安全,通常用在數據庫。mysql

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

container容器是在image之上建立的,container layer能夠讀寫數據,而image是隻讀的,而咱們在container中謝的數據僅限於在當前container中讀寫,若是把container中止和刪除,那麼以前寫的文件和數據都刪除了,因此container是臨時存儲和保存數據的。docker

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

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

 

默認狀況下會將數據寫入到Container Layer,可是咱們能夠經過持久化將數據存儲到Volume。即便容器被刪除了,那麼只要Volume還在,咱們數據就還在,被保存了下來。bash

Docker持久化數據方案:tcp

  • 基於本地文件系統的Volume。能夠在執行Docker create 或Docker run時,經過-v參數將主機的目錄做爲容器的數據卷。這部分功能即是基於本地文件系統的volume管理。
  • 基於plugin的volume。支持第三方的存出方案,好比NAS,aws

 Volume的類型:spa

  • 受管理的data volume,由docker後臺自動建立。
  • 綁定掛在的Volume,具體掛在位置能夠由用戶指定。

準備環境

建立一個mysql的container,3d

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

添加了一個數據庫,名叫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 - 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)

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

相關文章
相關標籤/搜索