Skip to main content

Docker 构建 MySQL

Docker 构建 MySQL(docker-compose 部署版本)​

MySQL 是最流行的开源关系型数据库。本文按 docker-compose 方式部署 MySQL 单节点,镜像、端口、密码、容器名、数据目录等全部集中在 .env 中管理。

1. 宿主目录​

宿主目录用途容器内用户
/data/runtime/docker/mysql/data数据库数据文件uid 999
/data/runtime/docker/mysql/logsMySQL 运行日志uid 999
/data/runtime/docker/mysql/conf配置文件(my.cnf)只读

数据目录:.env 中 MYSQL_DATA_DIR / MYSQL_LOG_DIR 留空则回退使用 Docker 命名卷;配置目录 MYSQL_CONF_DIR 为必填,需先按第 2 节复制配置。

2. 创建宿主目录并设置权限​

bind mount 首次使用需先建目录并授权(容器内 mysql 用户 uid 999):

# 1) 配置目录:首次部署把部署包 conf/ 复制到宿主根,之后直接修改宿主目录下的配置
mkdir -p /data/runtime/docker/mysql/conf
cp -r ./conf/. /data/runtime/docker/mysql/conf/

# 2) 数据 / 日志目录
mkdir -p /data/runtime/docker/mysql/{data,logs}
chown -R 999:999 /data/runtime/docker/mysql

3. 编制 .env​

在本目录创建 .env 文件(内容如下,按需修改):

# ---------- MySQL 环境变量(集中管理) ----------
MYSQL_IMAGE=mysql:8.0.36
MYSQL_CONTAINER_NAME=mysql
MYSQL_ROOT_PASSWORD=root1234
MYSQL_DATABASE=myapp
MYSQL_USER=myapp
MYSQL_PASSWORD=myapp123
MYSQL_PORT=3306
# 宿主机数据目录(统一约定 /data/runtime/docker/<服务>);留空则回退到命名卷
MYSQL_DATA_DIR=/data/runtime/docker/mysql/data
MYSQL_LOG_DIR=/data/runtime/docker/mysql/logs
MYSQL_CONF_DIR=/data/runtime/docker/mysql/conf
TZ=Asia/Shanghai

4. .env 变量说明​

变量说明示例
MYSQL_IMAGE镜像版本mysql:8.0.36
MYSQL_CONTAINER_NAME容器名mysql
MYSQL_PORT宿主机端口3306
MYSQL_ROOT_PASSWORDroot 密码root1234
MYSQL_DATABASE / MYSQL_USER / MYSQL_PASSWORD初始化库与业务账号myapp / myapp / myapp123
MYSQL_DATA_DIR / MYSQL_LOG_DIR数据 / 日志目录,留空回退命名卷/data/runtime/docker/mysql/...
MYSQL_CONF_DIR配置目录(必填,先复制 conf/)/data/runtime/docker/mysql/conf
TZ时区Asia/Shanghai

5. docker-compose.yml​

在本目录创建 docker-compose.yml:

services:
mysql:
image: ${MYSQL_IMAGE}
container_name: ${MYSQL_CONTAINER_NAME}
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
TZ: ${TZ}
ports:
- "${MYSQL_PORT}:3306"
volumes:
- ${MYSQL_DATA_DIR:-mysql-data}:/var/lib/mysql
- ${MYSQL_CONF_DIR}/my.cnf:/etc/mysql/conf.d/my.cnf
- ${MYSQL_LOG_DIR:-mysql-log}:/var/log/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-p${MYSQL_ROOT_PASSWORD}"]
interval: 10s
timeout: 5s
retries: 10

volumes:
mysql-data:
mysql-log:

6. 启动​

cd Docker构建MySQL
docker compose up -d
docker compose ps
docker compose logs -f mysql
docker compose down # 停止并移除容器(命名卷数据保留)
docker compose down -v # 连数据卷一起清空

7. 验证​

docker exec -it mysql /bin/bash
mysql -h localhost -u root -p
# 输入 root 密码,确认连接成功