Windows Docker环境下驯服Docker版MySQL(2) ——挂载Host文件夹使数据存储本地化

前一篇文章中,我们解决了最新版的MySQL密码加密策略的问题。但是作为我们使用来说还有个更严重的问题就是,一旦这些容器里运行的镜像实例数据库被删除了,那么数据也就丢失了,因为这些数据是存在容器里面的,容器本质上还是个虚拟机,所以这不是我们真正想要的。

当然我们可以很方便的通过如下的命令挂载本地的目录到Mysql镜像实例中,从而使数据库全部存储到主机本地:

docker run -d -P -v /d/docker/mysql/data2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=999999 --name mysql4 mysql:5.7

或者:

docker run -d -P -v d:\docker\mysql\data4:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=999999 --name mysql6 mysql

这里需要注意几点:

1、-v 参数列表中两种路径风格,一种是仿照linux的“/d/docker/mysql/data2”,另一种就是纯Windows的“d:\docker\mysql\data4”,两种都是可行的,当然正如你一贯理解的那样Windows风格的自然只能用在Windows Docker中;

2、在第一次共享主机目录给Docker镜像实例的时候,Windows Docker会让你输入当前用户的密码,你输入然后点ok就行了,此时你打开Windows Docker的Setting页面就可以看到变成了下面的这个样子:

其实本来我们应该先在这里设置共享某个驱动器,然后“Apply”的(也就是打钩先),但Docker设计思想的精髓就是一切都简单化,所以你用命令直接共享也是一样的。

3、这里特别要注意的就是共享给MySql的主机(Host)目录下必须是空的,一个文件、文件夹都不能有,否则MySQL的镜像实例启动就会出错;另外需要注意的就是MySQL镜像实例在第一次运行初始化的时候会创建默认的几个MySQL库到/var/lib/mysql目录下,这需要花费一定时间,我的笔记本环境下一般是在1分钟左右,所以即使在Run命令之后,你用Docker ps 命令看到容器已经在运行了,也要稍安勿躁多等一下,然后再用客户端工具去连接;

4、第一条命令中我特意在MySQL后面加上了标签5.7,这表示使用MySQL5.7版本的镜像启动一个容器实例,这样我们使用的就是5.7版的MySQL,也即我们不需要像前一篇文章中那样耐心细致的操作改变密码策略就可以直接连接MySQL了;

5、在前述文章以及本篇文章中,我都是使用了-P(大写P)命令将MySQL端口暴露到了本地主机(Host)的随机端口上,每次必须要用Docker ps来查看,目前我还观察到,当这些实例启动顺序或者启动停止再启动后端口号都会变化,这就要每次我们都需要修改客户端连接时的端口号,至少这对于一向懒惰的我来说是不可忍受的,所以建议使用-p(小写p)像下面这样指定固定的端口:

docker run -d -p 4306:3306 -p 43060:33060 -e MYSQL_ROOT_PASSWORD="999999" --name mysql6 mysql

6、最后其实对于上一篇那种针对高版本MySQL镜像实例中,繁琐的更改密码策略操作,只需要在启动的时候加入一个参数即可搞定:

docker run -d -p 4307:3306 -p 43070:33060 -e MYSQL_ROOT_PASSWORD="999999" --name mysql7 mysql --default-authentication-plugin=mysql_native_password

7、类似上面的这样的命令参数选项完整的列表可以运行下面的命令进行查看:

docker run -it --rm mysql --verbose --help

8、对于这些选项如果全部用命令行参数可能会很不方便,此时建议挂载一个配置文件(扩展名*.cnf),比如Config.cnf,其内容如下:

[mysqld]
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

当然cnf文件中的选项,你可以使用刚才的命令查看后按需放入cnf文件中。

接着将cnf命令放在一个单独的目录里,然后使用如下命令,将cnf文件挂载给MySQL镜像:

docker run -d -P --privileged=true -v /d/docker/mysql/conf/config.cnf:/etc/mysql/my.cnf -v /d/docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=999999 --name mysql3 mysql

这里为了保险起见特意加多一个命令参数--privileged=true,表示在MySQL容器实例内部打开最高的root账户权限,防止因权限限制问题出现启动失败的情况。当然对于这些官方的镜像来说,一般不会有权限不够方面的问题。

发布了94 篇原创文章 · 获赞 89 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/u014038143/article/details/99586295
今日推荐