Docker数据卷(Volume)

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 112 10:45 my_mysql.tar
drwxr-xr-x  4 root root      4096 111 17:44 mysql
......
#加对应路径
[root@localhost opt]# docker save -o ~/my_mysql2.tar my_mysql
[root@localhost opt]# ll ~
总用量 498904
......
-rw-------  1 root root 510828544 112 10:48 my_mysql2.tar
drwxr-xr-x. 2 root root      4096 1216 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我真真的是小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值