最近想在自己Windows电脑上跑一下最新版本的MySQL,因为在本机已经安装了5.x版本,不想再安装不同版本,因此尝试使用VM和Docker两种方式并做一下比较。
因为Docker容器运行是需要Linux系统支持的,所以Windows上Docker的host程序“Docker for Windows”本质上是先虚拟出了1个Linux系统再运行Docker容器,这是通过Windows的Hyper-V虚拟化技术来实现的。Win10里有这个Hyper-v feature,但是默认关闭,需要进入控制面板打开它,然后需要系统重启才可以。安装完后运行docker,没有问题,只是发现deamon程序启动特别慢,耗时好几分钟。
虚拟机使用熟悉的默认Virtual Box来安装Ubuntu 18.04,轻车熟路,只是比较费时,即使给虚拟机多分配一些内存和CPU资源并且避免安装office等套件,安装完毕也需要十几分钟。
说几点简单体会:
Docker的几个优点:
启动快,一个简单的命令就会自动pull镜像并运行。
抗折腾, 弄坏了容器,直接删掉重新pull一个即可,因为启动快,所以用时更少。
缺点:
1. 很多镜像并不是完整的系统,比如Ubuntu镜像,登陆进去后直接root,/home下面是空的,这让习惯了使用非root用户的很是别扭。
2. 镜像关闭,数据就会丢失,所以要求用户实现挂载数据卷才可以。
3. 对GUI支持不好,我找到了一个让Docker容器运行GUI程序的例子,https://medium.com/@adamhooper/in-mysql-never-use-utf8-use-utf8mb4-11761243e434 比如运行Firefox,效果很不好,刷新太慢了,比虚拟机还慢不少,没多少实用价值。
所以我觉得Docker还是适合运行各种不需要GUI的后台程序,比如web,数据库,API等。
而VM虚拟机的优缺点基本和Docker是相对的。启动慢但是系统完整,自动保存数据在内部,支持GUI程序。同时对于不想运行GUI的镜像,Virtual Box支持headless start方式,很是方便。所以我还是默默卸载了Docker,还是用VM的方式运行吧。
下面是折腾过程中根据搜索到的操作做的几点总结:
1. Ubuntu中彻底删除某个程序。 使用正则匹配方式。
How to fully remove ROS? sudo apt-get purge '^ros-*', to match really only things that startwith ros-, otherwise it will uninstall other packages that contain the string ros, like things with microsoft in the name.
remove mysql?
sudo apt-get remove --purge mysql*
sudo apt-get autoremove
sudo apt-get autoclean
2. 使用SSH从Windows访问Ubuntu VM
https://unix.stackexchange.com/questions/145997/trying-to-ssh-to-local-vm-ubuntu-with-putty
这个容易,就是在VM的网络设置里设置Port Forwarding,如下图所示,host ip设为本机,端口任意(最好避开22),Guest IP需要从VM镜像里ifconfig获得。
3. Ubuntu安装最新版本Mysql
https://www.tecmint.com/install-mysql-8-in-ubuntu/
4. MySQL8里默认采用utf8mb4编码的缘由,是因为MySQL里的utf8并不是标准的utf8,只有3个字节长,所以没法保存emoji等。下面是一些义愤填膺的帖子:
https://my.oschina.net/xsh1208/blog/1052781
https://medium.com/@adamhooper/in-mysql-never-use-utf8-use-utf8mb4-11761243e434
https://mathiasbynens.be/notes/mysql-utf8mb4#utf8-to-utf8mb4
mysql字符集utf8 和utf8mb4编码问题
最近看了一篇文章是关于Mysql中utf-8编码问题的,我们在Mysql中用到的utf8实际上不是真正的 UTF-8,在Mysql中utf8mb4才是真正的UTF-8。
在有些地方看到说utf8mb4相比于utf8是为了解决emoji(就是我们聊天的时候笑脸表情)问题,感觉这种说法对但是不完全对。utf8mb4相当于utf8的一个扩展,出现utf8mb4是因为现在Mysql中的utf8已经不能满足我们对字符编码的需求了。
Mysql从4.1 版本开始支持 UTF-8,最大字符长度为 3 字节,三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xFFFF,也就是 Unicode 中的基本多文平面(BMP)。也就是说,任何不在基本多文平面的 Unicode字符,都无法使用MySQL原有的 utf8 字符集存储。这些不在BMP中的字符包括哪些呢?最常见的就是Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android 手机上),和一些不常用的汉字,以及任何新增的 Unicode 字符等等。于是在MySQL5.5.3版本后就有了utf8mb4,它支持四个字节编码在utf8消耗空间一些,但是它可以支持跟多的字符。