眼睛说:我会用docker部署MySQL8了;手说:不,你不会

眼睛说:我会用docker部署MySQL8了;手说:不,你不会,第1张

文章目录 安装前准备保证centos 7能够连外网。关闭防火墙修改centos为中国时区关闭SELinux更新 *** 作系统: 安装docker查看当前可安装的docker版本设置yum源为阿里源安装docker版本检查docker是否安装成功启动docker服务关于防火墙补充说明 安装mysql规划Mysql目录拉取docker镜像拷贝my.cnf启动mysql容器docker启动成功后需要设置远程访问权限 测试MySql8是否可用docker部署mysql8常见问题解决pull 镜像时 Downloading 卡住的问题。Docer启动失败报:mysqld: Error on realpath() on '/var/lib/mysql-files' (Error 2 - No such file or directory)mysql客户端访问报错:The driver has not received any packets from the servermessage from server: "Host 'XXX.XXX.X.XX' is not allowed to connect to this MySQL serverAccess denied for user 'root'@'XXX.XXX.X.XX' (using password: YES) Access denied for user 'root'@'mysql8下修改 lower_case_table_names对于新安装的MYSQL对于已经安装MYSQLdocker安装的mysql

安装前准备 保证centos 7能够连外网。 关闭防火墙 修改centos为中国时区
[root@localhost ~]# date
Fri May 13 07:25:15 PDT 2022
[root@localhost ~]# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
cp: overwrite '/etc/localtime'? y
[root@localhost ~]# date
Fri May 13 22:25:53 CST 2022
关闭SELinux

SELinux本身是一个安全组件,但是根据官方文档,现在并不是所有的程序都能完美支持SELinux,而且涉及到服务器安全的话,现在也有太多好的方案可以选择,所以这个SELinux关掉就好,避免出现诡异的问题

vim /etc/sysconfig/selinux

修改SELINUX=enforcing为SELINUX=disabled
保存后重启系统。

更新 *** 作系统:
yum -y update
安装docker

cento 7 下安装docker比较简单。

查看当前可安装的docker版本
[root@localhost /]# yum list docker-ce --showduplicates | sort -r
BDB2053 Freeing read locks for locker 0x588: 75174/140274931337024
 * updates: mirror.lzu.edu.cn
Loading mirror speeds from cached hostfile
Loaded plugins: fastestmirror, langpacks
 * extras: ftp.sjtu.edu.cn
