• 请不要在回答技术问题时复制粘贴 AI 生成的内容
momo31
V2EX  ›  程序员

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

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

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