MySQL容器:授予访问权限并创build一个新的映像
我正在尝试在我的主机系统中使用MySQL docker容器,使安装和configuration过程变得更加简单快捷。
所以,我已经从https://hub.docker.com/r/mysql/mysql-server/
然后根据这个图像启动容器
容器启动正常,但我无法从我的主机系统连接到这个数据库(如果我尝试从容器连接,一切正常)。 它失败了一条消息:
ERROR 1130 (HY000): Host '<here goes my IP>' is not allowed to connect to this MySQL server
所以,据我所知,我的root
用户没有足够的权限。
我input了我的容器:
docker exec -it mysql bash
连接到DB:
mysql -uroot -ppassword
更新了我的root用户的权限:
use mysql; UPDATE user SET Host="%" WHERE User='root';
它的更新很好。
比我决定保存我更新的图像莫名其妙…我find了这个指南:
http://docs.oracle.com/cd/E52668_01/E75728/html/section_c5q_n2z_fp.html
执行完后:
docker stop mysql docker commit -m "Fixed permissions for root user" -a "Few words about author" `docker ps -l -q` myrepo/mysql:v1 docker rm mysql docker run --name new-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=pass -d myrepo/mysql:v1
我发现我的root
用户没有权限了。
这里有什么问题? 如何将我更新的图像公开到我的Dockerhub?
该映像在https://github.com/mysql/mysql-docker/blob/mysql-server/5.7/Dockerfile#L11中指定了保留MySQL数据的默认卷。 当您启动容器时,将为该容器创build一个卷。 当你更新root
用户的权限时,它被保存在这个卷中(它实际上是mysql
数据库的MySQL数据的一部分)。 但是,一旦你删除了容器,该卷也丢失了。
在这种情况下,通常有两件事可以保留容器重启之间的数据甚至是新的容器:
- 创build一个命名卷并在那里安装数据。 要做到这一点,你可以运行
docker volume create mysqldata
。 然后,启动容器的时候用-v mysqldata:/var/lib/mysql
装入数据。 即使您停止或删除您的MySQL容器,该卷仍将保留。 - 将数据绑定到主机文件夹。 您可以只装载一个文件夹(如
-v /mnt/mysqldata:/var/lib/mysql
,而不是创build卷。 这会将所有的MySQL数据保存在/mnt/mysqldata
主机上。
虽然这些不是坚持数据的唯一方法,但它们是两种内置的方法。 还有Docker卷插件允许您使用其他存储介质(例如,NFS的https://github.com/rancher/convoy和NetApp的https://github.com/NetApp/netappdvp )。
我的原始答案是在MySQL数据初始化后保持更改。 但是既然你想在图像中为每个初始化自动执行此操作,那么就有一个不同的方法。 您可以使用以下选项之一:
- 有一个名为
MYSQL_ROOT_HOST
的环境variables,可以设置主机( https://github.com/mysql/mysql-docker/blob/mysql-server/5.7/docker-entrypoint.sh#L63-L69 )。 您应该可以将其设置为%
以允许所有主机以root
身份进行连接,例如-e MYSQL_ROOT_HOST="%"
。 - 该映像支持将SQL文件添加到
/docker-entrypoint-initdb.d/
以在启动时进行初始化( https://github.com/mysql/mysql-docker/blob/mysql-server/5.7/docker-entrypoint.sh# L98-L105 )。 你可以创build你的SQL文件有UPDATE mysql.user SET Host="%" WHERE User='root';
然后将该文件添加到您自己映像中的/docker-entrypoint-initdb.d/
。 然后,当启动一个基于该映像的容器时,它将初始化该SQL文件。