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

使用 docker 部署连接 mysql 问题

  •  1
     
  •   su2018 · 50 天前 · 1243 次点击
    这是一个创建于 50 天前的主题,其中的信息可能已经有所发展或是发生改变。

    docker-compose.yml 如图所示 gPL9MX.png

    然后在 php 代码中连接数据库时总是连接不上, 但是使用 Navicat 采用 127.0.0.1 或者是 localhost 都可以连接得上

    测试代码: gPU10i.png

    求大神详解

    17 回复  |  直到 2019-09-24 16:15:55 +08:00
        1
    czzhengkw   50 天前
    $servername = "mysql"

    docker-compose 自己内部有一套网络,会把 service name 转换为对应的 ip
        2
    su2018   50 天前
    @czzhengkw 也是不行

    Connection failed: php_network_getaddresses: getaddrinfo failed: Name or service not knownPHP Warning: mysqli_connect(): php_network_getaddresses: getaddrinfo failed: Name or service not known in /opt/project/test2.php on line 18
    PHP Warning: mysqli_connect(): (HY000/2002): php_network_getaddresses: getaddrinfo failed: Name or service not known in /opt/project/test2.php on line 18
        3
    ysoserious   50 天前
    你把代码里的端口改成 3306 试试?
        4
    cwz88   50 天前
    docker-compose.yml 中
    ```
    php:
    image: "php7.2:v2"
    links:
    - "mysql"
    ```
    php 代码中 $servername = "mysql"
    就 ok 了
        5
    wszgrcy   50 天前 via Android
    回去帮你看看,之前也配置过
        6
    maichael   50 天前
    没记错的话,service 和 service 通信用的是 container port,所以应该连 3306 吧
        7
    lxy42   50 天前 via Android
    networks 不要用 default,default 不支持 dns。
        8
    clives   50 天前
    networks 使用自定义~
        9
    sarices   50 天前
    你可以直接用 127.0.0.1 访问是因为 3306 帮到本地 ip 了,你的 php 容器并没有 3306 端口,在 php 中你可以用本机 ip 作为地址,也可以用 mysql 或者容器 ip 访问
        10
    su2018   50 天前
    @ysoserious
    @cwz88
    @maichael
    经测试: yml 文件中 php: 改为--- links: "mysql" 而不是 depends_on 时采用 mysql:3306 可以连接到. 但是还是觉得这种连接方式有点奇怪, 为啥 Navicat 可以通过 127.0.0.1:3310 和 localhost:3310 连接
        11
    su2018   50 天前
    @sarices 哦哦 好像有点明白了, 你的意思是 mysql 容器的 3306 绑定了本机的 3310 所以通过 Navicat 时可以直接访问 3310 连接到 但是在 php 容器里 没有对应的 3310 绑定 mysql 容器的 3306 所以连接不上?
        12
    cwz88   50 天前
    跟 Navicat 没关系,只是 docker 外部可以用自定义的 3310,docker 内部要用 3306
        13
    XSG   50 天前
    3310 是宿主机端口,只能通过宿主机网络访问 mysql,你的 navicat 跑在宿主机上,当然可以访问
    而 3306 是容器端口,上面有同学说过了,通过--links 方式访问,这是使用的容器网络,要和宿主机网络区分开
        14
    sarices   50 天前
    @su2018 就是这个意思
        15
    virus94   50 天前
    同遇到这个问题,不知道咋解决...
        16
    su2018   50 天前
    @virus94 嗯 我也折腾了好久 🤣
        17
    julyclyde   49 天前
    docker 发明了其它社会制度不存在的问题,并致力于解决它
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4026 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 27ms · UTC 03:46 · PVG 11:46 · LAX 19:46 · JFK 22:46
    ♥ Do have faith in what you're doing.