快速搭建MySQL5.7和MySQL8的DockerCompose脚本

快速搭建MySQL5.7和MySQL8的DockerCompose脚本

我们编写代码或者部署环境的时候,离不开数据库的访问,那么如何快速的搭建一个MySQL数据库呢?下面的方法教会你。

MySQL5.7

  • 创建目录(请根据自己的实际目录创建)
mkdir -p /2023/dockerdata/mysql/mysql5/{mydir,datadir,conf,source}
  • 编写my.cnf
vim conf/my.cnf

[mysqld]
#default-storage-engine=INNODB
character-set-server=utf8mb4
collation-server = utf8mb4_general_ci
init_connect='SET NAMES utf8'

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4
  • 编写docker-compose.yaml
version: '3'
services:
  mysql:
    restart: always
    image: mysql:5.7.18
    container_name: mysql5.7
    volumes:
      - /2023/dockerdata/mysql/mysql5/datadir:/var/lib/mysql
      - /2023/dockerdata/mysql/mysql5/conf/my.cnf:/etc/my.cnf
      # 数据库还原目录 可将需要还原的sql文件放在这里,只对未初始化的数据库执行一次。
      - /2023/dockerdata/mysql/mysql5/source:/docker-entrypoint-initdb.d
      # 自定义一些目录
      - /2023/dockerdata/mysql/mysql5/mydir:/mydir
    environment:
      - "MYSQL_ROOT_PASSWORD=testerzhang@testerzhang"
      - "MYSQL_DATABASE=testerzhang"
      - "TZ=Asia/Shanghai"
    ports:
      # 使用宿主机的3306端口映射到容器的3306端口
      # 宿主机:容器
      - 3306:3306
  • 运行
docker-compose up -d
  • 验证
$ mysql -h127.0.0.1 -P3306 -uroot -ptesterzhang@testerzhang

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| testerzhang        |
+--------------------+

MySQL8

  • 创建目录(请根据自己的实际目录创建)
mkdir -p /2023/dockerdata/mysql/mysql8/{mydir,datadir,conf,source}
  • 编写my.cnf
vim conf/my.cnf

[mysqld]
#default-storage-engine=INNODB
character-set-server=utf8mb4
collation-server = utf8mb4_general_ci
init_connect='SET NAMES utf8'

default_authentication_plugin=caching_sha2_password
default-authentication-plugin=mysql_native_password

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4
  • 初始化sql-可选操作

    假若你想初始化sql,比如创建用户sql

$ cat source/create_user.sql
CREATE USER 'test'@'%' IDENTIFIED BY 'testerzhang';
GRANT ALL PRIVILEGES ON test.* TO 'test'@'%' WITH GRANT OPTION;
flush privileges;

重要说明:

容器内/docker-entrypoint-initdb.d目录下的文件会在数据库初始化时执行一次,只执行一次。所以如果mysql8/datadir目录下有初始化过,必须删除掉,才会执行这个sql文件。

  • 编写docker-compose.yaml
version: '3'
services:
  mysql:
    restart: always
    image: mysql:8.0.31
    container_name: mysql8.0
    volumes:
      - /2023/dockerdata/mysql/mysql8/datadir:/var/lib/mysql
      - /2023/dockerdata/mysql/mysql8/conf/my.cnf:/etc/my.cnf
      # 数据库还原目录 可将需要还原的sql文件放在这里,只对未初始化的数据库执行一次。
      - /2023/dockerdata/mysql/mysql8/source:/docker-entrypoint-initdb.d
      # 自定义一些目录
      - /2023/dockerdata/mysql/mysql8/mydir:/mydir
    environment:
      - "MYSQL_ROOT_PASSWORD=testerzhang@testerzhang"
      - "MYSQL_DATABASE=testerzhang"
      - "TZ=Asia/Shanghai"
    ports:
      # 使用宿主机的3306端口映射到容器的3306端口
      # 宿主机:容器
      - 3306:3306
    # 以下命令未测试,感兴趣的童鞋可以自行配置验证下。
    #command:
    #  # 将mysql8.0默认密码策略 修改为 原先 策略 (mysql8.0对其默认策略做了更改 会导致密码无法匹配)
    #  --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

  • 运行
docker-compose up -d
  • 验证
$ mysql -h127.0.0.1 -P3306 -uroot -ptesterzhang@testerzhang

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| testerzhang        |
+--------------------+


$ mysql -h127.0.0.1 -P3306 -utest -ptesterzhang
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.31 MySQL Community Server - GPL

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

本文没有授权给任何组织、企业和个人转载,未经作者允许禁止转载!

欢迎关注我的公众号testerzhang,原创技术文章第一时间推送。

公众号二维码

updatedupdated2022-10-242022-10-24