docker-ce.x86_64            3:20.10.9-3.el7                     docker-ce-stable
docker-ce.x86_64            3:20.10.8-3.el7                     docker-ce-stable
docker-ce.x86_64            3:20.10.7-3.el7                     docker-ce-stable
docker-ce.x86_64            3:20.10.6-3.el7                     docker-ce-stable
docker-ce.x86_64            3:20.10.5-3.el7                     docker-ce-stable
docker-ce.x86_64            3:20.10.4-3.el7                     docker-ce-stable
docker-ce.x86_64            3:20.10.3-3.el7                     docker-ce-stable
docker-ce.x86_64            3:20.10.2-3.el7                     docker-ce-stable
docker-ce.x86_64            3:20.10.16-3.el7                    docker-ce-stable
docker-ce.x86_64            3:20.10.15-3.el7                    docker-ce-stable
docker-ce.x86_64            3:20.10.14-3.el7                    docker-ce-stable
docker-ce.x86_64            3:20.10.1-3.el7                     docker-ce-stable
docker-ce.x86_64            3:20.10.13-3.el7                    docker-ce-stable
docker-ce.x86_64            3:20.10.12-3.el7                    docker-ce-stable
docker-ce.x86_64            3:20.10.11-3.el7                    docker-ce-stable
docker-ce.x86_64            3:20.10.10-3.el7                    docker-ce-stable
docker-ce.x86_64            3:20.10.0-3.el7                     docker-ce-stable
docker-ce.x86_64            3:19.03.9-3.el7                     docker-ce-stable
docker-ce.x86_64            3:19.03.8-3.el7                     docker-ce-stable
docker-ce.x86_64            3:19.03.7-3.el7                     docker-ce-stable
docker-ce.x86_64            3:19.03.6-3.el7                     docker-ce-stable
docker-ce.x86_64            3:19.03.5-3.el7                     docker-ce-stable
docker-ce.x86_64            3:19.03.4-3.el7                     docker-ce-stable
docker-ce.x86_64            3:19.03.3-3.el7                     docker-ce-stable
docker-ce.x86_64            3:19.03.2-3.el7                     docker-ce-stable
docker-ce.x86_64            3:19.03.15-3.el7                    docker-ce-stable
docker-ce.x86_64            3:19.03.14-3.el7                    docker-ce-stable
docker-ce.x86_64            3:19.03.1-3.el7                     docker-ce-stable
docker-ce.x86_64            3:19.03.13-3.el7                    docker-ce-stable
docker-ce.x86_64            3:19.03.12-3.el7                    docker-ce-stable
docker-ce.x86_64            3:19.03.11-3.el7                    docker-ce-stable
docker-ce.x86_64            3:19.03.10-3.el7                    docker-ce-stable
docker-ce.x86_64            3:19.03.0-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.9-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.8-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.7-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.6-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.5-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.4-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.3-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.2-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.1-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.0-3.el7                     docker-ce-stable
docker-ce.x86_64            18.06.3.ce-3.el7                    docker-ce-stable
docker-ce.x86_64            18.06.2.ce-3.el7                    docker-ce-stable
docker-ce.x86_64            18.06.1.ce-3.el7                    docker-ce-stable
docker-ce.x86_64            18.06.0.ce-3.el7                    docker-ce-stable
docker-ce.x86_64            18.03.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            18.03.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.12.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.12.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.09.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.09.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.06.2.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.06.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.06.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.03.3.ce-1.el7                    docker-ce-stable
docker-ce.x86_64            17.03.2.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.03.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.03.0.ce-1.el7.centos             docker-ce-stable
 * base: ftp.sjtu.edu.cn
Available Packages

其他文章有说要安装更新包,但是我自己 *** 作并不用特意安装,在这里贴出来如果真有需要的可以执行一下。

yum install -y yum-utils device-mapper-persistent-data lvm2
设置yum源为阿里源

不然使用默认源的话时间会比较长。

