- 前提:安装docker服务并配置私有库,镜像加速地址
- 云服务器或者本地服务器开放MySQL端口3306
- 登录私有库,参考登录私有库步骤
- 拉取MySQL镜像
#拉取私有库MySQL镜像 docker pull 8.134.59.62:8083/mysql ●8.134.59.62:8083/mysql 为私有库镜像地址:私有库IP:端口号/镜像名 #查看已拉取下来的MySQL镜像 docker images ●该命令查看本地所有的镜像,可以用grep进行过滤
5. 创建挂载目录及配置文件
#新建MySQL配置文件目录 mkdir -p /mnt/mysql/conf ●-p:所有不存在的上级目录会被自动创建 #添加配置文件my.cnf到目录/mnt/mysql/conf #新建MySQL数据存放目录 mkdir -p /mnt/mysql/data #新建MySQL日志目录 mkdir -p /mnt/mysql/log #新建MySQL数据导入和导出目录 mkdir -p /mnt/mysql/mysql-files
6. 授权目录
#对MySQL数据存放目录进行授权 chmod -R 755 /mnt/mysql/data ●-R:对目录及子目录或文件进行授权 #对MySQL日志目录进行授权 chmod -R 755 /mnt/mysql/log #对MySQL数据导入和导出目录进行授权 chmod -R 755 /mnt/mysql/mysql-files #对配置文件目录进行授权 chmod -R 755 /mnt/mysql/conf
说明:以下是MySQL通用的配置文件内容
#MySQL通用的配置文件内容 [mysqld] #Mysql服务的唯一编号 每个mysql服务Id需唯一 server-id=1 #服务端口号 默认3306 port=3306 #mysql安装根目录(default /usr) #basedir=/usr/local/mysql #mysql数据文件所在位置 datadir=/mnt/mysql/data #pid pid-file=/mnt/mysql/data/mysqld.pid #设置socke文件所在目录 socket=/mnt/mysql/data/mysql.sock #设置临时目录 #tmpdir=/tmp # 用户 user=mysql # 允许访问的IP网段,全部网段 bind-address=0.0.0.0 # 跳过密码登录 #skip-grant-tables sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION #主要用于MyISAM存储引擎,如果多台服务器连接一个数据库则建议注释下面内容 #skip-external-locking #只能用IP地址检查客户端的登录,不用主机名 #skip_name_resolve=1 skip-name-resolve #事务隔离级别,默认为可重复读,mysql默认可重复读级别(此级别下可能参数很多间隙锁,影响性能) #transaction_isolation=READ-COMMITTED #数据库默认字符集,主流字符集支持一些特殊表情符号(特殊表情符占用4个字节) 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 #最大连接数 max_connections=400 #最大错误连接数 max_connect_errors=1000 #TIMESTAMP如果没有显示声明NOT NULL,允许NULL值 explicit_defaults_for_timestamp=true #SQL数据包发送的大小,如果有BLOB对象建议修改成1G max_allowed_packet=128M #MySQL连接闲置超过一定时间后(单位:秒)将会被强行关闭 #MySQL默认的wait_timeout 值为8个小时, interactive_timeout参数需要同时配置才能生效 interactive_timeout=1800 wait_timeout=1800 #内部内存临时表的最大值 ,设置成128M。 #比如大数据量的group by ,order by时可能用到临时表, #超过了这个值将写入磁盘,系统IO压力增大 tmp_table_size=134217728 max_heap_table_size=134217728 #禁用mysql的缓存查询结果集功能 #后期根据业务情况测试决定是否开启 #大部分情况下关闭下面两项 #query_cache_size = 0 #query_cache_type = 0 #数据库错误日志文件 #log-error=/var/log/mysqld.log #慢查询sql日志设置 #slow_query_log=1 #slow_query_log_file=/var/log/mysqld_slow.log #检查未使用到索引的sql log_queries_not_using_indexes=1 #针对log_queries_not_using_indexes开启后,记录慢sql的频次、每分钟记录的条数 log_throttle_queries_not_using_indexes=5 #作为从库时生效,从库复制中如何有慢sql也将被记录 log_slow_slave_statements=1 #慢查询执行的秒数,必须达到此值可被记录 long_query_time=8 #检索的行数必须达到此值才可被记为慢查询 min_examined_row_limit=100 #mysql binlog日志文件保存的过期时间,过期后自动删除 #expire_logs_days=5 binlog_expire_logs_seconds=604800 #若你的MySQL数据库主要运行在境外,请务必根据实际情况调整本参数 default_time_zone = "+8:00"
7. 创建容器
docker run -p 3306:3306 --name mysql --restart=always --privileged=true -v /mnt/mysql/log:/var/log/mysql -v /mnt/mysql/data:/var/lib/mysql -v /mnt/mysql/conf/my.cnf:/etc/mysql/my.cnf -v /mnt/mysql/mysql-files:/var/lib/mysql-files -v /etc/localtime:/etc/localtime:ro -e MYSQL_ROOT_PASSWORD=123456 -d 8.134.59.62:8083/mysql ●docker run: 运行一个新的容器 ●-p 3306:3306:第一个是宿主机端口,第二个是容器端口,将容器的 3306 端口映射到宿主机的 3306 端口 ●--name mysql: 为容器指定名称为 mysql ●--restart=always: 容器随docker服务自动启动 ●--privileged=true:获取宿主机root权限 ●-v /mnt/mysql/log:/var/log/mysql: 第一个是宿主机目录,第二个是容器目录,将宿主机的日志目录挂载到容器的 /var/log/mysql 目录 ●-v /mnt/mysql/data:/var/lib/mysql: 第一个是宿主机目录,第二个是容器目录,将宿主机的数据存放目录挂载到容器的数据目录 ●-v /mnt/mysql/conf/my.cnf:/etc/mysql/my.cnf: 第一个是宿主机的mysql配置文件,第二个是容器的配置文件,将宿主机的配置文件挂载到容器 ●-v /mnt/mysql/mysql-files:/var/lib/mysql-files: 将宿主机的数据导入目录挂载到容器数据导入目录 ●-v /etc/localtime:/etc/localtime:ro: 挂载宿主机的本地时间到容器,保持时间同步,设置为只读(ro) ●e MYSQL_ROOT_PASSWORD=123456: 设置 MySQL root 用户的密码为 123456 ●-d: 后台运行容器 ●8.134.59.62:8083/mysql:镜像名称,这个是从私有仓库中拉取下来的镜像
8. 检验MySQL是否安装成功
#查看MySQL容器是否启动成功 docker ps #查看MySQL容器启动日志是否有报错 docker logs mysql #查看MySQL端口号是否在启用状态 netstat -nlpt |grep 3306 #navicat远程登陆
9. 常见问题处理
a. MySQL安装后,navicat远程登陆不了,原因是端口号没有开放
#查看发现远程访问MySQL端口号不通 telnet ip:端口号 解决方法:云服务器安全组开放端口,本地防火墙添加端口例外
b.修改挂载映射的配置文件端口号,其实是修改容器的端口,而不是宿主机端口号
c. 修改MySQL的宿主机访问端口号,在创建容器时设置所需的宿主机端口即可
d.进入MySQL容器后,使用mysql -u root -p登陆失败
查看容器日志报错:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) #解决方法:由于MySQL容器不会使用本地套接字来连接,而是通过网络端口进行连接因此可使用IP进行登陆 mysql -h 127.0.0.1 -P 3306 -u root -p
查看容器日志报错:Error on realpath() on '/var/lib/mysql-files' (Error 2 - No such file or directory)
客户端连接登录报错:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) #解决方法:MySQL跳过密码登陆,连续按两下Enter键即可免密登录
docker exec -it mysql /bin/bash
mysql -u root -p
连续按两下Enter键免密登录
e. 客户端远程连接,root用户没有远程登录权限:“ERROR 1130: Host xxx.xxx.xxx.xxx is not allowed to connect to this MySQL server”
#解决方法:登陆MySQL本地,为root用户开启远程登陆权限 #a.进入容器 docker exec -it mysql /bin/bash #b.登陆MySQL本地 mysql -u root -p 输入root用户密码登录本地 #c.进入mysql库,查看root用户是否有远程权限 use mysql; select host from user where user='root'; 结果显示host栏对应的是localhost,那证明root用户没有远程登陆权限 #d.授予root用户远程登录权限,并刷新权限 update user set host='%' where user='root'; FLUSH PRIVILEGES; #e.检查授予root用户远程登录权限是否成功 select host from user where user='root'; 结果显示host栏对应的是%,证明授权成功
说明:如下是授予root用户远程登录权限的截图过程
f.MySQL修改密码
#进入mysql容器 docker exec -it 容器名 /bin/bash #本地登录MySQL或者用navicat远程连接登陆 mysql -u root -p #修改用户密码 ALTER USER 'root'@'%' IDENTIFIED BY '新密码'; #刷新权限 FLUSH PRIVILEGES;
标签:容器,log,root,MySQL,mnt,mysql,安装 From: https://www.cnblogs.com/sheepboy/p/18554968