基本信息:在公司装了台 e5 服务器,又通过 pve 装了 centos7 ,方便中间件调试。 在 centos7 上通过 docker-compose 部署了 mysql 容器,由于公司规定下班禁止电源插电。于是变设置了一系列自启。 但是某些时候就会发生 mysql 容器启动了,无法从外部连接 mysql ,只能通过 docker exec -it mysql bash 登录容器,在容器内部登录 msyql 。
这是为什么? 下面是 docker-compose 启动文件
$ cat docker-compose.yml
version: '3'
services:
mysql-db-8:
container_name: mysql8.26 # 指定容器的名称
image: mysql:8.0.26 # 指定镜像和版本
ports:
- "3309:3306"
environment:
MYSQL_ROOT_PASSWORD: "root"
MYSQL_ROOT_HOST: "%"
volumes:
- "./mysql/data:/var/lib/mysql" # 挂载数据目录
- "./mysql/conf:/etc/mysql/conf.d" # 挂载配置文件目录
#restart: always
command:
# 将 mysql8.0 默认密码策略 修改为 原先 策略 (mysql8.0 对其默认策略做了更改 会导致密码无法匹配)
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
1
hefish 2023-06-15 14:55:33 +08:00
无法从外部连 mysql 是 3309 端口都不开吗?
还是连了就挂起? docker logs mysql-db-8 里面能看到啥日志不?比如绑定端口有关的那些? |
2
OutOfMemoryError 2023-06-15 14:59:50 +08:00
先看看日志 确认 mysql 起来了吗,
my.cnf 一般要 744 权限,目录一般给 999:999 然后本地 lsof -i:3309 看下端口起来没 本地能不能连上 如果能连上就看下 iptables 之类的有没有拦截 |
3
cksspk OP |
5
cksspk OP @OutOfMemoryError #2 确定起来了,能够登录容器内部,执行 mysql 命令,在外面连不上,从服务器也连不上容器端口,看日志好像是容器内部端口没绑定 3306 。日志在下面贴了
|
6
defunct9 2023-06-15 15:05:35 +08:00 2
开 ssh ,让我上去看看
|
7
perfectlife 2023-06-15 15:09:19 +08:00
试试直接用 host 网络,docker-compose.yml 中用 network_mode: "host"
|
9
cksspk OP @perfectlife #7 改了,并没有用,日志还是 port 为 0
|
10
perfectlife 2023-06-15 15:26:39 +08:00
@cksspk 可以贴一下你的 mysql 配置文件么
|
11
perfectlife 2023-06-15 15:30:08 +08:00
@cksspk 猜测是因为网络问题,你看下 show variables like 'port'; 这个是不是显示 0 ,show variables like 'skip_networking'; 这个是不是为 No
|
12
cksspk OP @perfectlife #10 只配置了字符信息
|
13
iyiluo 2023-06-15 15:33:48 +08:00
可能防火墙问题,systemctl restart firewalld
|
14
perfectlife 2023-06-15 15:42:06 +08:00
@cksspk 可能和 skip-grant-tables 有关系,参考下 https://blog.csdn.net/m0_56007820/article/details/125769471 这个
|
16
pcmid 2023-06-15 15:47:01 +08:00 via iPhone
是不是进 safe mode 了
|
17
cksspk OP @perfectlife #14 通过 注释掉 skip-grant-tables 然后,通过 docker-compose down , up -d 重启绑定到了 3306 ,但是密码连接不上了。。。
|
18
perfectlife 2023-06-15 16:13:13 +08:00
@cksspk 你知道密码,就密码登录,不知道密码就先加上 skip-grant-tables ,容器内登录修改密码,然后注释了 skip-grant-tables 在登录
|
19
november 2023-06-15 16:17:04 +08:00
看看是不是防火墙 iptables 的问题。
|
20
kaedeair 2023-06-15 16:59:41 +08:00
关掉 selinux 试试
|
21
proxytoworld 2023-06-15 17:01:18 +08:00
挂起并恢复虚拟机时,运行的 docker 会连不上( docker ip 无法 ping )
/etc/NetworkManager/NetworkManager.conf ```c [keyfile] unmanaged-devices=interface-name:docker*;interface-name:veth*;interface-name:br-*;interface-name:vmnet*;interface-name:vboxnet* ``` systemctl restart NetworkManager |
22
hefish 2023-06-15 19:31:01 +08:00
截图上看,倒像是某种机制阻止了 bind 3306 或者 33060 。
不知道最后一句 mbind: operation not permitted 是哪个端口绑定失败,3306 还是 33060 ,还是两者都失败。 这个登进容器不知道能不能看到 ss -tlnp 的信息。 这个出问题前是正常 shutdown 或者 poweroff 的? |
23
gzlock 2023-06-15 19:47:00 +08:00
既然能进容器内部,直接 dump 出 sql 备份数据,停掉容器( docker-compose.yml 注释掉),在 docker-compose.yml 新写一个不同名字不同本地 volume 目录的新 mysql 容器,导入 sql 数据没啥问题就把旧容器删掉咯
|
24
dode 2023-06-15 19:52:46 +08:00
也许是 docker 和 firewalld 和 centos7 直接有兼容性问题
可以试试 ubuntu22.04 系统跑 docker ,mysql8 |
25
youngPacce 2023-06-15 20:09:55 +08:00 via Android
iptables -L -n 看看是不是没有暴露 docker 的端口,我有一次重启了之后 docker 上的服务都用不了了,重启 docker 就好了
|
26
winson030 2023-06-15 21:23:51 +08:00 via iPhone
配置文件没写 restart 相关的参数,宿主机重启后容器不会自动起来的,你这个 unless-stopped 试试
|
27
winson030 2023-06-15 21:26:32 +08:00 via iPhone
还有一个就是,docker 的网卡映射最好也要写一下,你可以自定义一个网卡,将 mysql 的容器 绑过去,最后实在不行就 systemctl restart docker
|
29
cksspk OP |
30
xyjincan 2023-06-16 11:20:47 +08:00
搞个定时任务自动关机吧
|