MySQL Docker 配置文件挂载 问题

跨虚拟机Docker环境下,拉起MySQL挂载磁盘是,估计大家都会遇到的问题

问题

Docker 拉起官方的 MySQL容器,指定使用挂载的配置文件时,报错如下:

mysql: [Warning] World-writable config file '/etc/mysql/conf.d/mysql.cnf' is ignored.

解决否

已解决

方案

这其实是 Docker 在 Windows 下的坑! 当然了 Docker for Mac 也遇到同样的问题。

这牵涉到MySQL对配置文件的可见性安全性的一个要求。MySQL希望它的配置文件是不可编辑的,可查看不可写的。所以就需要配置对应的umask 0555.

以上问题在特定环境下才会暴露出来。我这边是 Mac OS从宿主机的磁盘一路挂载到vbox,再挂载到Docker,垮了3个环境。为了方便,我直接umask就是 0777。

因为需要在宿主机上编辑代码,Docker环境内运行测试代码。

Windows 上环境我也试过,宿主机挂载到vbox,vbox里装了一个Ubuntu虚拟机,虚拟机内安装了Dcoker,也是跨了3个环境,Windows的磁盘和Linux的权限管理是两套体系,所以umask就直接在vbox上配置了。

那么现在MySQL容器需要的是 0555 权限,我尝试在Ubuntu虚拟机中将挂载的目录的访问权限改为 0555,但没有成功,改不动。

具体原因没有深究, 网上也查阅了很多方案,都试了没成功,接下来是我自己摸索出来方案。

我的解决方案是这样:

把同一个目录在vbox里面的Ubuntu虚拟机内挂载了两次,也就是同一个文件夹挂载了两个文件夹,然后两个文件夹的umask 不一样。

配置如下:

sudo mount -t vboxsf -o umask=000,dmode=777,fmode=777 Jumei /mnt/vbox
sudo mount -t vboxsf -o umask=222 Jumei /mnt/ro-vbox

这样,你挂载代码啊,MySQL的数据目录/var/lib/mysql/,就挂载0777目录——/mnt/vbox下,当需要挂载只读配置文件时,Docker volume就挂载 /mnt/ro-vbox 目录,这样就满足了配置文件只读,数据文件读写的配置要求。

以下是样例:

file: ./docker-compose.yaml

version: "2"
    mysql:
        image: mysql:5.7
        ports:
            - "3306:3306"
        volumes:
            - /mnt/ro-vbox/compose/bs/config/mysql/my.cnf:/etc/mysql/my.cnf:ro
            - /mnt/ro-vbox/compose/bs/config/mysql/conf.d:/etc/mysql/conf.d:ro
            - /mnt/vbox/compose/bs/mysql/:/var/lib/mysql/:rw
            - /mnt/vbox/compose/bs/log/mysql/:/var/log/mysql/:rw
        environment:
            MYSQL_ROOT_PASSWORD: "123456"
        networks:
            tasker_net:
                ipv4_address: "192.168.0.6"

Linux du、df、free 查看内存 磁盘剩余空间

如何用Linux命令查看磁盘,内存的占用,来看看du,df,free这三个命令的用法

du

显示每个文件和目录的磁盘使用空间,df 是来自于coreutils 软件包,系统安装时,就自带的;我们通过这个命令可以查看磁盘的使用情况以及文件系统被挂载的位置;

du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的。

参数:

-a或-all 显示目录中个别文件的大小。
-b或-bytes 显示目录或文件大小时,以byte为单位。
-c或--total 除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。
-k或--kilobytes 以KB(1024bytes)为单位输出。
-m或--megabytes 以MB为单位输出。
-s或--summarize 仅显示总计,只列出最后加总的值。
-h或--human-readable 以K,M,G为单位,提高信息的可读性。
-x或--one-file-xystem 以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过。
-L<符号链接>或--dereference<符号链接> 显示选项中所指定符号链接的源文件大小。
-S或--separate-dirs 显示个别目录的大小时,并不含其子目录的大小。
-X<文件>或--exclude-from=<文件> 在<文件>指定目录或文件。
--exclude=<目录或文件> 略过指定的目录或文件。
-D或--dereference-args 显示指定符号链接的源文件大小。
-H或--si 与-h参数相同,但是K,M,G是以1000为换算单位。
-l或--count-links 重复计算硬件链接的文件。

