昨天在写项目的时候需要用到Percona这个Mysql的衍生版本,所以想用Doker来安装。结果踩了一晚上的坑,今天早上终于解决了。记录在这里。出现这个坑的原因是我对linux的目录权限问题不敏感。造成的。我的系统是ubuntu16.04,运行dockerpullpercona拉取镜像一切正常。拉取后,输入dockerimages查看所有镜像,显示正常:然后我创建一个容器,命令是(执行时不要换行):dockercreate--namepercona-v/data/mysql-data:/var/lib/mysql-p3306:3306-eMYSQL_ROOT_PASSWORD=rootpercona:lates这个命令的意思是我创建一个名为percona的容器,然后将我本地的/data/mysql-data目录映射到/var/lib/docker容器中的mysql目录并指定3306端口,然后设置数据库root用户密码为root,最后percona:latest指定我上面拉取的版本。因为docker容器中的数据库只是一个镜像,可以理解为并不真正存在。映射到我的本地目录的作用是可以将docker存放在/var/lib/mysql目录下的数据同步存放到我本地的/data/mysql-data目录下。这样保证了数据不会丢失,方便我在本地操作。如果对命令的参数不了解,可以阅读官方文档或者搜索docker视频教程。有解释。然后我打开这个容器,dockerstartpercona。打开后,查询所有正在运行的容器dockerps。这时候出问题了:是空的,也就是没有找到正在运行的容器……然后我查看了所有的容器,包括running和Notrunning。dockerps-a,显示如下:原来是端口没有绑定成功,所以没有运行!,每次运行都自动退出。这时查看docker日志,输入命令dockerlogscontainerid,显示如下:注意:这里的71是我容器的container_id的前两位数字,docker支持这种简化写法。日志报错说我没有容器中/var/lib/mysql目录的创建和写入权限。现在找到这个问题的原因已经找到了,但是找了一晚上也没有解决,不行不得不说,网上一些不负责任的水帖真是坑啊!早上终于找到解决办法:查看我本地目录的属主和docker容器中的/var/lib/mysql目录是否是同一个user.dockerrun-ti--rm--entrypoint="/bin/bash"percona-c"whoami&&id"该命令的作用是查看容器的属主,显示为:然后输入(无换行):dockerrun-ti--rm-v/data/mysql-data:/var/lib/mysql--entrypoint="/bin/bash"percona-c"ls-la/var/lib/mysql"这个命令的作用查看映射的本地数据卷时,所有者的原因这个目录在这里。这就是为什么mysql用户访问docker中的目录时,会报权限错误的原因!因为本地映射目录的所有者是root用户,而docker容器/var/lib/mysql目录的所有者是mysql用户,uid是999!那么解决方法就是将当前目录的属主分配给uid999,也就是mysql用户,然后重启容器即可解决问题!整个晚上都是浪费时间。不得不说,linux权限控制的知识还需要加深!
