V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
momo31
V2EX  ›  程序员

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

  •  
  •   momo31 · Jun 15, 2023 · 3049 views
    This topic created in 1053 days ago, the information mentioned may be changed or developed.

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

    可以试试 ubuntu22.04 系统跑 docker ,mysql8
    youngPacce
        25
    youngPacce  
       Jun 15, 2023 via Android
    iptables -L -n 看看是不是没有暴露 docker 的端口,我有一次重启了之后 docker 上的服务都用不了了,重启 docker 就好了
    winson030
        26
    winson030  
       Jun 15, 2023 via iPhone
    配置文件没写 restart 相关的参数,宿主机重启后容器不会自动起来的,你这个 unless-stopped 试试
    winson030
        27
    winson030  
       Jun 15, 2023 via iPhone
    还有一个就是,docker 的网卡映射最好也要写一下,你可以自定义一个网卡,将 mysql 的容器 绑过去,最后实在不行就 systemctl restart docker
    momo31
        28
    momo31  
    OP
       Jun 16, 2023
    @dode #24 有可能,但是习惯了 centos
    momo31
        29
    momo31  
    OP
       Jun 16, 2023
    罪魁祸首好像是直接拔电源后系统表坏了
    xyjincan
        30
    xyjincan  
       Jun 16, 2023
    搞个定时任务自动关机吧
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2503 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 59ms · UTC 08:41 · PVG 16:41 · LAX 01:41 · JFK 04:41
    ♥ Do have faith in what you're doing.