为了防止容器被误删或者容器故障不能进入,需要对Docker MySQL数据做持久化处理,即使用数据卷挂载的方式将mysql的数据(映射数据目录)持久化到宿主机。同时,默认情况下数据库的数据库文件和日志文件都会存放于容器的AUFS文件层,不仅不使得容器变得越来越臃肿,不便于迁移、备份等管理,而且数据库的性能也会受到影响。因此建议挂载到宿主机的目录到容器内。
相比于正常的run容器,多了 -v /home/mysql/data:/var/lib/mysql ,即是将容器数据目录/var/lib/mysql 映射到宿主机/home/mysql/data 下。
docker run -itd --name mariadb-test -p 3333:3306 -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mariadb
进入容器后笔者新建了一个数据库docker_test,返回宿主机后在/home/mysql/data 下可以找到新建的数据库,而且mariadb数据库自带的数据库也存在,那么数据目录映射成功了。

当然,容器内/var/lib/mysql 也是存在数据目录的。docker_test文件夹也是最新的。

再次重启容器,docker start mariadb-test 数据目录会自动挂载,那么数据就会持久化下来。同样的,数据库的配置文件my.cnf或者50-server.cnf也可以相同方法挂在宿主机文件。
笔者停止容器,删除容器后,数据是否依然存在呢?答案是肯定的!而且宿主机数据目录有写保护,是需要root权限的。

总结:将指定的宿主机目录挂在到MySQL默认数据存储路径 /var/lib/mysql中即可完成数据持久化。可以将此目录以相同方式挂载到其他容器中,但被挂载的目录只能被一个MySQL容器使用,不能多个MySQL容器同时挂载。
网友评论