CentOS中Docker的MySQL更改配置后重启不了的两种解决方式

在项目中实施分库分表时,手动修改了Docker内的MySQL配置文件my.cnf,导致容器无法启动。错误日志显示配置文件存在错误。尝试通过docker exec进入容器修改配置失败,因容器未运行。解决方案包括直接修改主机上的配置文件或使用docker cp命令在主机和容器间拷贝配置文件进行修改和回滚。通过修改并复制回配置文件后,重启MySQL容器,服务恢复正常。

项目要用到分库分表,然后自己手动更改了Docker中MySQL的配置文件my.cnf。
配置完毕之后使用Docker进行部署,运行docker restart mysql后没有成功启动。
问题排查,打印日志

docker logs mysql

报错如下:

[ERROR] [Entrypointl: mysqld failed while attempting to check config command was : mysqld --vervbose --help
[ERROR] Found option without preceding group in config file /etc/mysql/ my cnf at line 27 mysql Fatal error in defaults handling. Program aborted
[ERROR] [Entrypoint]: mysqld failed while attempting to check config command was mysqld --verbose --help mysqld: [ERROR] Found option without preceding group in config file /etc/mysql/my.cnf at line 27!
mysqld: [ERROR] Fatal error in defaults handling. Program aborted!

随后我打算执行

docker exec -it mysql /bin/bash

先进入Docker容器之后再修改回原有配置,但是发现容器未启动(Container not started),因为exec执行命令只能用于已在运行的容器!!!

解决方式

方式一:实际文本修改配置

首先当前Linux主机中已存放了docker容器中的配置信息(一般挂载默认目录是:/var/lib/docker/overlay/),其次只要找到这个挂载目录的配置文件,修改后就可以重新启动了
这里不过多赘述方式一。

方式二:间接修改配置文件

使用docker cp命令,把docker容器中的配置文件复制到Linux主机中来,接着修改完之后再复制回docker容器中去,就可以了完成配置文件的回滚了
具体操作(方式二)

1、将docker容器内的文件拷贝至Linux主机中
docker cp mysql:/etc/mysql/my.cnf .

注:. 代表是当前目录,我操作时当前目录是/root,且 mysql:/etc/mysql/my.cnf即为配置文件地址,上述代码操作完成之后 my.cnf 配置文件就会复制到当前操作目录下

2、vim修改配置文件中出错的地方,重新修改回来
3、复制修改后的配置文件到docker容器中去
docker cp my.cnf mysql:/etc/mysql/my.cnf
4、最后重启容器实例,使修改后的配置文件生效
docker restart mysql
5、配置文件生效,MySQL正常启动
<think>用户现在的问题是两台服务器都安装了Docker,如何保证两台MySQL容器之间的数据通信。首先,我需要明确用户的具体需求。数据通信可能指的是数据库之间的数据同步,比如主从复制,或者只是容器之间的网络通信。 首先,用户提到的是“数据通信”,可能是指MySQL实例之间的数据同步,比如主从复制,或者集群配置。但用户的问题可能更偏向于网络层面的通信,即如何让两台服务器上的MySQL容器能够互相访问。 接下来,我需要考虑两台服务器之间的网络连接。如果两台服务器在同一个局域网内,或者可以通过公网IP访问,那么需要确保容器之间的网络是可达的。Docker默认的网络模式是桥接,但跨主机的话,可能需要自定义网络或者使用其他网络插件。 然后,用户可能需要在两台服务器上创建自定义的Docker网络,或者使用Docker的overlay网络(需要Swarm模式)。不过,如果用户没有使用Swarm,可能需要手动配置网络。 另外,MySQL容器之间的通信需要开放相应的端口,比如3306端口。需要确保两台服务器上的防火墙设置允许这些端口的通信。 还有一种方法是使用Docker的host网络模式,这样容器直接使用宿主机的网络,但需要注意端口冲突的问题。 此外,如果用户需要的是数据同步,比如主从复制,那么除了网络通信外,还需要配置MySQL的主从复制参数,比如server-id、日志文件等。 总结下来,可能的解决方案包括: 1. 确保两台服务器的网络互通,开放3306端口。 2. 在每台服务器上运行MySQL容器时,使用host网络模式,或者将容器端口映射到宿主机,并指定宿主机的IP。 3. 使用Docker的自定义网络或overlay网络(需要Swarm)来连接跨主机的容器。 4. 配置MySQL的主从复制或集群模式,确保数据同步。 需要进一步确认用户的具体需求是网络通信还是数据同步,但根据问题描述,可能更偏向于网络层面的通信,因此重点放在网络配置上。</think>要实现两台服务器上 Docker 运行的 MySQL 容器间数据通信(如主从复制、集群同步或直接访问),需解决**跨主机网络互通**和**MySQL 服务暴露**问题,具体步骤如下: --- ### **步骤 1:确保服务器间网络互通** 1. **确认两台服务器的 IP 可达性** 通过 `ping` 测试两台服务器之间的网络连通性(如 `ping 192.168.1.100`)。 2. **开放 MySQL 端口(3306)** 在两台服务器的防火墙中开放 3306 端口(TCP): ```bash # CentOS 7+ 示例 firewall-cmd --add-port=3306/tcp --permanent firewall-cmd --reload ``` --- ### **步骤 2:配置 Docker 网络(跨主机通信)** #### **方案 1:使用 Host 网络模式(简单但需注意端口冲突)** 1. 在每台服务器上运行 MySQL 容器时,使用 `--network host` 模式: ```bash docker run -d --name mysql1 --network host -e MYSQL_ROOT_PASSWORD=root mysql:8.0 ``` 此时容器直接使用宿主机的 IP 和端口,MySQL 服务可通过宿主机的 IP:3306 访问。 2. **配置主从复制** 在服务器 A 的 MySQL配置为主库(`binlog` 启用),服务器 B 的 MySQL 配置为从库,通过服务器 A 的 IP 连接主库。 #### **方案 2:使用自定义网络(需手动配置路由)** 1. **创建自定义网络并指定子网** 在每台服务器上创建相同的 Docker 自定义网络(需确保子网不冲突): ```bash docker network create --driver bridge --subnet 172.18.0.0/16 my_network ``` 2. **将容器加入自定义网络** 运行容器时指定自定义网络和静态 IP(需在子网范围内): ```bash docker run -d --name mysql1 --network my_network --ip 172.18.0.2 -e MYSQL_ROOT_PASSWORD=root mysql:8.0 ``` 3. **配置静态路由(跨主机)** 在两台服务器上添加路由规则,使容器网络互通: ```bash # 服务器 A(IP: 192.168.1.100)添加到服务器 B 容器网络的路由 route add -net 172.18.0.0/16 gw 192.168.1.101 # 服务器 B(IP: 192.168.1.101)添加到服务器 A 容器网络的路由 route add -net 172.18.0.0/16 gw 192.168.1.100 ``` --- ### **步骤 3:配置 MySQL 主从复制(示例)** #### **主库(服务器 A)配置** 1. 修改 MySQL 配置文件(`/etc/mysql/my.cnf`): ```ini [mysqld] log-bin = mysql-bin server-id = 1 binlog_format = ROW ``` 2. 重启 MySQL 并创建复制用户: ```sql CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'repl_password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; FLUSH PRIVILEGES; ``` #### **从库(服务器 B)配置** 1. 修改 MySQL 配置文件: ```ini [mysqld] server-id = 2 relay-log = mysql-relay-bin ``` 2. 连接主库并启动复制: ```sql CHANGE MASTER TO MASTER_HOST='192.168.1.100', MASTER_USER='repl', MASTER_PASSWORD='repl_password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154; START SLAVE; ``` --- ### **验证通信** 1. 在从库服务器 B 上执行: ```sql SHOW SLAVE STATUS\G ``` 确认 `Slave_IO_Running` 和 `Slave_SQL_Running` 均为 `Yes`。 2. 在主库服务器 A 上创建测试数据,检查从库是否同步。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值