V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cksspk
V2EX  ›  程序员

关于 Docker-compose 启动 Mysql 的问题,机器拔电后重启无法从外部连接

  •  
  •   cksspk · 2023-06-15 14:42:09 +08:00 · 2300 次点击
    这是一个创建于 532 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    可以试试 ubuntu22.04 系统跑 docker ,mysql8
    youngPacce
        25
    youngPacce  
       2023-06-15 20:09:55 +08:00 via Android
    iptables -L -n 看看是不是没有暴露 docker 的端口,我有一次重启了之后 docker 上的服务都用不了了,重启 docker 就好了
    winson030
        26
    winson030  
       2023-06-15 21:23:51 +08:00 via iPhone
    配置文件没写 restart 相关的参数,宿主机重启后容器不会自动起来的,你这个 unless-stopped 试试
    winson030
        27
    winson030  
       2023-06-15 21:26:32 +08:00 via iPhone
    还有一个就是,docker 的网卡映射最好也要写一下,你可以自定义一个网卡,将 mysql 的容器 绑过去,最后实在不行就 systemctl restart docker
    cksspk
        28
    cksspk  
    OP
       2023-06-16 09:04:38 +08:00
    @dode #24 有可能,但是习惯了 centos
    cksspk
        29
    cksspk  
    OP
       2023-06-16 09:24:52 +08:00
    罪魁祸首好像是直接拔电源后系统表坏了
    xyjincan
        30
    xyjincan  
       2023-06-16 11:20:47 +08:00
    搞个定时任务自动关机吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3297 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:35 · PVG 20:35 · LAX 04:35 · JFK 07:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.