Docker 实践

都是 windows 平台

日常 MySQL

当然数据库启动后,可以使用很多可视化工具进行查看。不过我比较喜欢使用 docker 命令管理(主要是感觉开个终端查看也很方便)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-- 查看正在运行的容器
docker ps

-- 进入容器内部
docker exec -it <mysql-x.x> bash

-- 进入后:
>> mysql -uroot -p123456

-- 然后就是数据库操作:
show databases;
use ...;
show tables;
desc ...;
select * from ... limit 0,10;

查看容器卷挂载情况

场景:我项目学习时,需要使用到 canal 对数据库的 binlog 进行订阅,然后发送消息,再去实现 Redis 数据的同步更新。

因为 canal 是依赖于 binlog 日志的,所以要开启 MySQL 的 binlog 日志。由于没开,所以写进行配置——查到配置是要写进 my.conf 配置文件,但是由于是 docker 容器,所以得看一下卷挂载路径,否则进入容器内部、即使修改了配置文件,下次启动时还是会失效。

image-20251216155252457

在查资料时,学到了下面一个指令:

1
2
3
4
5
6
-- 查看容器启动时的各种参数
docker inspect <container>

-- windows 平台可以使用以下的过滤语句
-- linux 使用 | grep(但是win显然不是)
docker inspect mysql-5.7 | Select-String -Pattern "Source|Destination|Env"

使用| Select-String -Pattern ""进行过滤操作(直接使用 inspect 也行,就是信息有点多)

image-20251216155706445

然后根据旧容器的信息,整理出来新的容器启动参数(为了对旧数据迁移、新增-v配置挂载参数):

1
2
3
4
5
6
7
8
9
10
11
12
docker run --name mysql-5.7 
-p 3306:3306
-e MYSQL_ROOT_PASSWORD=123456
-e MYSQL_ROOT_HOST=%

# 注意下面的 -v 是数据卷挂载,由于之前的数据挂载是虚拟的,所以迁移时要带上(否则旧数据丢失)
# 这个内容是在 docker inspect 的完整输出里面“amount”参数里可以找到
-v 8fccc55c224db88d6d18cf70cb95670c4500977e9553d6c33272e1942225e21c:/var/lib/mysql
# 新增的配置文件挂载:
-v E:/develop_tools/Docker_data/mysql-5.7/conf/canal.cnf:/etc/mysql/conf.d/canal.cnf
# 指定镜像:
-d mysql:5.7.36

进入容器后,进行验证,发现确实映射到了宿主机的文件:

image-20251216161519163

但是修改完了还是没能让 binlog 开启:

image-20251216162713237

(问ai说是字符编码有问题(?))所以使用 vscode 修改其编码为 UTF-8 和 LF(实际没去验证,但是还是改了):

image-20251216161644773

但是修改完后,查看 binlog 有无开启,还是没开启的状态。所以问题不在于此……

终极方法使用docker logs mysql-5.7查看日志信息——

image-20251216162832834

关键信息:mysqld: [Warning] World-writable config file '/etc/mysql/conf.d/canal.cnf' is ignored.

意思就是这个配置文件的权限太大了,mysql任务不安全,于是忽略了这个配置文件。

使用 chmod 命令移除其他用户的写入权限(将权限设置为 644600 等):

1
docker exec -it mysql-5.7 /bin/bash -c "chmod 644 /etc/mysql/conf.d/canal.cnf"

之后docker restart mysql-5.7,问题解决:

image-20251216163652851