使用小例子

## 展示home目录占有空间大小
$ du -hs /home

## 展示 更目录下所有文件、文件夹占用空间大小
$ du -hs /* 

## 展示这个文件终于空间大小
$ du -hs /var/log/nginx.log

df命令

df命令用于显示目前在Linux系统上的文件系统的磁盘使用情况统计,显示指定磁盘文件的可用空间。默认显示单位为KB。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。

-a或--all:包含全部的文件系统;
--block-size=<区块大小>:以指定的区块大小来显示区块数目;
-h或--human-readable:以可读性较高的方式来显示信息;
-H或--si:与-h参数相同,但在计算时是以1000 Bytes为换算单位而非1024 Bytes;
-i或--inodes:显示inode的信息;
-k或--kilobytes:指定区块大小为1024字节;
-l或--local:仅显示本地端的文件系统;
-m或--megabytes:指定区块大小为1048576字节;
--no-sync:在取得磁盘使用信息前,不要执行sync指令,此为预设值;
-P或--portability:使用POSIX的输出格式;
--sync:在取得磁盘使用信息前,先执行sync指令;
-t<文件系统类型>或--type=<文件系统类型>:仅显示指定文件系统类型的磁盘信息;
-T或--print-type:显示文件系统的类型;
-x<文件系统类型>或--exclude-type=<文件系统类型>:不要显示指定文件系统类型的磁盘信息;
--help:显示帮助;
--version:显示版本信息。

使用小例

## 展示磁盘使用情况
$ df -h

## 展示磁盘使用情况以及挂在的磁盘类型
$ df -Th

free命令

free命令是一个显示系统中空闲和已用内存大小的工具。free指令会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段,以及系统核心使用的缓冲区等

-b  以Byte为单位显示内存使用情况。
-k  以KB为单位显示内存使用情况。
-m  以MB为单位显示内存使用情况。
-o  不显示缓冲区调节列。
-s<间隔秒数>  持续观察内存使用状况。
-t  显示内存总和列。
-V  显示版本信息。

输出行介绍

  • Mem:表示物理内存统计
  • total:表示物理内存总量(total = used + free)
  • used:表示总计分配给缓存(包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使用。
  • free:未被分配的内存。shared:共享内存。
  • buffers:系统分配但未被使用的buffers 数量。cached:系统分配但未被使用的cache 数量

缓存区
– -/+ buffers/cache:表示物理内存的缓存统计
– used2:也就是第一行中的used – buffers-cached 也是实际使用的内存总量。 //used2为第二行
– free2= buffers1 + cached1 + free1 //free2为第二行、buffers1等为第一行
– free2:未被使用的buffers 与cache 和未被分配的内存之和,这就是系统当前实际可用内存。
– Swap:表示硬盘上交换分区的使用情况

使用小例

## 展示当前系统内存占用
$ free 

## 展示内存使用,单位 -m
$ free -m

## 展示系统内存占用,以及交换区
$ free -mt

## 没3s展示一次 系统内存、交换区使用情况
$ free -mt -s 3

Linux tar gzip bzip zip打包 压缩 解压 命令

每次拿到压缩文件都不知道怎么解包,还在拿着后缀去百度?快快收下这篇文章吧,涵盖所有压缩格式,一站解决。

打包压缩格式

  • .zip
  • .gz
  • .bz2
  • .tar
  • .tar.gz
  • .tar.bz2

.tar格式

打包

$ tar -cvf 打包输出文件 源文件or文件目录
  • 参数说明
-c : 打包
-v或--verbose: 显示打包过程
-f : 指定打包后的文件名

解压文件

$ tar -xvf 打包文件

## 查看内部有啥文件
$ tar -tv 打包文件
  • 参数说明
-x或--extract或--get: 从备份文件中还原文件;
-v : 展示过程
-t或--list : 列出备份文件的内容;

.gz 格式

压缩文件

## 注意:源文件会消失!
$ gzip 源文件

## 压缩文件,源文件保留
$ gzip -c -3 源文件 > 压缩文件.gz

## 递归的压缩目录
$ gzip -rv 目录
  • 参数说明
-r或——recursive:递归处理,将指定目录下的所有文件及子目录一并处理
-<压缩效率>:压缩效率是一个介于1~9的数值,预设值为“6”,指定愈大的数值,压缩效率就会愈高;

解压缩

$ gzip -d 压缩文件

$ gunzip 压缩文件

## 详细显示中压缩的文件的信息,并不解压
$ gzip -l *

## 把当前目录中中每个压缩的文件解压,并列出详细的信息
$ gzip -dv ./*
  • 参数说明
-l或——list:列出压缩文件的相关信息;
-d或--decompress或----uncompress:解开压缩文件;

gunzip命令用来解压缩文件。gunzip是个使用广泛的解压缩程序,它用于解开被gzip压缩过的文件,这些压缩文件预设最后的扩展名为.gz。事实上gunzip就是gzip的硬连接,因此不论是压缩或解压缩,都可通过gzip指令单独完成。

.tar.gz 格式

其实,.tar.gz 格式是先将文件或目录打包文 .tar 格式,再压缩为 .gz 格式

压缩

$ tar -zcvf 压缩文件名.tar.gz 源文件

参数说明

-z或--gzip或--ungzip:通过`gzip`指令处理备份文件; 也就是 `.tar.gz`

解压

$ tar -zxvf 压缩包名.tar.gz

参数说明:

-z : 解压缩
-t : 查看压缩保内文件,但是不解压缩

.bz2 格式

压缩

## 源文件会移除
$ bzip2 源文件

## 保留源文件
$ bzip2 -k 源文件
  • 参数说明
-d或——decompress:执行解压缩;
-c或——stdout:将压缩与解压缩的结果送到标准输出;
-k或——keep:bzip2在压缩或解压缩后,会删除原始文件。若要保留原始文件,请使用此参数;

bzip2 不能压缩目录

解压缩

## 解压缩,默认不保留压缩文件。加 -k 可保留压缩文件
$ bzip2 -d 压缩文件

## 解压到标准输出:
$ bzip2 -dc filename.bz2 > filename

## 检查展示压缩文件内容,不解压
$ bzip2 -tv zipFile.bz2
  • 参数说明
-d或——decompress:执行解压缩;
-t或——test:测试.bz2压缩文件的完整性;
-v或——verbose:压缩或解压缩文件时,显示详细的信息;

.tar.bz2 格式

.tar.bz2 格式是先将文件或目录打包文 .tar 格式,再压缩为 .bz2 格式

压缩

tar -jxvf 压缩包名.tar.bz2 源文件or文件目录
  • 参数说明
-j : 使用`bzip2`处理,压缩为 .tar.bz2 格式

解压

$ tar -jxvf 压缩包名.tar.bz2
  • 参数说明:
-x : 解压
-t : 查看压缩保内文件,但是不解压缩
-C : 指定解压的目录(注意,该选项必须放在后面)

.zip 格式

一般Linux没有默认安装 zip 软件,需要手动安装 zip 以及 unzip 两个软件!

## debian,ubuntu
$ apt-get install zip unzip -y

## centos
$ yum install zip unzip -y

## mac os 目测有预装

压缩

$ zip 压缩文件名.zip 源文件

## 压缩目录
$ zip -r 压缩文件名.zip 文件夹目录

解压缩

$ unzip 压缩文件 [-d <文件解压缩后所要存储的目录>]

参考

  • https://man.linuxde.net/tar
  • https://man.linuxde.net/bzip2
  • https://segmentfault.com/a/1190000014479275

PHP拓展 mysql、mysqli、pdo_mysql 区别与选择

今天是2020年,PHP连接MySQL有什么接口呢?还在用mysql函数?试试mysqli、pdo_mysql吧?那mysqli和pdo_mysql又有什么异同呢?来看看

PHP_mysql

PHP-MySQL 是 PHP 操作 MySQL 资料库最原始的 Extension

为了让自己强大起来,mysql 自己为安全也做了很多努力。以前例的 SQL 叙述来说,在sql 语句中使用 变量 直接拼接 的地方容易被 SQL Injection。后来于是发展出了 mysql_escape_string() (备注:5.3.0之后弃用) 以及
mysql_real_escape_string()解决此问题。

php_mysqli

PHP-MySQLi 的 i 代表 Improvement ,提更了相对进阶的功能,就 Extension 而言,本身也增加了安全性.

MySQL增强扩展,可以用于使用 MySQL4.1.3或更新版本中新的高级特性。其特点为:面向对象接口 、prepared语句支持、多语句执行支持、事务支持 、增强的调试能力、嵌入式服务支持 、预处理方式完全解决了sql注入的问题。不过其也有缺点, 就是只支持mysql数据库。如果你要是不操作其他的数据库,这无疑是最好的选择。

PDO_mysql

其功能类似于JDBC、ODBC、DBI之类接口。

PDO是PHP5.1之后才支持的,他为访问数据库采用了一致性的接口,有非常多的操作却是MySQL扩展库所不具备的:

1). PDO真正的以底层实现的统一接口数库操作接口
2). PDO支持更高级的DB特性操作,如:存储过程的调度等,mysql原生库是不支持的.
3). PDO是php官方的PECL库,兼容性稳定性必然要高于MySQL Extension,可以直接使用 pecl upgrade pdo 命令升级

过渡

那我自己举例,我最早接触的就是php_mysql 拓展,就是一个个的函数,封装一下就面向对象了。后来又听人说mysqli更好,更安全。发现从mysql过渡到mysqli,就是find mysql, repalce mysqli 这么简单。而PDO呢,对外提供的是完全的面向对象的API,而我们mysqli 同时对外暴露了 函数式和 面向对象 API。所以,你用mysqli面向对象那种方式,再切换到PDO 也很容易。

用PDO的好处是,PDO支持多种数据库,而MySQLi只支持MySQL,一但你掌握了就你可以使用连接多种数据库。

bind

php_mysql不能 Bind Column ,以前例的 SQL 叙述来说,$location 的地方容易被 SQL Injection。后来于是发展出了 mysql_escape_string() (备注:5.3.0之后弃用) 以及 mysql_real_escape_string()来解决这个问题,不过这麽一搞,整个叙述会变得複杂且丑陋,而且如果栏位多了,可以想见会是怎样的 情形.

在 PHP-MySQLi 中有了不少进步,除了透过 Bind Column 来解决上述问题,而且也多援 Transaction, Multi Query ,

并且同时提供了 Object oriented style (下面这段 PHP-MySQLi 范例的写法) 和 Procedural style

直观对比

特性、指标 PHP的mysqli扩展 PDO (使用PDO MySQL驱动和MySQL Native驱动) PHP的mysql扩展
引入的PHP版本 5.0 5.0 3.0之前
PHP5.x是否包含
MySQL开发状态 活跃 在PHP5.3中活跃 仅维护
在MySQL新项目中的建议使用程度 建议 建议 不建议
API的字符集支持
服务端prepare语句的支持情况
客户端prepare语句的支持情况
存储过程支持情况
多语句执行支持情况 大多数
是否支持所有MySQL4.1以上功能 大多数
参数命名 不支持 支持 不支持
API 编程范式 OOP + 函数式 OOP 函数式
对象映射(Object Mapping) 不支持 支持 不支持

结语

其实从php_mysql, mysqli,pdo_mysql 得过渡就可以看到php自己的设计哲学,不要以很强硬的方式推倒以前的,要慢慢过渡,设计规则让用户慢慢适应。php_mysql->mysqli->pod_mysql, 从过程编码到过程和OOP兼得的mysqli,再到纯OOP的pdo_mysql. 慢慢得大家都用pdo了,mysql也淡出了php的版本。