拉取镜像
MySQL 的docker镜像主要有两个版本:
官方版本:https://hub.docker.com/_/mysql
Oracle版本:https://hub.docker.com/r/mysql/mysql-server/
拉取 MySQL 镜像
docker pull mysql:5.7
配置挂载文件
创建文件夹
mkdir -p /usr/local/docker/mysql/conf
mkdir -p /usr/local/docker/mysql/data
# 日志文件夹需要权限 777
mkdir -p /usr/local/docker/mysql/logs
启动测试容器
docker run --name mysqltest -p 8888:3306 -e MYSQL_ROOT_PASSWORD=pwd123456 -d mysql:5.7
复制容器的MySQL 配置文件夹
docker cp mysqltest:/etc/mysql/conf.d/ /usr/local/docker/mysql/conf
docker rm -f mysqltest
添加配置
cd /usr/local/docker/mysql/conf
vim my.cnf
my.cnf
[mysqld]
# 服务器ID
server-id=1
# 设置3306端口
port=3306
# 表名大小写不区分
lower_case_table_names= 1
# 开启慢查询
slow_query_log = on
# 设置慢查询日志路径
#slow_query_log_file = /var/log/mysql/slow_query.log
#log-error = /var/log/mysql/error.log
# 设置慢查询时间阈值
long_query_time = 2
# 允许最大连接数
max_connections=1024
# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=100
# 服务端使用的字符集默认为UTF8
character-set-server=utf8mb4
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 最大数据包
max_allowed_packet=20M
#设置日志格式
binlog_format=Row
#设置日志路径,注意路经需要mysql用户有权限写
log-bin=mysql-bin
#设置binlog清理时间
expire_logs_days=7
#binlog每个日志文件大小
max_binlog_size=100m
#binlog缓存大小
binlog_cache_size=4m
#最大binlog缓存大小
max_binlog_cache_size=512m
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8mb4
将my.cnf
文件放在 /usr/local/docker/mysql/conf
文件夹下
启动正式容器
docker run --privileged=true --restart=always \
-p 3306:3306 --name mysql \
-v /usr/local/docker/mysql/conf:/etc/mysql/conf.d \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=pwd123456 \
--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci \
-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
错误信息
容器启动,通过日志发现如下错误
[ERROR] Could not open file '/var/log/mysql/error.log' for error logging: Permission denied
问题分析
mysql容器中,用mysql
用户来MySQL 服务的,而我们宿主机中没有mysql用户,所以导致容器没有权限创建对应的文件夹。
解决方法
chmod -R 777 /usr/local/docker/mysql/logs
账户密码
# 进入mysql容器
docker exec -it mysql bash
# 登录MySQL
mysql -u root -ppwd123456
# 修改密码
alter USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'test@123567pwd';
# 添加远程登录用户
CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'test@123pwd';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
flush privileges;