安装前准备
使用自定义的配置文件与数据目录
/opt/mysql/my.cnf
/data/database/mysql
安装
docker run -d -p 3306:3306 -v /opt/mysql/my.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf -v /data/database/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mymysql mysql:5.7.18
配置文件说明
使用 -v会挂载自己的文件,
- 配置文件
形成互补配置,如果有相同的选项,自定义的会覆盖原来默认的,这样可以更灵活地配置mysql - 数据文件
如果不配置数据文件,下次启动的时候,以前的数据就会丢失,又恢复到镜像中默认的数据库文件,显然不符合需求
遇到的问题
1.Error response from daemon: Conflict
这是因为容器中已经有这个id了,
docker ps -a
docker rm -f <名字或id>
使用上面命令删除conflict的容器后,重新启动
2. 检查状态
docker ps -a
[root@localhost mysql]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a839f2c11e42 mysql:5.7.18 "docker-entrypoint.s…" 3 seconds ago **Exited (1)** 2 seconds ago mymysql
发现status是Existed状态
3.检查log
docker logs -f mymysql --tail=10
Initializing database
2019-04-07T02:19:14.657123Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2019-04-07T02:19:14.659694Z 0 [ERROR] --initialize specified but the data directory has files in it. Aborting.
2019-04-07T02:19:14.659709Z 0 [ERROR] Aborting
说明数据目录里面有文件了,检查数据目录
如果还记得开始的配置,可以直接去检查,如果不记得,也可以通过命令来检查
4.检查配置
docker inspect a839f2c11e42
"HostConfig": {
"Binds": [
"/opt/mysql/my.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf",
"/data/database/mysql:/var/lib/mysql"
],
5.客户端如Navicat登陆不上
这是因为没有授权
docker exec -it <container id> /bin/bash
mysql -uroot -p
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
6. 验证有无数据丢失
关闭mysql再重新启动,发现新建的表,还在,即数据文件并未丢失
7.制作启动脚本
简单地对上面脚本进行封闭成一个比较容易记忆的,以后每次用这个,就不用一直去修改了。
如
root@localhost usr]# cat ./start-mysql.sh
#!/bin/bash
docker run -d --rm -p 3306:3306 -v /opt/mysql/my.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf -v /data/database/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mymysql mysql:5.7.18
总结
1.使用docker 安装很简单,很方便使用,但是对配置的原理不太懂,有时间需要读官方的docker file
2.关于上面检查有冲突的配置,有很多网上的说法,加上 --rm,这样下次不用去手动删除已经重复的id.
这样做的确可行,但我想docker为什么没有这样设计,应该也是有它特别的用意,自己能想到的一点就是可以使用
docker inspect + docker logs 来检查配置与log的错误,便于发现问题。