Docker数据卷(Volume)
一、数据卷概念
数据卷是宿主机中的一个目录或者文件,当容器目录和数据卷目录绑定后,对方的修改会立即同步。
一个数据卷可以被多个容器同时挂载,一个容器也可以被挂载多个数据卷。
简单来说,数据卷本质其实是共享文件夹,是宿主机与容器之间数据共享的桥梁。
数据卷的作用:
- 容器数据持久化
- 外部机器和容器间接通信
- 容器之间数据交换
卷技术就是为了实现数据的持久化和同步操作,容器间也是数据共享。
二、数据卷的配置方式
1、语法格式
docker run ... –v 宿主机目录(文件):容器内目录(文件) ...
- 目录必须是绝对路径
- 如果宿主机目录不存在,会自动创建
- 可以挂载多个数据卷(直接继续跟 -v 参数)
#在创建启动容器时挂载数据卷
[root@localhost opt]# docker run -id --name test -v /opt/test_data:/root/test_data centos:7 /bin/bash
aba73cea46edcd2a30c7a5ba7d782b3c263270f9281684084fff878b00d9b42d
可以在宿主机挂载的目录中创建一个文件或者目录,然后进入容器内查看是否同步数据。
2、挂载方式
- 匿名挂载:-v 容器内路径
- 具名挂载:-v 数据卷名:容器内路径
- 指定路径挂载:-v /宿主内路径:容器内路径
说明:匿名挂载只需要填写容器内路径,Docker 会默认帮我们创建匿名数据卷进行映射和挂载。一般使用具名挂载和指定路径挂载。具名挂载会在 /var/lib/docker/volumes/ 目录下创建对应的数据卷目录;而匿名挂载生成的目录名则是随机的。
#指定路径挂载
[root@localhost opt]# docker run -id --name test -v /opt/test_data:/root/test_data centos:7 /bin/bash
#具名挂载
[root@localhost opt]# docker run -id --name test1 -v my_data:/root/test_data centos:7 /bin/bash
[root@localhost opt]# docker volume inspect my_data
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my_data/_data",
"Name": "my_data",
"Options": {},
"Scope": "local"
}
]
#查看已有的容器数据卷
[root@localhost opt]# docker volume ls
DRIVER VOLUME NAME
local 6c415d518ce61e5e047bcf8fc33ae43f7882ea6ec38c07675bdb1568eb0d1b7f
local a2575ccb30033360d5c784a686628771e80d12903f83e8773146aa9dad7a765f
local e4f571f1544d753bb2505e391ad88c4d02100ca2ef3caf0ae8dc9bcd42c7160d
local my_data
local test
#匿名挂载
[root@localhost opt]# docker run -id --name test3 -v /root/test_data centos:7 /bin/bash
c7bd0c7aa231847042cac9c4ef827b3bbd281144e79f230f9c30b1d8d52a3e5f
[root@localhost opt]# docker volume ls
DRIVER VOLUME NAME
local 4ee1d7e862c36848a7ab57af9dd79c0577e46c4545a05b70dd96203466d27303
local 6c415d518ce61e5e047bcf8fc33ae43f7882ea6ec38c07675bdb1568eb0d1b7f
local a2575ccb30033360d5c784a686628771e80d12903f83e8773146aa9dad7a765f
local e4f571f1544d753bb2505e391ad88c4d02100ca2ef3caf0ae8dc9bcd42c7160d
local my_data
local test
[root@localhost opt]# docker volume inspect 6c415d518ce61e5e047bcf8fc33ae43f7882ea6ec38c07675bdb1568eb0d1b7f
[
{
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/6c415d518ce61e5e047bcf8fc33ae43f7882ea6ec38c07675bdb1568eb0d1b7f/_data",
"Name": "6c415d518ce61e5e047bcf8fc33ae43f7882ea6ec38c07675bdb1568eb0d1b7f",
"Options": {},
"Scope": "local"
}
]
3、volume 的基本使用
docker volume 命令:
- create:创建数据卷
- inspect:查看数据卷元数据
- ls:查看数据卷列表
- prune:删除所有未使用的卷
- rm:删除数据卷
#创建一个自定义容器
[root@localhost opt]# docker volume create my_data
#查看所用容器卷
[root@localhost opt]# docker volume ls
#查看指定容器卷信息
[root@localhost opt]# docker volume inspect
#删除容器卷
[root@localhost opt]# docker volume rm
4、MySQL数据卷挂载实战
1)搜索和下载镜像的步骤就省去了
2)创建启动镜像
[root@localhost opt]# docker run -id --name my_mysql -p 3600:3306 -v /opt/mysql/conf:/ect/mysql/conf.d -v /opt/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
8bace46562e55239fe7689b638be1eabaf416cc0c3093e009feac292af0779ca
3)进行验证,我们先进入容器创建一个新的数据库以及表,再插入一条数据,然后退出容器
[root@localhost opt]# docker exec -it my_mysql /bin/bash
bash-4.2# mysql -uroot -p123456
......
mysql> use test;
Database changed
mysql> create table t_test(id int,name varchar(255));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into t_test values(1,"huhai");
Query OK, 1 row affected (0.06 sec)
mysql> select * from t_test;
+------+-------+
| id | name |
+------+-------+
| 1 | huhai |
+------+-------+
1 row in set (0.00 sec)
mysql> exit
Bye
bash-4.2# exit
exit
4)然后我们将这个容器给停止之后删除,再创建一个相同路径的数据卷进行挂载,查看是否有我们已经有的数据
[root@localhost opt]# docker stop my_mysql
my_mysql
[root@localhost opt]# docker rm my_mysql
my_mysql
[root@localhost opt]# docker run -id --name my_mysql -p 3600:3306 -v /opt/mysql/conf:/ect/mysql/conf.d -v /opt/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
e208b09a924d9849b2f4cca225e3d51ac59f00f1ee64f11b2ba134183f170c76
[root@localhost opt]# docker exec -it my_mysql /bin/bash
bash-4.2# mysql -uroot -p123456
......
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
5 rows in set (0.00 sec)
mysql> use test;
Database changed
mysql> select * from t_test;
+------+-------+
| id | name |
+------+-------+
| 1 | huhai |
+------+-------+
1 row in set (0.00 sec)
mysql> exit
Bye
bash-4.2# exit
exit
三、迁移与备份
Docker 实际应用中,我们会安装很多容器,然后进行配置。试想一下,一台 Linux 服务器的容器怎么转移到另一台 Linux 服务器?这就涉及到了迁移与备份,我们可以将容器先保存为镜像,然后将镜像保存为压缩包,其他地方需要时可以将这个压缩包转回镜像。大概分为以下三种情况:
- 将开发环境下的 Docker 中对应的容器持久化为镜像
- 将镜像保存为一个压缩包,发送到生产环境服务器中
- 生产环境中需要将压缩包–>镜像–>容器
1、容器保存为镜像
1)命令:docker commit
2)作用:将容器保存为镜像
3)语法格式:docker commit 容器名称(或容器ID) 镜像名称:镜像标签
如果不写镜像标签则默认为 latest
[root@localhost opt]# docker commit my_mysql my_mysql:1.0
sha256:1f381fd1b9c929034e5f454e005b0a74535cbcce5406b7b8ea6c8e218ae11886
[root@localhost opt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my_mysql 1.0 1f381fd1b9c9 6 seconds ago 495 MB
docker.io/tomcat latest 1dad8c5497f9 4 weeks ago 474 MB
docker.io/mysql 5.7 d410f4167eea 5 weeks ago 495 MB
docker.io/openjdk 8 b273004037cc 5 months ago 526 MB
docker.io/hello-world latest feb5d9fea6a5 15 months ago 13.3 kB
docker.io/centos 7 eeb6ee3f44bd 16 months ago 204 MB
2、镜像保存为tar包
1)命令:docker save
2)作用:将镜像保存为 tar 包
3)语法:docker save -o tar包名 镜像名称(或镜像ID)
-o 代表输出到的文件
可以指定tar包的路径,即在tar包前面加路径
镜像后面可以跟镜像标签
#不加路径则默认在当前路径下创建tar包
[root@localhost opt]# docker save -o my_mysql.tar my_mysql
[root@localhost opt]# ll
总用量 900220
......
-rw------- 1 root root 510828544 1月 12 10:45 my_mysql.tar
drwxr-xr-x 4 root root 4096 1月 11 17:44 mysql
......
#加对应路径
[root@localhost opt]# docker save -o ~/my_mysql2.tar my_mysql
[root@localhost opt]# ll ~
总用量 498904
......
-rw------- 1 root root 510828544 1月 12 10:48 my_mysql2.tar
drwxr-xr-x. 2 root root 4096 12月 16 16:28 公共
......
3、tar包恢复为镜像
1)命令:docker load
2)作用:恢复镜像
3)语法:docker load -i tar包
-i 代表指定导入的文件
#首先删除创建的容器
[root@localhost opt]# docker rm my_mysql
my_mysql
#然后删除刚才备份的镜像
[root@localhost opt]# docker rmi my_mysql:1.0
#通过tar包恢复镜像
[root@localhost opt]# docker load -i my_mysql.tar
bd3382c8b69e: Loading layer [==================================================>] 10.75 kB/10.75 kB
Loaded image: my_mysql:1.0
#创建启动容器
[root@localhost opt]# docker run -id --name my_mysql -p 3600:3306 -v /opt/mysql/conf:/ect/mysql/conf.d -v /opt/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 my_mysql:1.0
1fb2a85039f89050d8c85c2edb34032a0633e927a38b3a6bcaef7c3949ee0f68