换了新电脑,赶紧调教处理一番。比如装上ubuntu配成双系统,进行各种开发配置。

下载mysql镜像: dcoker pull mysql:tag

tag 即mysql版本号

一. 已知的几个国内镜像源

二. 修改镜像源配置

* 进入 /etc/systemd/system/multi-user.target.wants

* gedit docker.service (可以nano、vim等文本编辑器)

* 修改后示例:

ExecStart=/usr/bin/dockerd --registry-mirror=

三. 重启docker服务

service docker stop

systemctl daemon-reload

service docker start

四. ps: 如果觉得需要修改docker镜像的存储位置,也可以在docker.service的ExecStart修改。

修改后示例:

ExecStart=/usr/bin/dockerd --graph="/home/geng/sofeware/docker-images" --registry-mirror...

因为docker设置的分组为docker,可以把当前用户加入docker分组。然后使用"whereis docker",修改相关的文件分组为docker与用户为当前用户,网上说不要动不动就用root用户,还是有一定道理。修改文件分组与用户可使用"chown 命令"。

一. 快速启动

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

命令行意思就是创建一个名称为"some-mysql"的容器,并设置root用户密码为"my-secret-pw",然后后台运行该容器。

* --name -> 给新创建的容器命名

* -e -> 配置信息,这里配置mysql的root用户登录密码

* -d -> 后台运行该容器,并返回容器ID

* mysql:tag -> 指镜像名称

* 如果不知道"-e"可以修改哪些配置信息,

可以查阅底部参考文档中的"mysql docker官方文档"链接信息。官方文档有具体说明。

二. 个性化启动 一般情况下,mysql的安装与数据存储需要分开。如果相信玄学不怕容器被别人不小心干掉后,数据也一起丢失,可以不这么做。修改mysql的数据存储其实不难,使用docker run 的-v 参数即可设置。例如根据上面命令行进一步修改:

docker run --name some-mysql -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

-v -> 一般说挂载,通俗理解就是把容器内的/var/lib/mysql下内容,放到容器宿主系统的/my/own/datadir目录下。

三. docker操作容器的常用命令

* 启动docker容器后,可以是使用docker logs --tail 500 "容器命令"查看启动日志。

* 使用"docker exec -it mysql bash"可以进入在容器内,直接操作mysql。

* 剩下的,就是mysql相关命令,比如使用超级用户登录: "mysql -uroot -p"

一. docker run 时出现"error creating overlay mount to /var/lib/docker/overlay2"错误。

具体原因是docker的storage driver不一致导致。

* 停止docker服务 -> systemctl stop docker

* 进入 /etc/systemd/system/multi-user.target.wants,编辑docker.service

* 修改ExecStart=/usr/bin/dockerd --storage-driver=overlay...

* 然后重启docker服务 -> systemctl daemon-reload && service docker start

* 运行docker info,如果看到Storage Driver为overlay,说明修改成功

* 如果docker run还出现同样的错误,这时候需要检查放置docker镜像的磁盘文件系统格式。

因为我装的是双系统,把docker镜像放到了windows磁盘上,结果重复出现这样的错误。

二. 出现"--initialize specified but the data directory has files in it"错误。

查看"mysql docker官方文档"后,发现docker run命令行忽略MYSQLROOTPASSWORD设置,即可使用原有的数据库。以下是官方原话:

If you start your mysql container instance with a data directory that already contains a database (specifically, a mysql subdirectory), the $MYSQL_ROOT_PASSWORD variable should be omitted from the run command line; it will in any case be ignored, and the pre-existing database will not be changed in any way.

三. "Different lowercasetable_names settings for server ('0') and data dictionary ('1')"。

data dictionary是mysql8.0的新特性之一。因为我电脑装了win10与ubuntu双系统,而这两个系统使用同一份mysql数据库。windows版mysql的lowercasetablenames数值默认是1(大小写不敏感),linux版mysql的lowercasetablenames默认是0(大小写敏感)。由于windows版mysql先安装,所以数据库信息被设置为1,然后再安装linux版mysql就出现这样的错误。在"mysql Server System Variables"找到解决办法——就是在命令行末尾添加"--lowercasetable_names=1"。以下是官方原话:

On Windows the default value is 1. On macOS, the default value is 2. On Linux, a value of 2 is not supported; the server forces the value to 0 instead.

四. "/usr/sbin/mysqld (mysqld 8.0.13) starting as process 1 ... mysqld: File '.\binlog.xxxxx' not found"。

查了好久,发现这个是mysql的二进制文件出的问题。因为是个人电脑,利用二级制文件做数据恢复与主从复制的可能性不大,所以就把log-bin的功能关了。想深究的话,可以去看看mysql的binlog实现机制。

docker run --name mysql8.0 -v /media/geng/devolop/MySQL_DATA/Data:/var/lib/mysql -p 3306:3306 -d mysql:8.0 --lower_case_table_names=1 --skip-log-bin

之所以会想到window与ubuntu版的mysql共用使用一个数据库,主要因为我装了双系统,然后又想两个系统切换着开发,程序员就是喜欢瞎折腾。

如果不是因为这次,还真的不知道用了这么久的mysql一个个数据库,在物理磁盘对应着一个个的文件夹。既然是文件,由此肯定可以引申出文件的查找与读取技术。因为磁盘的IO访问,相比内存访问,慢了不知道多少倍。为了快速进行磁盘访问,在数据结构与算法中提及B树。不过mysql使用的是另外一种树结构——B+树。既然文件要加载到内存,就涉及到内存的合理使用问题。比如什么时候需要把内存数据写入磁盘,保持高性能。仔细想想的话,这里面就涉及到很多一般情况下接触不到的技术问题。这些问题,顺藤摸瓜查找下去,就会编织成一张无比复杂的知识网络。

可能有人会质疑这么搞会不会把数据库数据搞乱了,就算出了问题,也没什么所谓。毕竟是在个人的电脑上做开发,想怎么发挥就怎么发挥,可以不用考虑那么多。就像linux之父有次开玩笑说的,"我就是上帝"。软件开发就是有这样的好处,在别人的基础上,可以信马由缰。自由,不再是一个说说而已的名词,而是一个可以真真切切体验到的实质。尽管这是精神上的,但却是真真实实属于自己,别人无法夺走也无法干预。

可能有些人看不起这个精神上的,看不见摸不着的东西,要之何用。毕竟时间就是金钱,有时间做这些杂七杂八的,还不如多赚点钱然后买房买车,迎娶白富美,走上人生巅峰。其实这没什么,每个人都有自己对生活的想法,这也是他人的一种自由。

1. mysql docker官方文档

2. Docker 修改镜像源地址

3. 修改Docker默认镜像和容器的存储位置

4. Docker run命令

5. Docker-- Docker storage driver 概述

6. linux的ext4文件系统

7. FAT、HPFS 和 NTFS 文件系统概述

-cn/help//overview-of-fat-hpfs-and-ntfs-file-systems

8. mysql Server System Variables

9. Linux 权限机制

10. MySQL体系结构漫谈

-current-mysql-architecture-writings/

11. The Binary Log

12. Get Docker CE for Ubuntu

13. Mysql常用命令行大全

14. 从磁盘到B树到B+树