0
点赞
收藏
分享

微信扫一扫

MySQL Docker 数据持久化

残北 2023-12-08 阅读 46

MySQL Docker 数据持久化


在使用 Docker 运行 MySQL 数据库的时候,我们通常会面临一个重要的问题,即如何保证数据的持久化。Docker 的容器随时可以被删除或重新创建,因此默认情况下,容器内的数据也会随之丢失。本文将介绍如何通过几种常见的方法实现 MySQL 数据的持久化。

1. Volume 挂载


Docker 提供了 Volume 功能,可以将宿主机的目录挂载到容器内部,从而实现数据的持久化。我们可以将 MySQL 的数据目录挂载到宿主机上,这样即使容器被删除,数据也不会丢失。

1.1 创建 Volume


首先,我们需要创建一个 Volume,这个 Volume 将作为容器与宿主机之间的桥梁。可以使用以下命令创建一个 Volume:


docker volume create mysql_data



1.2 运行容器并挂载 Volume


接下来,我们需要运行一个 MySQL 容器,并将 Volume 挂载到容器内部。可以使用以下命令运行容器:


docker run -d \
  -e MYSQL_ROOT_PASSWORD=<password> \
  -v mysql_data:/var/lib/mysql \
  --name mysql \
  mysql:latest



上述命令中,-v mysql_data:/var/lib/mysql 表示将名为 mysql_data 的 Volume 挂载到容器内部的 /var/lib/mysql 目录。这样,容器内的数据就会被持久保存在 mysql_data 这个 Volume 中。

1.3 数据恢复


当容器被删除后,我们可以通过以下命令重新创建容器,并将 Volume 挂载回来,从而恢复数据:


docker run -d \
  -e MYSQL_ROOT_PASSWORD=<password> \
  -v mysql_data:/var/lib/mysql \
  --name mysql \
  mysql:latest


 


2. Bind Mount 挂载


除了 Volume 挂载,我们还可以使用 Bind Mount 挂载的方式实现数据的持久化。Bind Mount 允许将宿主机的任意目录挂载到容器内部,和 Volume 挂载相比,它更加灵活。

2.1 创建宿主机目录


首先,我们需要在宿主机上创建一个目录,用于存储 MySQL 的数据。可以使用以下命令创建目录:


mkdir /data/mysql_data


2.2 运行容器并挂载目录


接下来,我们需要运行一个 MySQL 容器,并将宿主机的目录挂载到容器内部。可以使用以下命令运行容器:


docker run -d \
  -e MYSQL_ROOT_PASSWORD=<password> \
  -v /data/mysql_data:/var/lib/mysql \
  --name mysql \
  mysql:latest


 


上述命令中,-v /data/mysql_data:/var/lib/mysql 表示将宿主机的 /data/mysql_data 目录挂载到容器内部的 /var/lib/mysql 目录。这样,容器内的数据就会被持久保存在宿主机的 /data/mysql_data 目录中。

2.3 数据恢复


当容器被删除后,我们可以通过以下命令重新创建容器,并将目录挂载回来,从而恢复数据:


docker run -d \
  -e MYSQL_ROOT_PASSWORD=<password> \
  -v /data/mysql_data:/var/lib/mysql \
  --name mysql \
  mysql:latest


3. Docker Compose


除了使用命令行,我们还可以使用 Docker Compose 来管理容器和数据的持久化。Docker Compose 是一个用于定义和运行多个 Docker 容器的工具,可以使用一个 YAML 文件来描述容器之间的关系、配置和数据的持久化。


以下是一个使用 Docker Compose 来运行 MySQL 的示例:

version: '3'
services:
  mysql:
    image: mysql:latest
    container_name: mysql
    environment:
      - MYSQL_ROOT_PASSWORD=<password>
    volumes:
      - mysql_data:/var/lib/mysql
volumes:
  mysql_data:


在上述示例中,我们定义了一个名为 mysql 的


举报

相关推荐

0 条评论