首先先拉取一个MySQL镜像:docker pull mysql:5.7.22

启动mysql容器

docker run -it --name mysql -p 3306:3306 -v /dockerShare/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.22 --character-set-server=utf8 --collation-server=utf8_unicode_ci

把本地文件夹目录挂载到容器/var/lib/mysql下,用于持久化数据,但是直接这样挂载会报错提示:File ./ib_logfile101: 'aio write' returned OS error 122

原因如下:

MySQL docker占16g内存_MySQL docker占16g内存

于是想使用外挂配置,去修改mysql的配置文件,官网的方法如下:

https://hub.docker.com/_/mysql/

MySQL docker占16g内存_mysql_02

但是,报错:Warning: World-writable config file ‘/etc/my.cnf’ is ignored

原因:

‘/etc/my.cnf’ is ignored ,大概意思是权限全局可写,任何一个用户都可以写。mysql担心这种文件被其他用户恶意修改,所以忽略掉这个配置文件。导致无法进入,这也是mysql的安全机制之一。所以我们必须得改一些权限。设置其他用户不可写。

尝试修改文件权限:,失败

 

下面是正确的解决方法:

思路:启动一个干净的mysql容器,然后进入该容器,在/etc/mysql/conf.d文件夹下新建一个配置文件,文件内容如下:

[mysqld]

innodb_use_native_aio=0

然后把容器保存成一个镜像,下次再次实例化该镜像的再挂载本地主机目录到容器里面。

步骤如下:

启动一个干净的mysql容器:

docker run --name mysql -e MYSQL_ROOT_PASSWORD=root -d --rm mysql:5.7.22

带MySQL容器完全启动后,进入容器:

docker exec -it some-mysql bash
cd /etc/mysql/conf.d
touch my-config.cnf
nano my-config.cnf


MySQL docker占16g内存_mysql_03

复制进去保存退出。

PS.

由于mysql镜像的精简,如果没有nano命令,可以用如下方法中的一种解决:

1.apt-get update更新软件源,然后apt-get install nano

2.

echo "[mysqld]" > my-config.cnf

追加第二行:echo "innodb_use_native_aio=0" >> my-config.cnf // 两个箭头是追加,一个箭头是覆盖

echo 如果没有目标文件,会输出到窗口,如果有目标文件,会写入文件

 

在文件夹/etc/mysql/conf.d下新增my-config.cnf后把容器保存成镜像:

docker commit some-mysql mymysql:5.7.22.1

再次启动mymysql镜像,并挂载本机目录文件夹:

docker run --name some-mysql -p 3307:3306 -v /dockerShare/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -it --rm mymysql:5.7.22.1

没有再报错,查看mysql服务运行情况:

MySQL docker占16g内存_MySQL_04

登录mysql客户端:

MySQL docker占16g内存_MySQL docker占16g内存_05

新建一个test数据库:

MySQL docker占16g内存_docker_06

查看本地挂载的路径文件夹是否同步的MySQL数据:

MySQL docker占16g内存_docker_07

至此,mysql容器算是成功运行了。

 

说明:

如果不需要对宿主机暴露端口,可以不指定-p参数,mysql内部默认分配3306端口

设置数据库默认的编码:--character-set-server=utf8

设置排序的编码:--collation-server=utf8_unicode_ci

代码如下:

docker run --name mysql -v /dockerShare/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -it --rm mymysql:5.7.22.1 --character-set-server=utf8 --collation-server=utf8_unicode_ci

后台运行了mysql容器,进入mysql容器命令

docker exec -it <容器名> bash