如何将本地托管的 MySQL 数据库与 docker 容器连接

新手上路,请多包涵

通过 docker-compose.yml 我能够运行该应用程序。现在我们想将应用程序迁移到生产环境,但我们不想使用容器数据库。那么有什么方法可以让我使用 docker-compose 将我的本地 MySQL 数据库与应用程序连接起来吗?

我的 docker-compose.yml 看起来像:

 version: '3'
services:
  web-app:
    build:
      context: .
      dockerfile: web-app/Dockerfile
    ports:
      - 8080:8080
    links:
      - app-db

  app-db:
    build:
      context: .
      dockerfile: app-db/Dockerfile

    environment:
    - MYSQL_ROOT_PASSWORD=password
    - MYSQL_DATABASE=Optimize
    ports:
      - 3306:3306

而不是 app-db 部分我只想连接到我本地托管的 mysql 数据库。

原文由 Prateek Naik 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 458
2 个回答

在 docker 网络中找到主机 ip。如果您使用 docker-compose.yml version: "3" 可能该 IP 是: 172.18.0.1但确认它 正在搜索您的容器(您的主机)的“网关”:

 docker inspect <container-id-or-name> | grep Gateway
"Gateway": "",
            "IPv6Gateway": "",
            "Gateway": "172.18.0.1",
            "IPv6Gateway": "",

因此,在您的 docker 应用程序内部指向 MySQL: 172.18.0.1:3306 (可能在配置文件中)。考虑到 IP 是固定的,只要 docker 网络仍然相同(网络是由 docker-compose 创建的,除非你这样做,否则它不会被删除 docker-compose down

此外,检查您的 MySQL 是否正在侦听其所有接口。在您的 my.cnf 搜索 bind-address 应该是 0.0.0.0 (如果您的服务器有公共 IP,请考虑安全问题)。


作为替代方案,您可以为容器带来与主机相同的网络,以便共享本地主机,因此容器将在那里找到 mysql。使用网络模式作为“主机”:

 version: '3'
services:
  web-app:
    build:
      context: .
      dockerfile: web-app/Dockerfile
    ports:
       - 8080:8080
    network_mode: "host"

然后,将您的 hibernate.properties 指向 mysql,如下所示: localhost:3306

原文由 Robert 发布,翻译遵循 CC BY-SA 3.0 许可协议

只需使用 host.docker.internal 而不是 localhost

要使其在 Linux 上运行,您只需启动 Docker 容器并传递参数 --add-host host.docker.internal:host-gateway

原文由 Júlio Falbo 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题