docker入门_volume数据持久化

docker数据持久化

为什么要进行数据持久化

docker将image构建container然后运行的时候,container会打包只读模式的image,然后在这基础上新构建可读可写的空间。container运行的数据可以存储到可读可写层,但是一旦删除container,这些数据将一起被删除,如果需要将数据保留,这时候就需要进行数据的持久化,将数据存储到宿主机的磁盘上。

如何配置数据持久化

以mysql的dockerfile为例进行说明如何在dockerfile中配置数据持久化

 

 

  • 查看mysql的dockerfile文件有如下截图部分,这里就是配置数据持久化的地方

 

 

持久化的数据如何存储

如上mysql dockerfile中"VOLUME /var/lib/mysql"代表将container的/var/lib/mysql这个路径下的文件进行持久化,持久化的数据默认在宿主机的/var/lib/docker/volumes路径下;详细的使用放下下面逐一介绍

使用默认volume启动参数

使用mysql镜像启动container;使用docker container inspect查看资源详细信息找到宿主机上对应的数据持久化路径

-d表示后台运行  --name指定container的名称  -p设置container的端口与宿主机端口映射关系  -e设置container的环境变量,在image的description有详细说明

[root@k8s-01 volumes]# docker run -d --name mysql_1 -p 3307:3306 -e  MYSQL_ROOT_PASSWORD=123456 mysql:5.7
5cbf0090ee4e6c20be6a2130e7c73079c3a02cc0639d7791b8206be35bdf0d8b
[root@k8s-01 volumes]# docker container inspect 5cbf0090ee4e6c20be6a2130e7c73079c3a02cc0639d7791b8206be35bdf0d8b|grep /var/lib/docker/volumes
                "Source": "/var/lib/docker/volumes/9a95441cfca8acb506b5ac7d8d7b9e99fce0fa4905365ebfa599cf7d596d795b/_data"
View Code

指定宿主机上数据持久化路径名称

-v参数指定宿主机数据持久化路径名称与container需要被持久化路径的对应关系,宿主机使用相对路径,container使用绝对路径

[root@k8s-01 _data]# /var/lib/docker/volumes/9a95441cfca8acb506b5ac7d8d7b9e99fce0fa4905365ebfa599cf7d596d795b/_data^C
[root@k8s-01 _data]# docker run -d --name mysql_2 -p 3308:3306 -v mysql_2:/var/lib/mysql -e  MYSQL_ROOT_PASSWORD=123456 mysql:5.7
3a33fbe2d367474d869d9eb36dce83aaff46637d60a5d0f80125d1bf6628187b
[root@k8s-01 _data]# docker container inspect 3a33fbe2d367474d869d9eb36dce83aaff46637d60a5d0f80125d1bf6628187b|grep /var/lib/docker/volumes
                "Source": "/var/lib/docker/volumes/mysql_2/_data",
[root@k8s-01 _data]# ls /var/lib/docker/volumes/mysql_2/_data
auto.cnf    ca.pem           client-key.pem  ibdata1      ib_logfile1  mysql               private_key.pem  server-cert.pem  sys
ca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile0  ibtmp1       performance_schema  public_key.pem   server-key.pem
[root@k8s-01 _data]# 
View Code

数据持久化在宿主机创建的持久化路径是volume资源,使用docker volume ls是可以查看到的

[root@k8s-01 _data]# docker volume ls|egrep "9a95441cfca8acb506b5ac7d8d7b9e99fce0fa4905365ebfa599cf7d596d795b|mysql_2"
local               9a95441cfca8acb506b5ac7d8d7b9e99fce0fa4905365ebfa599cf7d596d795b
local               mysql_2
View Code

数据进行持久化即使将container删除,宿主机上持久化的文件也不会删除

[root@k8s-01 _data]# ls /var/lib/docker/volumes/mysql_2/_data
auto.cnf    ca.pem           client-key.pem  ibdata1      ib_logfile1  mysql               private_key.pem  server-cert.pem  sys
ca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile0  ibtmp1       performance_schema  public_key.pem   server-key.pem
[root@k8s-01 _data]# docker container ls|grep mysql_2
3a33fbe2d367        mysql:5.7                                           "docker-entrypoint.s…"   17 minutes ago      Up 17 minutes       33060/tcp, 0.0.0.0:3308->3306/tcp   mysql_2
[root@k8s-01 _data]# docker container stop 3a33fbe2d367
3a33fbe2d367
[root@k8s-01 _data]# docker container rm 3a33fbe2d367  
3a33fbe2d367
[root@k8s-01 _data]# docker container ls|grep mysql_2  
[root@k8s-01 _data]# ls /var/lib/docker/volumes/mysql_2/_data
auto.cnf    ca.pem           client-key.pem  ibdata1      ib_logfile1  performance_schema  public_key.pem   server-key.pem
ca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile0  mysql        private_key.pem     server-cert.pem  sys
[root@k8s-01 _data]# 
View Code

自定义数据持久化路径

-v参数中宿主机数据持久化路径使用绝对路径时就是自定义数据持久化路径

[root@k8s-01 _data]# docker run -d --name mysql_3 -p 3309:3306 -v /root/mysql_3:/var/lib/mysql -e  MYSQL_ROOT_PASSWORD=123456 mysql:5.7
35872fb841424eb8665b6c41e952372bbc4bcd1ab4cd4b44fb84eaad2340c469
[root@k8s-01 _data]# docker container inspect 35872fb841424eb8665b6c41e952372bbc4bcd1ab4cd4b44fb84eaad2340c469|grep /root/mysql_3
                "/root/mysql_3:/var/lib/mysql"
                "Source": "/root/mysql_3",
[root@k8s-01 _data]# ls /root/mysql_3
auto.cnf    ca.pem           client-key.pem  ibdata1      ib_logfile1  mysql               private_key.pem  server-cert.pem  sys
ca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile0  ibtmp1       performance_schema  public_key.pem   server-key.pem
[root@k8s-01 _data]# 
View Code

注意:

  • 这种方式定义的路径docker volume是查询不到的
[root@k8s-01 _data]# docker volume ls|grep /root/mysql_3
[root@k8s-01 _data]# 
View Code
  • docker run种自定义的路径在宿主机不存在时会自动创建
  • 数据持久化的自定义路径非空时宿主机上不会写文件,数据持久化会失败
[root@k8s-01 ~]# mkdir mysql_4
[root@k8s-01 ~]# cd mysql_4/
[root@k8s-01 mysql_4]# touch 123
[root@k8s-01 mysql_4]# ls
123
[root@k8s-01 mysql_4]# docker run -d --name mysql_4 -p 3310:3306 -v /root/mysql_4:/var/lib/mysql -e  MYSQL_ROOT_PASSWORD=123456 mysql:5.7
a9ba4958c1590dfebadad99b2cdd4ab3fab4dc9a9c1ff592be324be6e3fb702a
[root@k8s-01 mysql_4]# ls
123
View Code

 

 

posted @ 2021-09-23 23:32  flag_HW  阅读(200)  评论(0编辑  收藏  举报