Docker - 配置 MariaDB



MariaDB 是一款开源数据库,具有强大的性能和可扩展的企业级安全功能,通常用于关系型数据库管理系统 (RDBMS)。它在开发 Web 应用程序和处理数据仓库应用程序方面很受欢迎。

在 Docker 容器内运行 MariaDB 提供了几个优势:它确保了一致的环境,使部署变得容易,并且与其他服务隔离。将 MariaDB 容器化简化了设置,使开发人员能够轻松管理和扩展数据库环境。

将 MariaDB 容器化的先决条件

在开始将 MariaDB 容器化之前,我们确保满足以下要求:

  • Docker 基础知识 - 了解 Docker 的基本概念,例如镜像、容器和基本 Docker 命令。
  • 在本地机器上安装 Docker - 确保 Docker 已安装在您的本地机器上。它可以从 https://www.docker.net.cn 下载并安装。
  • MariaDB 知识 - 对 MariaDB 以及如何配置和使用 MariaDB 的一些了解可以帮助您设置数据库并使用它。
  • 文本编辑器或 IDE - 您将需要一个文本编辑器或集成开发环境 (IDE),例如 VS Code 或 Sublime Text。
  • CLI 访问权限 - 命令行或终端访问权限,允许您执行 Docker 命令。

设置 MariaDB 项目

第一步是创建一个项目结构,其中包含与我们的 MariaDB 实例相关的所有文件。这包括 Dockerfile、配置文件和项目所需的任何其他资源。

步骤 1:创建项目目录

让我们创建一个新目录,它将作为所有项目文件的根目录。

$ mkdir docker-mariadb
$ cd docker-mariadb
Setting up a MariaDB Project

步骤 2:初始化项目

您还可以使用 Git 等版本控制系统初始化项目,它可以帮助跟踪更改并与其他人协作。

$ git init

步骤 3:创建 MariaDB 配置文件

我们可以通过配置文件自定义 MariaDB 实例。这包括自定义设置,例如设置特定用户权限、数据库选项或网络设置。

创建配置文件

$ touch my-mariadb.cnf

编辑配置文件

在您的文本编辑器中打开此文件,并添加以下配置设置。例如:

[mysqld]
bind-address = 0.0.0.0
port = 3306

稍后,我们将此配置文件挂载到 Docker 容器中,这将允许 MariaDB 读取这些设置。

步骤 4:准备 SQL 脚本

让我们创建一个 SQL 脚本,以使用特定的模式和数据初始化我们的数据库。此脚本将在 MariaDB 容器启动时执行。

为 SQL 脚本创建目录

$ mkdir init-scripts

创建并添加 SQL 脚本

现在,让我们在 init-scripts 目录中创建一个名为 init-db.sql 的文件,并将以下 SQL 脚本粘贴到其中

-- Create a new database

CREATE DATABASE IF NOT EXISTS my_database;

-- Switch to the new database

USE my_database;

-- Create a new table
CREATE TABLE users (

   id INT AUTO_INCREMENT PRIMARY KEY,

   name VARCHAR(100) NOT NULL,

   email VARCHAR(100) NOT NULL UNIQUE,

   created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP

);

-- Insert some sample data into the table

INSERT INTO users (name, email) VALUES

('Alice Smith', '[email protected]'),

('Bob Johnson', '[email protected]'),

('Charlie Brown', '[email protected]');	

此脚本自动创建一个名为 my_database 的数据库,然后创建一个具有某些基本字段的 users 表,并插入一些示例数据。

步骤 5:查看项目结构

我们的项目目录应该如下所示:

docker-mariadb/

├── init-scripts/

│   └── init-db.sql

└── my-mariadb.cnf

在本地运行 MariaDB

在为我们的 MariaDB 应用程序创建 Docker 容器之前,让我们尝试在我们的机器上本地运行它。这将确保我们的设置按预期工作。通过此步骤,我们可以验证我们的 MariaDB 配置和数据库初始化脚本。

步骤 1:在本地安装 MariaDB

让我们首先通过以下步骤在本地机器上安装 MariaDB:

在 Ubuntu/Debian 上

sudo apt update
sudo apt install mariadb-server mariadb-client

在 CentOS/RHEL 上

sudo yum install mariadb-server mariadb

在 macOS 上(使用 Homebrew)

brew install mariadb
Install MariaDB Locally

安装完成后,我们可以启动 MariaDB 服务:

sudo systemctl start mariadb

对于 macOS

brew services start mariadb

步骤 2:保护 MariaDB 安装

MariaDB 还提供了一个安全脚本,允许您通过删除匿名用户、禁用远程 root 登录和其他安全设置来增强默认安装。您可以运行以下命令来保护您的 MariaDB 安装:

$ sudo mysql_secure_installation

您可以按照终端中的提示根据您的要求配置安全设置。

Secure MariaDB Installation

步骤 3:创建和测试数据库

现在,让我们手动执行之前准备的 SQL 脚本以创建数据库、表和插入数据。

访问 MariaDB Shell

$ sudo mysql -u root -p
Access the MariaDB Shell

执行 SQL 脚本

现在我们位于 MariaDB shell 中,我们可以通过运行以下命令执行我们的脚本:

SOURCE /path/to/init-scripts/init-db.sql;

我们需要将 /path/to/ 替换为您 init-db.sql 文件的实际路径。

Execute the SQL Script

验证数据库和数据

现在我们可以验证数据库和表是否已创建,以及数据是否已正确插入:

USE my_database;
SELECT * FROM users;
Verify the Database and Data

步骤 4:停止 MariaDB

现在我们已经验证了我们的数据库设置在本地正常工作,我们可以停止 MariaDB 服务:

$ sudo systemctl stop mariadb

对于 macOS

$ brew services stop mariadb

