首先先拉取一个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的配置文件,官网的方法如下:
https://hub.docker.com/_/mysql/
但是,报错: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
把
复制进去保存退出。
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客户端:
新建一个test数据库:
查看本地挂载的路径文件夹是否同步的MySQL数据:
至此,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