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