简介
不建议在docker里运行MySQL数据库软件,仅当测试或数据重要性不高时使用。生产环境推荐安装到KVM
方法 / 步骤
一:安装MySQL
# 查看docker版本
docker -v
--------------------------------------------
[root@bogon /]# docker -v
Docker version 1.13.1, build 7d71120/1.13.1
--------------------------------------------
1.1 搜索查看可用的MySQL
docker search mysql
1.2 拉取MySQL镜像
# 指定版本
docker pull mysql:5.7
#最新mysql:8.0.29 版本
docker pull mysql:8.0.29
1.3 查看本地镜像
docker images
--------------------------------------------------------------------------------------------
[root@bogon /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/mysql 5.7 efa50097efbd 7 days ago 462 MB
--------------------------------------------------------------------------------------------
1.4运行容器
默认端口号 3307
注意docker 参数应该排在MySQL参数之前
# MySQL5.7
docker run \
-p 3307:3306 \
--privileged=true \
--restart=always \
--name mysql3307 \
-v /docker/mysql3307/conf:/etc/mysql/conf.d \
-v/docker/mysql3307/logs:/logs \
-v/docker/mysql3307/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=useradmin \
-d mysql:5.7
# MySQL8 (默认密码是123456)
docker run \
-p 3307:3306 \
--privileged=true \
--restart=always \
--name mysql3307 \
-v /docker/mysql3307/conf:/etc/mysql/conf.d \
-v/docker/mysql3307/logs:/logs \
-v/docker/mysql3307/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:8.0.29
- 运行成功
二: 修改Docker (MySQL)相关配置
找到容器的配置目录
笔者的配置目录/docker/mysql3307/conf
编辑 my.cnf 文件如果没有就创建一个
cd /docker/mysql3306/conf/
vi my.cnf
- 默认配置文件(默认开启binlog)
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
# 跳过DNS 主机名解析
skip-name-resolve
#开启binlog
log-bin = mysql-bin
#选择row模式
binlog-format = ROW
#配置mysql replication需要定义,不能和canal的slaveId重复
server_id = 1
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
#数据库默认字符集
character-set-server = utf8mb4
#数据库字符集对应一些排序等规则,注意要和character-set-server对应
collation-server = utf8mb4_general_ci
#设置client连接mysql时的字符集,防止乱码
init_connect= 'SET NAMES utf8mb4'
#是否对sql语句大小写敏感,1表示不敏感
lower_case_table_names = 1
# 开启该选项 root账号可以免密码登录(一般为注释)
# skip-grant-tables
# 5.7 以上版本 开启以下配置(去掉:ONLY_FULL_GROUP_BY) 否则 使用之前group by 函数会报错
# sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
# 8.0+版本去掉 NO_AUTO_CREATE_USER (不支持)
# sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
- 重启容器
# 注意这里权限太高会导致运行忽略
sudo chmod 644 /docker/mysql3306/conf/my.cnf
docker restart [目标容器id]
# 查看MySQL是否开启binlog 如果显示OFF则代表未开启
show variables like 'log_bin';
三: 相关问题解决
3.1 安装之后外网登录不上
# 在配置文件my.cnf中放开下面的注释,(免密码登录)
# skip-grant-tables
# 进入容器
docker exec -it [容器名称] /bin/bash
# 查找root的配置信息
select host from user where user='root';
# 更新root账号host字段为% 然后退出
update user set host = '%' where user ='root';
# 在配置文件把跳过免密码登录关闭(注释) 然后重启
3.2 重新设置root密码
# 启动命令行更新密码为 123456
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
# 或者下面命令行(适用于root主机没有限制情况下)
#ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
# 刷新权限
flush privileges;
四:其他相关资料
4.1 docker命令
# 查看docker 容器日志,
docker logs ${id}
# 进入容器命令
docker exec -it [容器名称] /bin/bash
# 一、查看容器,复制容器id 即container id
docker ps -a
# 二、停止容器
docker stop 你的容器id
# 三、重启容器
docker restart 你的容器id
#三、删除容器
docker rm 容器id
#四、查看镜像,复制镜像id即images id
docker images
#五。删除镜像
docker rmi 镜像id
4.2 通用配置文件 - 参考
[mysqld]
# 设置3306端口
port=3306
# 设置mysql的安装目录
basedir=/usr/local/mysql
# 设置mysql数据库的数据的存放目录
datadir=/usr/local/mysql/mysqldb
# 允许最大连接数
max_connections=1000
# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=100
# 服务端使用的字符集默认为UTF8
character-set-server=utf8mb4
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password
#是否对sql语句大小写敏感,1表示不敏感
lower_case_table_names = 1
#MySQL连接闲置超过一定时间后(单位:秒)将会被强行关闭
#MySQL默认的wait_timeout 值为8个小时, interactive_timeout参数需要同时配置才能生效
interactive_timeout = 1800
wait_timeout = 1800
#Metadata Lock最大时长(秒), 一般用于控制 alter操作的最大时长sine mysql5.6
#执行 DML操作时除了增加innodb事务锁外还增加Metadata Lock,其他alter(DDL)session将阻塞
lock_wait_timeout = 3600
#内部内存临时表的最大值。
#比如大数据量的group by ,order by时可能用到临时表,
#超过了这个值将写入磁盘,系统IO压力增大
tmp_table_size = 64M
max_heap_table_size = 64M
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8mb4