docker数据持久化
为什么要进行数据持久化
docker将image构建container然后运行的时候,container会打包只读模式的image,然后在这基础上新构建可读可写的空间。container运行的数据可以存储到可读可写层,但是一旦删除container,这些数据将一起被删除,如果需要将数据保留,这时候就需要进行数据的持久化,将数据存储到宿主机的磁盘上。
如何配置数据持久化
以mysql的dockerfile为例进行说明如何在dockerfile中配置数据持久化
- docker hub官网搜索mysql镜像,以official image为例 Explore Docker's Container Image Repository | Docker Hub
- 点开mysql镜像找到docker file,如下截图。
- 查看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"
指定宿主机上数据持久化路径名称
-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]#
数据持久化在宿主机创建的持久化路径是volume资源,使用docker volume ls是可以查看到的
[root@k8s-01 _data]# docker volume ls|egrep "9a95441cfca8acb506b5ac7d8d7b9e99fce0fa4905365ebfa599cf7d596d795b|mysql_2" local 9a95441cfca8acb506b5ac7d8d7b9e99fce0fa4905365ebfa599cf7d596d795b local mysql_2
数据进行持久化即使将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]#
自定义数据持久化路径
-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]#
注意:
- 这种方式定义的路径docker volume是查询不到的
[root@k8s-01 _data]# docker volume ls|grep /root/mysql_3 [root@k8s-01 _data]#
- 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