【问题标题】:Docker-Compose Services Not CommunicatingDocker-Compose 服务不通信
【发布时间】:2019-07-24 02:36:51
【问题描述】:

Docker 新手警报。希望这不是一个愚蠢的问题,但我似乎无法弄清楚发生了什么。我正在尝试创建一个 docker-compose 文件,该文件创建一个带有已安装卷的 mysql db 和一个连接到 mysql db 的 go webserver 应用程序。

这是我的 docker-compose 文件:

services:
  db:
    image: mysql:8.0.2
    environment: 
      MYSQL_ROOT_PASSWORD: test
      MYSQL_DATABASE: northernairport
    ports:
      - "3306:3306"
    volumes:
      - /data:/var/lib/mysql
  web:
    depends_on:
      - db
    build: .
    ports:
      - "8080:8080"

我的 go 应用程序似乎无法连接到我的 mysql 数据库,但我认为“depends_on”将确保这是可能的。

我得到的错误:

panic: dial tcp 127.0.0.1:3306: getsockopt: connection refused

谁能告诉我我在这里做错了什么?谢谢。

【问题讨论】:

  • 您向全世界开放了 3306 端口,而不仅仅是向您的其他 Docker 容器开放。这可能不是你想要的。
  • 如何打开 3306 到我的 web docker 容器?这是唯一需要直接访问数据库的东西
  • 要打开 3306 到您的 Web 应用程序,您基本上什么都不做 - 从您的数据库服务定义中删除 ports: 3306:3306 部分。由于这两个容器共享同一个网络,因此它们已经相互公开了端口。
  • 说得对,谢谢

标签: mysql go docker-compose


【解决方案1】:

depends_on 仅控制服务的构建和启动顺序。

您的实际问题更有可能是您使用了从 Web 应用程序到数据库的错误地址。我看到您没有定义任何网络,因此您使用的是docker-compose 为您的应用程序创建的default 网络。这将在默认网络的 DNS 上按名称发布每个服务。

因此,您的 Web 应用程序可能应该使用 db:3306 作为数据库地址,而不是错误消息中指示的 localhost:3306 或 127.0.0.1:3306。

【讨论】:

    【解决方案2】:

    ports 部分用于将容器端口与主机映射为以下格式ports (HOST:CONTAINER)。这意味着您正在尝试访问主机的机器,请将web 应用程序配置为连接到db:3306。

    【讨论】:

    • 我将另一个标记为正确只是因为它是第一个但是是的,你也是对的,给你投了赞成票。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2022-07-16
    • 2021-11-23
    • 1970-01-01
    • 2020-03-12
    • 2021-01-24
    • 2023-01-03
    • 2020-09-04
    • 1970-01-01
    相关资源
    最近更新 更多