1. 概述

容器技术是当前 IT 行业最热门的话题之一,因其轻量、灵活、可移植等优点而广受青睐。越来越多的企业开始采用基于容器的解决方案来部署业务系统。据 451 Research 预测,未来几年应用容器市场将增长四倍。

如今,MySQL、MongoDB、PostgreSQL 等数据库也都支持容器化部署。本文将重点介绍如何使用 Docker 和 docker-compose 配置并运行一个 MySQL 容器。我们将从已有数据库导出备份文件,构建容器配置 YAML 文件,并通过 docker-compose 启动服务。

2. 构建 MySQL 容器配置

我们使用 docker-compose 工具来构建 MySQL 容器。docker-compose 会根据当前目录下的 Dockerfile 构建镜像,并读取环境变量进行配置。

2.1. docker-compose.yml 配置

我们首先创建一个 docker-compose.yml 文件,定义 MySQL 服务的基本配置:

version: '3.3'
services:
  mysql:
    build:
      context: /home/tools/bael/dung/B015
      args:
        - MYSQL_DATABASE=${MYSQL_DATABASE}
        - MYSQL_USER=${MYSQL_USER}
        - MYSQL_PASSWORD=${MYSQL_PASSWORD}
        - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
    ports:
      - "${MYSQL_PORT}:3306"

上述配置中:

  • version 指定 docker-compose 文件格式版本
  • build 定义了构建镜像的上下文路径和构建参数
  • ports 将容器的 3306 端口映射到宿主机

2.2. Dockerfile 编写

docker-compose 会根据 Dockerfile 构建镜像。下面是我们的 Dockerfile 内容:

FROM mysql:latest

MAINTAINER baeldung.com

RUN chown -R mysql:root /var/lib/mysql/

ARG MYSQL_DATABASE
ARG MYSQL_USER
ARG MYSQL_PASSWORD
ARG MYSQL_ROOT_PASSWORD

ENV MYSQL_DATABASE=$MYSQL_DATABASE
ENV MYSQL_USER=$MYSQL_USER
ENV MYSQL_PASSWORD=$MYSQL_PASSWORD
ENV MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD

ADD data.sql /etc/mysql/data.sql

RUN sed -i 's/MYSQL_DATABASE/'$MYSQL_DATABASE'/g' /etc/mysql/data.sql
RUN cp /etc/mysql/data.sql /docker-entrypoint-initdb.d

EXPOSE 3306

关键指令说明如下:

指令 说明
FROM 指定基础镜像,这里是 mysql:latest
MAINTAINER 设置镜像作者信息
RUN 执行命令,如修改目录权限、替换 SQL 文件中的占位符
ARG 定义构建时传入的变量
ENV 设置环境变量
ADD 添加本地文件到容器中
EXPOSE 暴露容器端口

2.3. 环境变量配置

我们使用 .env 文件来配置环境变量,方便 docker-compose 使用:

MYSQL_DATABASE=my_db_name
MYSQL_USER=baeldung
MYSQL_PASSWORD=pass
MYSQL_ROOT_PASSWORD=pass
MYSQL_PORT=3306

这些变量会被 docker-compose.yml 中的 args 引用。

2.4. MySQL 数据备份文件

为了演示数据恢复功能,我们准备了一个 data.sql 文件,用于在容器启动时自动导入数据库结构和数据。

备份命令如下:

# mysqldump -u root -p my_db_name > data.sql
Enter password:

data.sql 示例内容如下:

DROP TABLE IF EXISTS `Customers`;
CREATE TABLE `Customers` (
  `CustomerName` varchar(255) DEFAULT NULL,
  ...
);
INSERT INTO `Customers` VALUES ('Cardinal', ...), ('Wilman Kala', ...);

⚠️ 注意:默认的 mysqldump 不会包含数据库创建语句。为确保数据导入完整性,我们在 data.sql 文件中手动添加如下内容:

CREATE DATABASE IF NOT EXISTS `MYSQL_DATABASE`;
USE `MYSQL_DATABASE`;

最终目录结构如下:

.
├── data.sql
├── docker-compose.yml
├── Dockerfile
└── .env

3. 启动 MySQL 容器

使用以下命令启动容器:

# docker-compose up

输出内容会显示构建过程和数据库初始化日志。我们也可以使用 -d 参数让容器后台运行:

# docker-compose up -d

启动成功后,我们可以看到容器已经运行:

# docker ps
CONTAINER ID   IMAGE              COMMAND                  ... PORTS
9ce4da8eb682   b015_mysql        "docker-entrypoint.s…"   ... 0.0.0.0:3306->3306/tcp

4. 安装 MySQL 客户端

为了连接 MySQL 容器,我们需要安装 MySQL 客户端工具:

$ sudo apt install mysql-client -y

验证安装路径和版本:

$ which mysql
/usr/bin/mysql
$ mysql --version
mysql  Ver 14.14 Distrib 5.7.37, for Linux (x86_64) using EditLine wrapper

5. 容器与客户端通信

5.1. 获取容器 IP 地址

使用以下命令获取容器的 IP 地址:

# docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 9ce4da8eb682
172.19.0.2

5.2. 连接 MySQL 容器

使用客户端连接 MySQL 容器:

# mysql -h 172.19.0.2 -P 3306 --protocol=tcp -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
...
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| my_db_name         |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

5.3. 查询并插入数据

我们可以查询导入的 Customers 表:

mysql> select * from Customers;
+--------------+-----------------+---------------+-----------+------------+---------+
| CustomerName | ContactName     | Address       | City      | PostalCode | Country |
+--------------+-----------------+---------------+-----------+------------+---------+
| Cardinal     | Tom B. Erichsen | Skagen 21     | Stavanger | 4006       | Norway  |
| Wilman Kala  | Matti Karttunen | Keskuskatu 45 | Helsinki  | 21240      | Finland |
+--------------+-----------------+---------------+-----------+------------+---------+

再插入一条新记录:

mysql> INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country) 
VALUES ('White Clover Markets', 'Karl Jablonski', '305 - 14th Ave. S. Suite 3B', 'Seattle', '98128', 'USA');
Query OK, 1 row affected (0.00 sec)

再次查询,可以看到新记录已插入成功。

5.4. 容器内连接 MySQL

我们也可以进入容器内部进行测试:

# docker exec -it 9ce4da8eb682 /bin/bash
root@9ce4da8eb682:/# mysql -h localhost -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
...

6. 总结 ✅

本文介绍了如何使用 Docker 和 docker-compose 配置并运行一个 MySQL 容器。我们完成了以下关键步骤:

  • 使用 .env 文件配置环境变量
  • 编写 Dockerfile 定义镜像构建逻辑
  • 编写 docker-compose.yml 定义服务配置
  • 导出数据库备份文件并导入容器
  • 启动容器并验证数据恢复
  • 安装客户端并连接数据库进行操作

整个流程清晰、可控,适合用于本地开发、测试或 CI/CD 流程中快速部署 MySQL 环境。如果你在使用过程中遇到问题,比如数据库未自动创建或数据未导入,请检查 data.sql 文件内容是否包含 CREATE DATABASE 语句,并确保路径正确。


原始标题:Setting up and Running a MySQL Container