前言
今天在安装FastDFS的时候,需要重启一下服务器,当重启完成后,我天真的以为这大功告成,但是万万没想到,mysql数据库挂了。我的心情就像过山车一样,人生的大起大落实在是太刺激了,接下来又开始了无尽的搜索之旅。
问题复现
茫然状态
在最开始的时候,docker启动镜像是可以的,但是只是在服务器本地可以连接,远程客户端是无法连接,在Google一番后,发现大多都是连接用户的权限不够,又或者是主机没有匹配,但是我的原本是可以远程连接的,应该不会是这个问题,但是我还是按照这个思路去操作了一遍,进入了docker容器的伪终端,把容器的mysql.user表的root用户的host全改为了%,也就是通配了所有主机客户端,刷新权限之后退出进行连接,依然是连接失败,一筹莫展。
这里记录一下这些操作命令。
进入容器,也就是相当于是一台完整的机子了。
#5e1c2ad93664是容器的ID,这里改为自己的容器ID
docker exec -it 5e1c2ad93664 bash
登录容器里的mysql
mysql -uroot -p
回车后输入密码就进去了数据库,查看一下默认用户
SELECT host,user FROM mysql.user;
如图,接下来就是一些update语句,这里就不记录了。
这时我忽然想到了被遗忘的的iptables,因为我用的是Centos7.4版本,默认使用的firewalld,我在想会不会是iptables的问题,所以我突发奇想,先允许了所有的访问,然后清空了所有的默认规则。
[root@iZwz9c6u1iybgf3f7s8cg6Z sbin]# iptables -P INPUT ACCEPT
[root@iZwz9c6u1iybgf3f7s8cg6Z sbin]# iptables -F
如果还是习惯iptables,可以在Centos7上把firewalld干掉,改为iptables。
初现眉目
设置完iptables后,用docker启动mysql镜像的时候出现如下报错。
docker container start 5e1c2ad93664
Error response from daemon: error creating overlay mount to /var/lib/docker/overlay2/d7ebe99961402c62d7 21305b2d011c09b3b6ceb07dd448b6e07515794c3d178b/merged: invalid argument Error: failed to start containers: 5e1c2ad93664
看到这里我喜笑颜开,踏破铁无觅处,得来全不费工夫,出现了新的报错,事情就有了眉目,启动不报错,表面很正常的,然后运行有问题的才是最坑的,所以这里出现新的报错就差不多是已经找到了突破口。
Google一番后,发现有类似问题的,说是selinux的问题,但是我的selinux已经设为disabled,在启动容器失败后查看selinux状态。
着手解决
所以我的应该不是selinux的问题。在继续搜索一番后,找到了一个方法,禁用selinux,并且改变storage driver类型,我的selinux已经禁用,所以我修改了storage driver类型。
停止docker服务
systemctl stop docker
清理镜像
rm -rf /var/lib/docker
修改存储类型
vim /etc/sysconfig/docker-storage
改为overlay
DOCKER_STORAGE_OPTIONS=”–storage-driver overlay”
docker禁用selinux
vi /etc/sysconfig/docker
去掉OPTIONS的 --selinux-enabled
重新启动docker
systemctl start docker
一切都完成后,docker的镜像已经被清空,所以重新进行了一遍拉取镜像,新建容器,启动容器的操作。
[root@localhost ~]# docker pull mysql:5.7
Trying to pull repository docker.io/library/mysql ...
5.7: Pulling from docker.io/library/mysql
a5a6f2f73cd8: Pull complete
936836019e67: Pull complete
283fa4c95fb4: Pull complete
1f212fb371f9: Pull complete
e2ae0d063e89: Pull complete
5ed0ae805b65: Pull complete
0283dc49ef4e: Pull complete
a7905d9fbbea: Pull complete
cd2a65837235: Pull complete
5f906b8da5fe: Pull complete
e81e51815567: Pull complete
Digest: sha256:c23e9bfe66eeffc990cf6bce4bb0e9c5c85eb908170f3b3dde3e9a12c5a91689
Status: Downloaded newer image for docker.io/mysql:5.7
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/mysql 5.7 ae6b78bedf88 5 weeks ago 372 MB
[root@localhost ~]# docker run --name mysql5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=manage123456/ -d mys
ql:5.7
82ee563d029619134eefd8f9d4d687334bef6cd69c397860e2b36a045a88524e
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
82ee563d0296 mysql:5.7 "docker-entrypoint..." 5 seconds ago Up 4 seconds
0.0.0.0:3306->3306/tcp, 33060/tcp mysql5.7
完成之后去连接,连接成功,终于解决了,困扰了半天。
完成了这个之后,新增了开发用户,用root开发实在是太危险,无异于玩火,先进入到docker里的mysql,跟上面的步骤一样。
新建一个用户
create user ‘dev’@’%’ identified by ‘password’;
授予权限,我这里只需增删改查
grant select,delete,update,insert on manage.* to dev@’%’ identified by ‘password’;
刷新权限
flush privileges;
然后exit
退出用客户端进行连接测试。
可以看到,功德圆满了。
总结
这个问题我觉得是防火墙没有彻底禁用,或者没有写好脚本按照自己定义的规则去启动,所以造成关机重启了之后一切回到了默认状态,造成了这一个问题的出现,虽然这样是解决了,但是还不确定就是这样,如果只是iptables的问题,那我允许所有了之后,应该docker启动mysql之后就可以连接了,但是这时候的启动报了错,转移到了修改存储driver类型这个问题上,所以觉得有点奇怪,或者是有其他的因素在影响。
还是不懂深一层的原理,还得好好学习学习,深入践行DevOps。做到知其然,也知其所以然。