Php 在docker中使用localhost而不是db作为mysql主机名

Php 在docker中使用localhost而不是db作为mysql主机名,php,docker,containers,docker-compose,dockerfile,Php,Docker,Containers,Docker Compose,Dockerfile,我想在php中使用localhost来指向mysql容器的ip,而不是指向自身,这样我就可以使用mysql容器来处理数据 如何在对mysql的php调用中使用localhost $mysqli = new mysqli("localhost", "root", "examplepass", "set", 3306); 除非我使用db作为主机名,否则上述代码将无法工作 db: image: mariadb container_name: mariadb environment:

我想在php中使用localhost来指向mysql容器的ip,而不是指向自身,这样我就可以使用mysql容器来处理数据

如何在对mysql的php调用中使用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或compose yaml以某种方式更改容器中的主机文件?

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

使用
network\u模式:“主机”
,比如说,容器获得与主机相同的本地主机


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

可以使用“socat”实现您的目标 在PHP容器下,您可以将任何来自端口3306的请求转发到“db”容器。因此,在您的案例(www)中,当在PHP容器下使用localhost:3306时,所有请求都将从“db”提供服务。但您需要确保socat安装在“www”容器中并转发端口

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

用示例检查什么是socat:


我希望您正在尝试实现的目标可以通过使用上述内容在您的容器中进行一些更改来实现

可能重复@rickdenhaan,这并不是因为我希望它通过使用localhost而不是容器名称引用另一个容器,所以我可以在需要访问另一个容器上的mysql的php脚本中使用localhost。是的,要做到这一点,您需要分别启动这两个容器,而不是像该问题的公认答案中所建议的那样链接它们。@rickdenhaan但是mysql容器在internet上公开了。我只希望php容器能够访问它。(它说向主机公开端口)我想把mysql作为本地主机,而不是像你我一样的db。我也不想把mysql暴露在互联网上。它需要只能通过php(www)容器访问,所以没有办法更改hosts文件以将localhost指向mysql容器的ip@罗伯特您是否尝试过添加主机=本地主机:IP?不要告诉任何人我告诉过你这件事。改变localhost的含义可能会毁掉整个世界。
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"