Py学习  »  docker

Docker学习(八)数据持久化

我犟不过你 • 3 年前 • 340 次点击  

容器中的数据如果放在容器中,随着容器的删除会造成数据丢失,即使不删除,也会是容器不断扩大,为了解决这个问题,docker提供了volume属性,下面我们主要了来学习volume。

通常我们会使用挂载的方式,将数据券挂载在宿主机上面,这样即使容器没有了,数据也不会丢失。volume给我们提供了快捷的使用方式,下面我们创建一个mysql容器并将数据挂载到宿主机上。

先来看下volume如何使用:

[root@iZ2ze7sn66bchxncut8rgsZ opt]# docker volume --help
Usage:  docker volume COMMAND
Manage volumes
Commands:
  create      Create a volume #创建一个挂载券
  inspect     Display detailed information on one or more volumes #查看volume功能
  ls          List volumes #查看volume列表
  prune       Remove all unused local volumes #删除所有未挂载的volume
  rm          Remove one or more volumes #删除一个或多个volume

首先,创建一个volume,用作存储mysql数据库数据:

[root@iZ2ze7sn66bchxncut8rgsZ opt]# docker volume create mysql-data
mysql-data
[root@iZ2ze7sn66bchxncut8rgsZ opt]# docker volume inspect mysql-data
[
    {
        "CreatedAt": "2020-09-25T15:30:41+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/mysql-data/_data",
        "Name": "mysql-data",
        "Options": {},
        "Scope": "local"
    }
]

上面已经创建好了一个volume,在宿主机的/var/lib/docker/volumes/mysql-data/_data下面,接下来我们来启动mysql

[root@iZ2ze7sn66bchxncut8rgsZ opt]# docker run -d -p 3306:3306 --net mysql-net --ip 172.19.0.2 -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --privileged --name=mysql mysql
75b17059c51f633e771f512ac29c083b5ec0dcfbc62a77f209e34c02c759e577
[root@iZ2ze7sn66bchxncut8rgsZ opt]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
75b17059c51f        mysql               "docker-entrypoint.s…"   3 seconds ago       Up 2 seconds        0.0.0.0:3306->3306/tcp, 33060/tcp   nysql

上面的启动脚本很长,我们下面逐个分下下每一个的含义是什么:

docker run #docke运行镜像,创建容器
-d #后台运行
-p 3306:3306 #指定将容器的端口映射到宿主机端口 [宿主机端口:容器端口] 
--net mysql-net #指定网卡
--ip 172.19.0.2 #指定网卡网段内的ip
-v mysql-data:/var/lib/mysql  #将容器内的数据存储位置挂载到volume
-e MYSQL_ROOT_PASSWORD=123456 #设置root账户密码
--privileged #赋予最大权限
--name=mysql #命名容器
mysql #镜像名

进入容器,登录mysql,并验证容器是否启动成功:

[root@iZ2ze7sn66bchxncut8rgsZ opt]# docker exec -it mysql bash
root@0858d47c0f34:/# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.21 MySQL Community Server - GPL

Copyright (c) 2000, 2020, 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> exit
Bye

从上面的结果我们清楚地看到,数据库容器已经成功创建,并且看到了其中的系统表。
接下来看看数据有没有挂载到宿主机的volume:

[root@iZ2ze7sn66bchxncut8rgsZ opt]# docker volume inspect mysql-data 
[
    {
        "CreatedAt": "2020-09-25T15:52:55+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/mysql-data/_data",
        "Name": "mysql-data",
        "Options": {},
        "Scope": "local"
    }
]
[root@iZ2ze7sn66bchxncut8rgsZ opt]# cd /var/lib/docker/volumes/mysql-data/_data
[root@iZ2ze7sn66bchxncut8rgsZ _data]# ll
总用量 186780
-rw-r----- 1 systemd-coredump input       56 9月  25 15:49  auto.cnf
-rw-r----- 1 systemd-coredump input  3104223 9月  25 15:49  binlog.000001
-rw-r----- 1 systemd-coredump input      156 9月  25 15:52  binlog.000002
-rw-r----- 1 systemd-coredump input      156 9月  25 15:52  binlog.000003
-rw-r----- 1 systemd-coredump input       48 9月  25 15:52  binlog.index
-rw------- 1 systemd-coredump input     1676 9月  25 15:49  ca-key.pem
-rw-r--r-- 1 systemd-coredump input     1112 9月  25 15:49  ca.pem
-rw-r--r-- 1 systemd-coredump input     1112 9月  25 15:49  client-cert.pem
-rw------- 1 systemd-coredump input     1676 9月  25 15:49  client-key.pem
-rw-r----- 1 systemd-coredump input   196608 9月  25 15:54 '#ib_16384_0.dblwr'
-rw-r----- 1 systemd-coredump input  8585216 9月  25 15:49 '#ib_16384_1.dblwr'
-rw-r----- 1 systemd-coredump input     5406 9月  25 15:49  ib_buffer_pool
-rw-r----- 1 systemd-coredump input 12582912 9月  25 15:52  ibdata1
-rw-r----- 1 systemd-coredump input 50331648 9月  25 15:54  ib_logfile0
-rw-r----- 1 systemd-coredump input 50331648 9月  25 15:49  ib_logfile1
-rw-r----- 1 systemd-coredump input 12582912 9月  25 15:52  ibtmp1
drwxr-x--- 2 systemd-coredump input      187 9月  25 15:52 '#innodb_temp'
drwxr-x--- 2 systemd-coredump input      143 9月  25 15:49  mysql
-rw-r----- 1 systemd-coredump input 30408704 9月  25 15:52  mysql.ibd
drwxr-x--- 2 systemd-coredump input     8192 9月  25 15:49  performance_schema
-rw------- 1 systemd-coredump input     1680 9月  25 15:49  private_key.pem
-rw-r--r-- 1 systemd-coredump input      452 9月  25 15:49  public_key.pem
-rw-r--r-- 1 systemd-coredump input     1112 9月  25 15:49  server-cert.pem
-rw------- 1 systemd-coredump input     1676 9月  25 15:49  server-key.pem
drwxr-x--- 2 systemd-coredump input       28 9月  25 15:49  sys
-rw-r----- 1 systemd-coredump input 10485760 9月  25 15:54  undo_001
-rw-r----- 1 systemd-coredump input 12582912 9月  25 15:54  undo_002

从上面的结果清楚地看到,数据库文件已经挂载到宿主机了。
在w10电脑的mysql客户端访问下数据库,看是否访问成功,这里我是用的是阿里云的ECS,不要忘记开放服务器的3306端口,访问结果如下图:

mysql

随便创建一个数据库和表,加入数据,数据库创建成功了:

建库和表

删除容器,看看是否会丢失数据:

[root@iZ2ze7sn66bchxncut8rgsZ _data]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
0858d47c0f34        mysql               "docker-entrypoint.s…"   36 minutes ago      Up 36 minutes       0.0.0.0:3306->3306/tcp, 33060/tcp   mysql
[root@iZ2ze7sn66bchxncut8rgsZ _data]# docker rm -f 0858
0858
[root@iZ2ze7sn66bchxncut8rgsZ _data]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@iZ2ze7sn66bchxncut8rgsZ _data]# docker run -d -p 3306:3306 --net mysql-net --ip 172.19.0.2 -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --privileged --name=mysql mysql
e05291df53d2153ac538f26064bdf2cd5643c32bc60f688e90e5bfa30cabd22f
[root@iZ2ze7sn66bchxncut8rgsZ _data]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
e05291df53d2        mysql               "docker-entrypoint.s…"   5 seconds ago       Up 4 seconds        0.0.0.0:3306->3306/tcp, 33060/tcp   mysql

验证数据是否存在:




    
[root@iZ2ze7sn66bchxncut8rgsZ _data]# docker exec -it mysql bash
root@e05291df53d2:/# mysql -uroot -p 
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.0.21 MySQL Community Server - GPL

Copyright (c) 2000, 2020, 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-mysql       |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.01 sec)

mysql> use docker-mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

mysql> select * from first_table;
+----+------+
| id | name |
+----+------+
|  1 | aaa  |
|  2 | bbb  |
+----+------+
2 rows in set (0.00 sec)

mysql> exit
Bye

数据存在,没有问题,至此通过docker安装数据库,通过volume挂载数据完成。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/74029
 
340 次点击