[root@localhost ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
Loaded plugins: fastestmirror, langpacks
adding repo from: http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
grabbing file http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo
安装docker版本

选择一个docker安装版本,版本的规则:docker-ce-版本号,比如上面的第一行记录

docker-ce.x86_64            3:20.10.9-3.el7                     docker-ce-stable

20.10.9-3.el7就是他的版本号

yum -y install docker-ce-20.10.9-3.el7

控制台输出内容太多,就不粘贴了。

检查docker是否安装成功
[root@localhost ~]# docker version
Client: Docker Engine - Community
 Version:           20.10.16
 API version:       1.41
 Go version:        go1.17.10
 Git commit:        aa7e414
 Built:             Thu May 12 09:19:45 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

出现如上信息说明docker安装成功,只是没有启动而已。
设置docker 开机自动启动

systemctl enable docker
启动docker服务
systemctl start docker

使用docker version命令查看docker是否启动成功

[root@localhost ~]# docker version
Client: Docker Engine - Community
 Version:           20.10.16
 API version:       1.41
 Go version:        go1.17.10
 Git commit:        aa7e414
 Built:             Thu May 12 09:19:45 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.16
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.17.10
  Git commit:       f756502
  Built:            Thu May 12 09:18:08 2022
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.4
  GitCommit:        212e8b6fa2f44b9c21b2798135fc6fb7c53efc16
 runc:
  Version:          1.1.1
  GitCommit:        v1.1.1-0-g52de29d
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
关于防火墙补充说明

生产环境一般不会关闭防火墙,而个人练习环境或者研发环境一般都是关闭防火墙的。如果你是在防火墙开启状态下安装的docker并启动的服务,后续使用docker容器时保持防火墙开启就好,反之就一直保持防火墙关闭,主要是为了避免docker服务无法连通的情况。其实通过配置firewall和iptables也能解决,只是麻烦了一点。

安装mysql 规划Mysql目录

因为使用docker安装,所以必须规划好映射目录。docker的映射目录是为了实现数据持久化,不然docker重启后容器内所有修改的内容都会丢失。对于线上生产环境来说就是严重的事故。需要规划的目录内容包括:

配置文件my.cnf数据文件目录日志文件目录redo文件目录。mysql-files目录,如果不指定的话会导致docker服务无法正常启动

端口一般用默认的就好。
首先df -h查看硬盘情况

mysql的映射目录,建议创建一个单独的目录,将mysql所有的映射目录都放在这个目录,方便管理。以下创建映射目录和文件。

mkdir -p /data/mysql/docker/
mkdir -p /data/mysql/docker/mysql-files
mkdir -p /data/mysql/docker/mysql
cd /data/mysql/docker/
vim my.cnf
# 输入一个空行保存退出即可
vim error.log
# 输入一个空行保存退出即可
拉取docker镜像

直接最新版本:

[root@localhost ~]# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
c32ce6654453: Downloading  20.53MB
415d08ee031a: Download complete 
7a38fec2542f: Download complete 
352881ee8fe9: Download complete 
b8e20da291b6: Download complete 
66c2a8cc1999: Download complete 
d3a3a8e49878: Download complete 
e33a48832bec: Download complete 
410b942b8b28: Downloading [=======>                                           ]  17.28MB/109.1MB
d5323c9dd265: Download complete 
3212737f31c0: Download complete 
d0032d4b0dc5: Download complete 

等待pull结束。

拷贝my.cnf

首先启动过一个临时的容器,以便拷贝出my.cnf。不然直接用映射目录启动docker后,my.cnf是空的。

docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456  --name temp mysql
docker ps
#获取到镜像ID:063daa9d6a43,然后拷贝文件
docker cp 063d:/etc/mysql/my.cnf /data/mysql/docker/my.cnf
# 拷贝结束后删除docker
docker stop 063daa9d6a43
docker rm 063daa9d6a43

在网络上有的人说要增加skip-grant-tables,这样可以解决root用户无法在容器内登录的问题,我的建议这个参数非必要不要增加,会导致其他问题,例如 read 0 bytes before connection was unexpectedly lost。```

启动mysql容器

如果按照上面的映射目录,则启动docker的命令如下:

docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /data/mysql/docker/my.cnf:/etc/mysql/my.cnf -v /data/mysql/docker/mysql-files:/var/lib/mysql-files -v /data/mysql/docker/mysql:/var/lib/mysql -v /data/mysql/docker/error.log:/var/log/mysql/error.log --name mysql-8.0 mysql

其中最后一个mysql,是我的镜像名称,具体镜像名称可以用images查看:

[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
mysql        latest    3218b38490ce   4 months ago   516MB
docker启动成功后需要设置远程访问权限

不然客户端无法登录数据库

docker exec -it 6734 /bin/bash #其中6734是容器id,用docker ps可以查看
mysql -uroot
use mysql;
update user set host='%' where user='root';
FLUSH PRIVILEGES;
测试MySql8是否可用

新建一个SQL编辑器,执行SQL命令成功即可。

docker部署mysql8常见问题解决 pull 镜像时 Downloading 卡住的问题。

在pull 镜像时,出现 Downloading总是卡住,每次重启docker能多安装一些,或者等待很长时间才能走一点点。
网络上说需要重新安装docker,我的环境上并不起作用,reboot了也不行。最后还是通过设置阿里云加速解决的。
首先登录阿里云,进入镜像工具-镜像加速,复制加速地址。

vim /etc/docker/daemon.json

将加速的内容复制粘贴进去,注意这里的加速地址需要更新成你自己的,因为这个地址不是长久有效的。

{
  "registry-mirrors": ["https://gten58ev.mirror.aliyuncs.com"]
}

wq保存,然后重启相关服务

sudo systemctl daemon-reload
sudo systemctl restart docker

再次pull时就很快了。

[root@localhost ~]# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
72a69066d2fe: Pull complete 
93619dbc5b36: Pull complete 
99da31dd6142: Pull complete 
626033c43d70: Pull complete 
37d5d7efb64e: Pull complete 
ac563158d721: Pull complete 
d2ba16033dad: Pull complete 
688ba7d5c01a: Pull complete 
00e060b6d11d: Pull complete 
1c04857f594f: Pull complete 
4d7cfa90e6ea: Pull complete 
e0431212d27d: Pull complete 
Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
Docer启动失败报:mysqld: Error on realpath() on ‘/var/lib/mysql-files’ (Error 2 - No such file or directory)

原因就是在启动docker时映射目录没有指定mysql-files,指定了外部配置文件与外部存储路径时也需要同时指定mysql-files。
解决方法:增加-v /data/mysql/docker/mysql-files:/var/lib/mysql-files即可,其中 /data/mysql/docker/是你自己创建的映射目录,根据实际目录改写即可。

mysql客户端访问报错:The driver has not received any packets from the server

DOCKER服务启动后,在服务器本地能访问mysql,但是客户端远程访问的时候却提示:read 0 bytes before connection was unexpectedly lost.,具体的报错信息如下:

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
  Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.

这个情况下先检查下你的my.cnf里是不是有skip-grant-tables,如果有则去掉。然后重启docker服务

docker restart 6734dcb7c0ac

然后登录docker容器

docker exec -it 6734dcb7c0ac /bin/bash

进入mysql

mysql -uroot
use mysql
SET PASSWORD FOR root@localhost = '123456';

如果你碰到这个问题的时候,很可能你的客户端远程登录也访问不了。MYSQL8下开启远程访问权限和之前的版本不一样

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
mysql> update user set host='%' where user='root';
mysql> flush privileges;

此时再用客户端连接就可以了。

message from server: "Host ‘XXX.XXX.X.XX’ is not allowed to connect to this MySQL server

设置远程登录即可。

docker exec -it 6734 /bin/bash #其中6734是容器id,用docker ps可以查看
mysql -uroot
use mysql;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
FLUSH PRIVILEGES;
Access denied for user ‘root’@‘XXX.XXX.X.XX’ (using password: YES) Access denied for user ‘root’@’

按照如下步骤解决:

docker exec -it 6734 /bin/bash #其中6734是容器id,用docker ps可以查看
mysql -uroot
use mysql;
SET PASSWORD FOR root@localhost = '123456';
update user set host='%' where user='root';
FLUSH PRIVILEGES;

不用重启docker,重新登录即可。

mysql8下修改 lower_case_table_names

lower_case_table_names的作用是设置大小写敏感,一般是lower_case_table_names=1也就是大小写不敏感,对于表名TEST或者test,都可以用select * from test来执行查询;默认是大小写敏感的。
mysql8以前的版本修改 lower_case_table_names 很简单,在配置文件中设置 lower_case_table_names =1然后重启一下服务就可以了。但是从mysql8开始已经不能这么做了。从mysql8开始有一部分参数要求必须和MYSQL服务初始化时相同,也就是你建MYSQL时这个参数什么样,以后就必须一直是这个样子。 lower_case_table_names 是其中之一。

对于新安装的MYSQL

在my.cnf中设置 lower_case_table_names=1然后启动就可以,这个其实很简单。

对于已经安装MYSQL

已经安装的mysql有点麻烦, *** 作步骤如下:

首先备份数据库。从MYSQL8开始就不用想着能无缝修改了。然后在my.cnf中修改 lower_case_table_names=1,并保存;接着删除/var/lib/mysql目录,也就是删除mysql的数据库目录重启mysql服务;恢复数据库。 docker安装的mysql

修改步骤类似,只是docker中的一般会把my.cnf映射出来,你记得在你映射的目录中修改就好。
参考如下步骤:

首先备份数据库。在my.cnf中修改 lower_case_table_names=1,并保存;停止docker或者在docker容器中停止mysql服务。接着删除/var/lib/mysql目录,如果该目录映射了就直接删除你映射的mysql目录,否则去docker里删除/var/lib/mysql重启mysql服务;恢复数据库。

按照如上步骤修改完并重启后,Mysql应该是已经不区分大小写了。

mysql> show variables like '%lower_case_table_names%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| lower_case_table_names | 1     |
+------------------------+-------+
1 row in set (0.00 sec)

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/927238.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-17
下一篇 2022-05-17

发表评论

登录后才能评论

评论列表(0条)

保存