容器中的数据如果放在容器中,随着容器的删除会造成数据丢失,即使不删除,也会是容器不断扩大,为了解决这个问题,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端口,访问结果如下图:

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

删除容器,看看是否会丢失数据:
[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挂载数据完成。
网友评论