【问题标题】:Using localhost instead of db for the mysql hostname in docker在 docker 中使用 localhost 而不是 db 作为 mysql 主机名
【发布时间】:2017-06-11 14:56:05
【问题描述】:

我想在php中使用localhost来指向mysql容器的ip而不是指向自己,这样我就可以使用mysql容器来获取数据了。

如何在我的 php 调用 mysql 中使用 localhost

$mysqli = new mysqli("localhost", "root", "examplepass", "set", 3306);

除非我使用 db 作为主机名,否则上述代码将不起作用。

db:
  image: mariadb
  container_name: mariadb
  environment:
    MYSQL_ROOT_PASSWORD: examplepass

www:
  build: ./images/www
  links:
    - db:mysql
  ports:
    - 8080:80

我是否必须通过 Dockerfile 或撰写 yaml 以某种方式更改容器中的 hosts 文件?

【问题讨论】:

  • @rickdenhaan 并不是真的因为我希望它通过使用 localhost 而不是容器名称来引用另一个容器,所以我可以在需要访问另一个容器上的 mysql 的 php 脚本中使用 localhost。
  • 是的,要实现这一点,您需要分别启动两个容器,而不是链接它们,正如该问题的已接受答案中所建议的那样。
  • @rickdenhaan 但随后 mysql 容器暴露在互联网上。我只希望 php 容器能够访问它。 (它说将端口暴露给主机)

标签: php docker containers docker-compose dockerfile


【解决方案1】:

这将按您的预期工作,但 www 将是它侦听的位置(80,而不是 8080):

version: "2"

services:
  db:
    image: mariadb
    container_name: mariadb
    environment:
      MYSQL_ROOT_PASSWORD: examplepass
    network_mode: "host"

  www:
    build: ./images/www
    links:
      - db
    network_mode: "host"

使用network_mode: "host",假设容器与您的主机获得相同的本地主机。

将 mysql bind-address 配置为 localhost 以避免将 mysql 暴露在您的主机之外。

【讨论】:

  • 我想将 mysql 指向 localhost 而不是像你我一样的 db。而且我也不想让mysql暴露在互联网上。它只能通过 php (www) 容器访问。
  • 那么有没有办法改变hosts文件将localhost指向mysql容器的ip? @罗伯特
  • 你试过--add-host=localhost:IP吗?不要告诉任何人我已经告诉过你这件事。改变 localhost 的含义可能会破坏宇宙。 docs.docker.com/compose/compose-file/#extra_hosts
【解决方案2】:

使用“socat”可以实现您想要做的事情 在 PHP 容器下,您可以将任何到达端口 3306 的请求转发到您的“db”容器。因此,当在您的情况下(www)在 PHP 容器下使用 localhost:3306 时,所有请求都将从“db”提供。但是你需要确保socat安装在“www”容器中并转发端口。

Socat 示例:socat TCP-LISTEN:3306,fork TCP:db:3306

通过示例检查什么是 socat: https://www.cyberciti.biz/faq/linux-unix-tcp-port-forwarding/

我希望你想要实现的目标可以通过对容器进行一些更改来完成

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    • 2021-09-10
    • 2016-08-29
    相关资源
    最近更新 更多