Skip to content

mysql

vim docker-compose.yml

yml
services:
  mysql:
    image: mysql:8.0.45
    container_name: mysql8

    restart: unless-stopped

    ports:
      - "3306:3306"

    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}

    volumes:
      - ./data:/var/lib/mysql
      - ./conf:/etc/mysql/conf.d
      - ./init:/docker-entrypoint-initdb.d

    command: [
      "--default-authentication-plugin=mysql_native_password",
      "--character-set-server=utf8mb4",
      "--collation-server=utf8mb4_unicode_ci",
      "--skip-host-cache",
      "--skip-name-resolve"
    ]

    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "-p${MYSQL_ROOT_PASSWORD}"]
      interval: 5s
      timeout: 3s
      retries: 10

可选方案

yml
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  mysql_data:

vim .env

MYSQL_ROOT_PASSWORD=sql123123
mkdir data conf init

vim conf/my.cnf

sh
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

# 避免 DNS 解析带来的性能问题
skip-name-resolve

# 连接数(按需调整)
max_connections=200

vim init/001-init.sql

sql
-- 1. 创建数据库
CREATE DATABASE IF NOT EXISTS my_database
  DEFAULT CHARACTER SET utf8mb4
  COLLATE utf8mb4_unicode_ci;

-- 2. 创建业务用户(关键:明确 host)
CREATE USER IF NOT EXISTS 'qin'@'%' IDENTIFIED BY '123456';

-- 3. 授权(最小权限原则)
GRANT ALL PRIVILEGES ON my_database.* TO 'qin'@'%';

-- 4. root 允许远程(可选,但开发建议开)
ALTER USER 'root'@'%' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}';

FLUSH PRIVILEGES;

警告

这里的 '${MYSQL_ROOT_PASSWORD}' 不可用,访问不到变量,所以需要修改为

sql
ALTER USER 'root'@'%' IDENTIFIED BY 'sql123123';

权限问题

sh
docker exec -it mysql8 mysql -uroot -p
sql
-- 1. 创建用户并允许任意IP访问(关键!)
CREATE USER 'qin'@'%' IDENTIFIED BY '你的密码';

-- 2. 给所有库权限
GRANT ALL PRIVILEGES ON *.* TO 'qin'@'%';

-- 3. 刷新权限
FLUSH PRIVILEGES;