拉取镜像

MySQL 的docker镜像主要有两个版本:
官方版本:https://hub.docker.com/_/mysql
Oracle版本:https://hub.docker.com/r/mysql/mysql-server/

拉取 MySQL 镜像

  1. docker pull mysql:5.7

配置挂载文件

创建文件夹

  1. mkdir -p /usr/local/docker/mysql/conf
  2. mkdir -p /usr/local/docker/mysql/data
  3. # 日志文件夹需要权限 777
  4. mkdir -p /usr/local/docker/mysql/logs

启动测试容器

  1. docker run --name mysqltest -p 8888:3306 -e MYSQL_ROOT_PASSWORD=pwd123456 -d mysql:5.7

复制容器的MySQL 配置文件夹

  1. docker cp mysqltest:/etc/mysql/conf.d/ /usr/local/docker/mysql/conf
  2. docker rm -f mysqltest

添加配置

  1. cd /usr/local/docker/mysql/conf
  2. vim my.cnf

my.cnf

  1. [mysqld]
  2. # 服务器ID
  3. server-id=1
  4. # 设置3306端口
  5. port=3306
  6. # 表名大小写不区分
  7. lower_case_table_names= 1
  8. # 开启慢查询
  9. slow_query_log = on
  10. # 设置慢查询日志路径
  11. #slow_query_log_file = /var/log/mysql/slow_query.log
  12. #log-error = /var/log/mysql/error.log
  13. # 设置慢查询时间阈值
  14. long_query_time = 2
  15. # 允许最大连接数
  16. max_connections=1024
  17. # 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
  18. max_connect_errors=100
  19. # 服务端使用的字符集默认为UTF8
  20. character-set-server=utf8mb4
  21. # 创建新表时将使用的默认存储引擎
  22. default-storage-engine=INNODB
  23. # 最大数据包
  24. max_allowed_packet=20M
  25. #设置日志格式
  26. binlog_format=Row
  27. #设置日志路径,注意路经需要mysql用户有权限写
  28. log-bin=mysql-bin
  29. #设置binlog清理时间
  30. expire_logs_days=7
  31. #binlog每个日志文件大小
  32. max_binlog_size=100m
  33. #binlog缓存大小
  34. binlog_cache_size=4m
  35. #最大binlog缓存大小
  36. max_binlog_cache_size=512m
  37. sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
  38. [mysql]
  39. # 设置mysql客户端默认字符集
  40. default-character-set=utf8mb4
  41. [client]
  42. # 设置mysql客户端连接服务端时默认使用的端口
  43. port=3306
  44. default-character-set=utf8mb4

my.cnf文件放在 /usr/local/docker/mysql/conf文件夹下

启动正式容器

  1. docker run --privileged=true --restart=always \
  2. -p 3306:3306 --name mysql \
  3. -v /usr/local/docker/mysql/conf:/etc/mysql/conf.d \
  4. -v /usr/local/docker/mysql/logs:/var/log/mysql \
  5. -v /usr/local/docker/mysql/data:/var/lib/mysql \
  6. -e MYSQL_ROOT_PASSWORD=pwd123456 \
  7. --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci \
  8. -d mysql:5.7

参数说明

  • -p 3306:3306: 把容器内的3306端口映射到宿主机3306端口
  • --privileged=true: 给容器加上特定权限 。否则会chown: changing ownership of ‘/var/lib/mysql/....‘: Permission denied
  • -v /usr/local/docker/mysql/conf:/etc/mysql/conf.d 配置
  • -v /usr/local/docker/mysql/data:/var/lib/mysql:把mysql持久化的数据在宿主机内显示,做数据备份
  • -e MYSQL_ROOT_PASSWORD=pwd123456: 指定数据库初始访问密码,第一次设置才有小,后面重启以修改的密码为准
  • mysql:5.7 mysql镜像名,后面没有tag后,下载最新的tag,latest

问题及解决

启动容器时,log日志报:Permission denied

错误信息

容器启动,通过日志发现如下错误

  1. [ERROR] Could not open file '/var/log/mysql/error.log' for error logging: Permission denied

问题分析

mysql容器中,用mysql 用户来MySQL 服务的,而我们宿主机中没有mysql用户,所以导致容器没有权限创建对应的文件夹。

解决方法

  1. chmod -R 777 /usr/local/docker/mysql/logs

账户密码

  1. # 进入mysql容器
  2. docker exec -it mysql bash
  3. # 登录MySQL
  4. mysql -u root -ppwd123456
  5. # 修改密码
  6. alter USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'test@123567pwd';
  7. # 添加远程登录用户
  8. CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'test@123pwd';
  9. GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
  10. flush privileges;