基本信息:在公司装了台 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
|      1hefish      2023-06-15 14:55:33 +08:00 无法从外部连 mysql 是 3309 端口都不开吗? 还是连了就挂起? docker logs mysql-db-8 里面能看到啥日志不?比如绑定端口有关的那些? | 
|  |      2OutOfMemoryError      2023-06-15 14:59:50 +08:00 先看看日志 确认 mysql 起来了吗, my.cnf 一般要 744 权限,目录一般给 999:999 然后本地 lsof -i:3309 看下端口起来没 本地能不能连上 如果能连上就看下 iptables 之类的有没有拦截 | 
|  |      3momo31 OP | 
|  |      5momo31 OP @OutOfMemoryError #2 确定起来了,能够登录容器内部,执行 mysql 命令,在外面连不上,从服务器也连不上容器端口,看日志好像是容器内部端口没绑定 3306 。日志在下面贴了 | 
|  |      6defunct9      2023-06-15 15:05:35 +08:00  2 开 ssh ,让我上去看看 | 
|  |      7perfectlife      2023-06-15 15:09:19 +08:00 试试直接用 host 网络,docker-compose.yml 中用    network_mode: "host" | 
|  |      9momo31 OP @perfectlife #7 改了,并没有用,日志还是 port 为 0    | 
|  |      10perfectlife      2023-06-15 15:26:39 +08:00 @cksspk  可以贴一下你的 mysql 配置文件么 | 
|  |      11perfectlife      2023-06-15 15:30:08 +08:00 @cksspk 猜测是因为网络问题,你看下 show variables like 'port'; 这个是不是显示 0 ,show variables like 'skip_networking'; 这个是不是为 No | 
|  |      12momo31 OP @perfectlife #10    只配置了字符信息 | 
|      13iyiluo      2023-06-15 15:33:48 +08:00 可能防火墙问题,systemctl restart firewalld | 
|  |      14perfectlife      2023-06-15 15:42:06 +08:00 @cksspk  可能和 skip-grant-tables 有关系,参考下 https://blog.csdn.net/m0_56007820/article/details/125769471 这个 | 
|  |      16pcmid      2023-06-15 15:47:01 +08:00 via iPhone 是不是进 safe mode 了 | 
|  |      17momo31 OP @perfectlife #14 通过 注释掉 skip-grant-tables 然后,通过 docker-compose down , up -d 重启绑定到了 3306 ,但是密码连接不上了。。。  | 
|  |      18perfectlife      2023-06-15 16:13:13 +08:00 @cksspk  你知道密码,就密码登录,不知道密码就先加上 skip-grant-tables ,容器内登录修改密码,然后注释了 skip-grant-tables 在登录 | 
|      19november      2023-06-15 16:17:04 +08:00 看看是不是防火墙 iptables 的问题。 | 
|      20kaedeair      2023-06-15 16:59:41 +08:00 关掉 selinux 试试 | 
|  |      21proxytoworld      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 | 
|      22hefish      2023-06-15 19:31:01 +08:00 截图上看,倒像是某种机制阻止了 bind 3306 或者 33060 。 不知道最后一句 mbind: operation not permitted 是哪个端口绑定失败,3306 还是 33060 ,还是两者都失败。 这个登进容器不知道能不能看到 ss -tlnp 的信息。 这个出问题前是正常 shutdown 或者 poweroff 的? | 
|  |      23gzlock      2023-06-15 19:47:00 +08:00 既然能进容器内部,直接 dump 出 sql 备份数据,停掉容器( docker-compose.yml 注释掉),在 docker-compose.yml 新写一个不同名字不同本地 volume 目录的新 mysql 容器,导入 sql 数据没啥问题就把旧容器删掉咯 | 
|      24dode      2023-06-15 19:52:46 +08:00 也许是 docker 和 firewalld 和 centos7 直接有兼容性问题 可以试试 ubuntu22.04 系统跑 docker ,mysql8 | 
|      25youngPacce      2023-06-15 20:09:55 +08:00 via Android iptables -L -n 看看是不是没有暴露 docker 的端口,我有一次重启了之后 docker 上的服务都用不了了,重启 docker 就好了 | 
|  |      26winson030      2023-06-15 21:23:51 +08:00 via iPhone 配置文件没写 restart 相关的参数,宿主机重启后容器不会自动起来的,你这个 unless-stopped 试试 | 
|  |      27winson030      2023-06-15 21:26:32 +08:00 via iPhone 还有一个就是,docker 的网卡映射最好也要写一下,你可以自定义一个网卡,将 mysql 的容器 绑过去,最后实在不行就 systemctl restart docker | 
|  |      29momo31 OP | 
|  |      30xyjincan      2023-06-16 11:20:47 +08:00 搞个定时任务自动关机吧 |