V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Recommended Services
Amazon Web Services
LeanCloud
New Relic
ClearDB
WaterWestBolus
V2EX  ›  云计算

docker 下 MySQL 容器的一些问题

  •  
  •   WaterWestBolus · 2022-06-23 23:56:09 +08:00 · 3448 次点击
    这是一个创建于 912 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一个关于 ipv6 和 ipv4 的问题

    我在 WSL2-debian11 环境内,使用 docker20.10.17 和 MySQL8.0 ,并使用 dockerfile 以 MySQL 为基础构建并运行新镜像。

    mysql 的 my.cnf 文件配置如下

    [mysqld]
    pid-file        = /var/run/mysqld/mysqld.pid
    socket          = /var/run/mysqld/mysqld.sock
    datadir         = /var/lib/mysql
    # By default we only accept connections from localhost
    bind-address   = 0.0.0.0
    # Disabling symbolic-links is recommended to prevent assorted security risks
    default-time_zone = '+8:00'
    
    symbolic-links=0
    character-set-server=utf8mb4
    [client]
    default-character-set=utf8mb4
    [mysql]
    default-character-set=utf8mb4
    

    dockerfile 如下

    FROM mysql:latest
    MAINTAINER cf
    EXPOSE 3306
    LABEL version="0.1" description="MySQL 服务器" by="cf"
    ENV MYSQL_ROOT_PASSWORD cf1111
    ENV MYSQL_USER="cf"
    ENV MYSQL_PASSWORD="cfcfcf"
    RUN mkdir -p /var/log/mysql
    RUN mkdir -p /etc/mysql
    RUN mkdir -p /var/lib/mysql
    COPY log /var/log/mysql
    COPY conf/my.cnf /etc/mysql/my.cnf
    COPY data /var/lib/mysql
    COPY data-files /var/lib/mysql-files
    

    使用如下命令构建、运行镜像

    docker build -t gettorrentmysql:0.1 mysql80
    docker run gettorrentmysql:0.1           
    

    运行后通过 netstat -tunl 命令发现,容器监听了ipv6下的:::3306 端口,而非ipv4

    而使用 windows 端的 MySQL workbench 新建连接,发现 hostname 填写::和 0:0:0:0:0:0:0:0 都不能连接 反而是 127.0.0.1 才能连接。

    问题: workbench 使用的 ip 地址和 wsl 内容器暴露的 ip 地址为什么不一致?哪个才是真的?或者 workbench 有一些优化? 百思不得其解,希望各位能帮忙解惑,感谢!

    7 条回复    2022-06-24 16:46:45 +08:00
    westoy
        1
    westoy  
       2022-06-24 00:23:50 +08:00   ❤️ 3
    0.0.0.0 不是一个 IP , 是可以匹配所有 IP , 服务端绑定这个 IP 就等于绑定设备上所有地址了, 拿来连当然是不行的
    foursevenlove
        2
    foursevenlove  
       2022-06-24 09:03:42 +08:00
    同意楼上
    KimGuo
        3
    KimGuo  
       2022-06-24 12:19:26 +08:00
    windows 的 docker 已经可以直接使用 wls2 进行运行了,支持命令的同时提供一个 gui ,比装在 wsl2 的系统下更方便使用
    另外容器监听了:::3306 意味着可以接收任意 ip 对 3306 发来的请求,如果有配置 ip/掩码意味着只接收指定范围 ip 对此端口的请求
    127.0.0.1 就是本地回环(localhost),应该是跟 ipv6 的 0:0:0:0:0:0:0:1 等价,win 会处理好把这块转发到 wsl 系统上,具体可能不对,因为不太熟
    WaterWestBolus
        4
    WaterWestBolus  
    OP
       2022-06-24 12:22:23 +08:00
    @westoy 谢谢~
    WaterWestBolus
        5
    WaterWestBolus  
    OP
       2022-06-24 12:39:22 +08:00
    @KimGuo 谢谢。但我目前还是想在 debian 下进行开发。
    我目前看到的结果是这样:
    通过 windows 的 docker desktop 客户端可以看到我的容器运行在 127.0.0.1:3306 上,但还是不能确定这个 ip:port 是怎么来的。可能是 docker desktop 客户端本身给 wsl2 做了一层优化吧。。
    blless
        6
    blless  
       2022-06-24 13:41:21 +08:00
    @WaterWestBolus docker 容器跟宿主机之间你可以认为多加了一层网关转发,容器绑定的 0.0.0.0:3306 只是绑定容器虚拟 IP 的 port ,dockerfile 上 expose 的只是容器端口。但是宿主的绑定 IP 一般是 docker run 的时候动态绑定的,可以用-p 参数指定,具体参考这个文档 https://docs.docker.com/engine/reference/run/#expose-incoming-ports
    WaterWestBolus
        7
    WaterWestBolus  
    OP
       2022-06-24 16:46:45 +08:00
    @blless 谢谢!我也想的是多了一层转发。这层转发应该能通过抓包的方式得到结果吧?
    还是得多看文档。原来-p 可以绑定 ip+port 啊!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2751 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 10:01 · PVG 18:01 · LAX 02:01 · JFK 05:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.