Docker重启MariaDB容器后数据库仍存在的原因及解决方法
问题描述
Docker Compose配置
mariadb: image: mariadb:10.8.2 restart: always environment: MARIADB_ROOT_PASSWORD: test MARIADB_DATABASE: mydb ports: - "3306:3306" container_name: mariadb networks: - my-network
执行的启动命令
docker stop mariadb docker rm mariadb docker-compose up -d --remove-orphans mariadb sleep 15 # wait until database is fully started docker exec mariadb mysql -u root -ptest -e "CREATE DATABASE product;"
错误信息
ERROR 1007 (HY000) at line 1: Can't create database 'dictionary'; database exists
疑问
删除容器后,之前创建的数据库为何仍存在?如何在第二次创建容器时得到无现有数据库的干净环境?
问题解答
为什么数据库还存在?
Docker容器本身是临时可删除的,但MariaDB容器默认会把数据库数据存储在独立的Docker卷(volume)中。你只删除了容器实例,却没删除存储数据的卷。当重新创建容器时,Docker会自动复用之前的卷,所以之前创建的数据库会被保留下来。
如何获得干净的数据库环境?
有三种实用方法可以解决这个问题:
方法1:删除容器同时删除关联卷
在删除容器时添加-v参数,一次性清除容器和绑定的数据卷:
docker stop mariadb docker rm -v mariadb docker-compose up -d --remove-orphans mariadb
注意:此操作会彻底删除所有数据库数据,执行前确认无需保留数据。
方法2:配置临时内存卷(适合测试场景)
在docker-compose.yml中给MariaDB配置tmpfs临时卷,数据仅存于内存,容器停止后自动清空:
mariadb: image: mariadb:10.8.2 restart: always environment: MARIADB_ROOT_PASSWORD: test MARIADB_DATABASE: mydb ports: - "3306:3306" container_name: mariadb networks: - my-network tmpfs: - /var/lib/mysql # MariaDB默认数据存储目录
方法3:用命名卷手动管理
配置命名卷,需要重置环境时手动删除该卷即可:
- 修改
docker-compose.yml添加命名卷:
version: '3.8' services: mariadb: image: mariadb:10.8.2 restart: always environment: MARIADB_ROOT_PASSWORD: test MARIADB_DATABASE: mydb ports: - "3306:3306" container_name: mariadb networks: - my-network volumes: - mariadb-data:/var/lib/mysql volumes: mariadb-data:
- 需要重置环境时执行:
docker stop mariadb docker rm mariadb docker volume rm mariadb-data docker-compose up -d --remove-orphans mariadb
内容的提问来源于stack exchange,提问作者Rui
相关产品推荐
相关产品推荐

