目的:docker容器部署mysql5.7.28,mysql数据文件与log写入到宿主机目录(数据持久化)
下载mysql镜像
进入mysql镜像库选择版本为5.7.28的镜像,并下载
docker pull mysql:5.7.28
启动mysql容器
1. 启动mysql容器
docker run --name mysql_test -d -e MYSQL_ROOT_PASSWORD=123456 -p 3307:3306 mysql:5.7.28
run
:启动容器的命令
--name
:并容器的命名
-d:
让容器后台运行(其他对应参数:-i
交互式操作,-t
开启一个伪终端)
-e MYSQL_ROOT_PASSWORD
:初始化root用户的密码为123456
-p
:将容器的3306端口映射到主机的3307端口
mysql:5.7.28
:mysql镜像的仓库名与标签,也可直接通过镜像id启动
2. 进入mysql容器查看mysql配置文件路径
docker exec -it mysql_test sh # 进入mysql容器
mysql -uroot -p123456 # 进入root账号登录mysql
3. 查看mysql配置中数据文件与日志文件路径
show variables like 'general_log_file'; # 日志文件路径
show variables like 'log_error'; # 错误日志文件路径
show variables like 'slow_query_log_file'; # 慢查询日志文件路径
show variables like 'datadir'; # 查看数据库数据文件路径
查看结果发现日志、慢查询日志和数据文件都位于容器/var/lib/mysql,错误日志权限未配置
既然如此,我们就挂载个空目录成容器的/var/lib/mysql并修改配置文件将错误日志文件也一起放到此路径
准备挂载目录与文件
1. 宿主机下新建挂载目录和日志文件
sudo mkdir -p /home/docker_data/mysql
注: 路径必须为绝对路径,宿主机目录如果不存在,则会自动生成
2. 修改挂载文件/home/docker_data/mysql的所有者权限为999
sudo chown 999 /home/docker_data/mysql
3. 将容器mysql_test的配置文件/etc/mysql/mysql.conf.d/mysqld.cnf复制到宿主机目录/home/test
# 退出容器mysql_test
exit
# 复制mysql配置文件mysqld.cnf到宿主机目录/home/test
docker cp mysql_test:/etc/mysql/mysql.conf.d/mysqld.cnf /home/test
4. 修改配置文件错误日志路径为/var/lib/mysql
vim /home/test/mysqld.cnf # 编辑配置文件mysqld.cnf
#log-error = /var/log/mysql/error.log # 修改前
log-error = /var/lib/mysql/error.log # 修改后
5. 删除容器mysql_test
docker stop mysql_test # 停止
docker rm mysql_test # 删除
docker启动mysql容器
1. 启动mysql容器并挂载文件到宿主机
docker run --name mysql_5.7.28 -d -e MYSQL_ROOT_PASSWORD=123456 -v /home/docker_data/mysql:/var/lib/mysql -p 3307:3306 mysql:5.7.28
-v
: 将宿主机目录挂载到容器(-v /home/docker_mysql/datadir:/var/lib/mysql
将宿主机的/home/docker_mysql/datadir挂载到容器的/var/lib/mysql目录,-v 参数可重复多次, 每次挂载一个目录到容器)
2. 将宿主机的配置文件/home/test/mysqld.cnf复制到容器mysql_5.7.28的/etc/mysql/mysql.conf.d下
docker cp /home/test/mysqld.cnf mysql_5.7.28:/etc/mysql/mysql.conf.d
3. 重启容器并查看docker容器运行情况
docker ps -a
4. docker日志查看启动情况
docker logs -t -f --tail=10 mysql_5.7.28
Options:
--details 显示更多的信息
-f, --follow 跟踪实时日志
--since string 显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟)
--tail string 从日志末尾显示多少行日志, 默认是all
-t, --timestamps 显示时间戳
--until string 显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)
例子:
查看指定时间后的日志,只显示最后100行:
$ docker logs -f -t --since="2018-02-08" --tail=100 CONTAINER_ID
查看最近30分钟的日志:
$ docker logs --since 30m CONTAINER_ID
查看某时间之后的日志:
$ docker logs -t --since="2018-02-08T13:23:37" CONTAINER_ID
查看某时间段日志:
$ docker logs -t --since="2018-02-08T13:23:37" --until "2018-02-09T12:23:37" CONTAINER_ID
注:若挂载文件的所有者权限未正确设置会启动失败并报权限不足(如下图):
5. navicat连接成功并新建个数据库-test_2019
mysql -h 127.0.0.1 -uroot -p123456 -P3307
或者:mysql -h mysql容器IP -uroot -p123456 -P3306
注:-h 指定ip -u指定用户名 -p指定密码 -P指定端口号
查看容器IP方法
方法一 docker inspect 容器的id或者容器名 | grep IPAddress
方法二 sudo docker inspect -f='{{.NetworkSettings.IPAddress}}' $(sudo docker ps -a -q)
方法三 ps -aux | grep 3307
6. 查看数据库文件夹datadir中多了个数据库文件-test_2019,至此mysql部署完成