创建 Dockerfile

Dockerfile 包含创建 Docker 镜像的所有指令,该镜像将包含 MariaDB 实例。在项目的根目录中创建一个名为 Dockerfile 的文件。以下是我们 MariaDB 项目的 Dockerfile 示例:

# Use the official MariaDB image as the base image

FROM mariadb:latest

# Set environment variables for MariaDB root password and database name

ENV MARIADB_ROOT_PASSWORD=root_password

ENV MARIADB_DATABASE=my_database

# Copy the custom MariaDB configuration file into the container

COPY my-mariadb.cnf /etc/mysql/conf.d/

# Copy initialization SQL scripts into the Docker container

COPY init-scripts/ /docker-entrypoint-initdb.d/

# Expose the default MariaDB port

EXPOSE 3306

# Run the MariaDB server

CMD ["mysqld"]

Dockerfile 指令说明

  • FROM mariadb:latest - 此指令指定将使用 Docker 镜像创建的 Docker 容器的基础镜像。我们将使用 mariadb:latest 镜像,它是 Docker Hub 提供的官方 MariaDB 镜像。
  • ENV MARIADB_ROOT_PASSWORD=root_password - 用于设置环境变量 MARIADB_ROOT_PASSWORD,该变量将由 MariaDB 镜像用于配置 root 用户的密码。
  • ENV MARIADB_DATABASE=my_database - 接下来,我们将设置另一个环境变量 MARIADB_DATABASE,它将在初始化容器时自动创建一个新数据库。
  • COPY my-mariadb.cnf /etc/mysql/conf.d/ - COPY 指令将自定义 MariaDB 配置文件 (my-mariadb.cnf) 从我们的本地项目目录复制到 Docker 容器内的相应配置目录 (/etc/mysql/conf.d/)
  • COPY init-scripts/ /docker-entrypoint-initdb.d/ - 另一个 COPY 指令将我们的 SQL 脚本从 init-scripts 目录复制到容器内的 /docker-entrypoint-initdb.d/ 目录。MariaDB 将在容器的初始启动期间自动执行这些脚本。
  • EXPOSE 3306 - 我们可以使用 EXPOSE 指令公开端口 3306,这是 MariaDB 侦听的默认端口。这将允许我们从容器外部连接到容器中运行的 MariaDB 服务器。
  • CMD ["mysqld"] - 最后,这定义了在启动容器时启动 MariaDB 服务器的命令。

构建 MariaDB 镜像

现在我们的 Dockerfile 已创建,下一步是构建 Docker 镜像。

步骤 1:构建 Docker 镜像

让我们导航到项目的根目录(我们的 Dockerfile 所在的位置),并运行以下命令:

$ docker build -t my-mariadb-image .

这将根据 Dockerfile 创建我们的 mariadb 镜像,并将其标记为 my-mariadb-image。末尾的点指定构建上下文,即 Dockerfile 所在的目录。

Build the Docker Image

步骤 2:验证镜像

让我们通过列出机器中的所有镜像来验证镜像是否已创建。

$ docker images

您可以看到我们的 my-mariadb-image 已列出。

Verify the Image

运行 MariaDB Docker 容器

现在我们的镜像已构建,让我们创建与此镜像关联的 Docker 容器。

步骤 1:运行容器

要从我们的 Docker 镜像启动容器,我们可以使用以下命令:

$ docker run -d --name my-mariadb-container -p 3306:3306 my-mariadb-image
Run the Container

这将在分离模式下(-d 标志)启动一个容器,将容器的公开端口 3306 映射到本地机器的端口 3306(-p 标志),使用末尾提到的 my-mariadb-image 创建一个名为 my-mariadb-container 的容器(--name)。

步骤 2:连接到 MariaDB 容器

您可以使用 MySQL 客户端连接到 Docker 容器内的 MariaDB 服务器。例如,要从终端使用 MySQL 客户端连接,请运行:

mysql -h 127.0.0.1 -P 3306 -u root -p
USE my_database;
SELECT * FROM users;
Connect to the MariaDB Container

您可以看到数据库、表和行已经存在,这是通过我们创建的脚本的自动执行创建的。

结论

将 MariaDB 容器化是一种非常强大且灵活的方式来管理数据库环境,它提供了诸如可移植性、易于部署和环境隔离等强大的功能。

在本章中,我们解释了如何在 MariaDB 中配置项目;特别是,我们介绍了设置 Dockerfile、创建自定义 Docker 镜像以及配置 MariaDB 容器。这不仅简化了开发过程,还将确保能够复制环境,从而简化数据库解决方案的扩展、协作和后续维护。

在 Docker 中设置 MariaDB 的常见问题

在 Docker 中设置 MariaDB 有些非常常见的问题 (FAQ),本节尝试简要回答它们。

1. 如何将 Node.js 应用程序连接到 Docker 化的 MariaDB 数据库?

使用任何可用的 MariaDB 的 Node.js 驱动程序将您的 Node.js 应用程序连接到您的 Docker 化 MariaDB 数据库。在您的连接字符串中提及正确的主机名 - 通常是 mariadb - 和端口。确保 Node.js 应用程序和 MariaDB 容器连接到同一个网络。

2. 如何处理 Docker 容器中 MariaDB 的数据持久性?

通过使用数据卷来持久化 MariaDB 数据。此卷将主机上的一个目录映射到容器内部的一个目录。写入 MariaDB 数据库的所有数据都存储在主机卷上,并且在容器停止后不会丢失。

3. 如何保护 Docker 化的 MariaDB 数据库?

为 MariaDB root 身份和其他身份设置强密码。限制网络访问 MariaDB 容器。定期更新镜像并应用安全补丁。考虑开启通信的 SSL/TLS 加密。在 MariaDB 中实施访问控制和用户管理。

广告