一、 概述

mysql是我们开发中常使用的数据库,如何快速安装mysql服务是开发人员必备的技能,而使用docker来安装mysql无疑是最为快捷的方式。

二、docker安装mysql

1、编排文件

docker-compose.yml

services:
  mysql8:
    image: mysql:8.0
    container_name: mysql8
    deploy:
      resources:
        limits:
          cpus: '1'
          memory: 400M
        reservations:
          memory: 300M
    volumes:
      - ./mysql8:/var/lib/mysql/
      - ./init:/docker-entrypoint-initdb.d/
    ports:
      - 23306:3306
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: root123
      MYSQL_USER: test
      MYSQL_PASSWORD: test123
      MYSQL_DATABASE: test
    command:
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
      --sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
    restart: on-failure
    logging:
      driver: 'json-file'
      options:
        max-size: '5m'
        max-file: '1'

2、启动脚本

restart.sh

#!/bin/bash
docker-compose down && docker-compose up -d

3、存在的问题

假如你是通过云主机部署了mysql服务,并且开通了外网访问权限。

以下问题是你不得不重视的:

  1. 编排文件环境变量部分,暴露了数据的密码
  2. 编排文件ports部分,暴露了访问端口

任何人都可以通过 ${ip}:23306 、用户名root 密码root123访问到你的数据库,安全无从谈起。

三、改进措施

1、修改编排文件

引用.env变量

services:
  mysql8:
    image: mysql:8.0
    container_name: mysql8
    deploy:
      resources:
        limits:
          cpus: '1'
          memory: 400M
        reservations:
          memory: 300M
    volumes:
      - ./mysql8:/var/lib/mysql/
      - ./init:/docker-entrypoint-initdb.d/
    ports:
      - 23306:3306
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_USER: test
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      MYSQL_DATABASE: test
    command:
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
      --sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
    restart: on-failure
    logging:
      driver: 'json-file'
      options:
        max-size: '5m'
        max-file: '1'

2、动态生成.env文件

create_env_001.sh

#!/bin/sh
echo "# update by 00fly at `date +"%Y-%m-%d %H:%M:%S"`" > .env
echo "MYSQL_ROOT_PASSWORD=`openssl rand -base64 9`" >> .env
echo "MYSQL_PASSWORD=`openssl rand -base64 9`"      >> .env

cat .env

运行结果

[root@00fly work]# sh create_env_001.sh 
# update by 00fly at 2026-02-11 18:08:49
MYSQL_ROOT_PASSWORD=mchz2ProUd03
MYSQL_PASSWORD=SSuHpAenJcc9

这样处理后,只有拥有服务器访问权限的用户才能查看数据库密码,保证了安全!

3、源码放送

https://gitee.com/00fly/docker-run/tree/master/compose/mysql8

http://118.178.86.130


有任何问题和建议,都可以向我提问讨论,大家一起进步,谢谢!

-over-

更多推荐