来自具有主机名“ localhost”而不是容器名的php容器的数据库连接

时间:2019-11-21 14:02:12

标签: php mysql docker

我们的网站框架旨在在xampp和docker环境中使用。我们正在通过主机名/ IP地址(开发,测试,登台,实时环境)识别数据库主机。使用xampp的人正在使用https://localhost,因此他们获得了名为Development的环境变量。与Docker合作的人们正在使用https://docker作为主机。他们得到称为Development/Docker的环境变量。我们需要这种区别,因为在php应用程序中,我们的xampp用户正在使用主机localhost连接到其mysql服务。 Docker用户必须通过名为mysql的主机(这是mysql-service的容器名称)进行连接。

  

由于最后发生的问题(在此不相关),我们希望为两个用户组提供有关数据库连接的独特解决方案:Docker用户应该能够使用主机localhost连接到他们的mysql服务

docker-compose.yaml(为得到更好的概述而缩写):

version: '2'
services:
  #######################################
  # PHP application Docker container
  #######################################
  app:
    build:
      context: .
      dockerfile: Dockerfile.development
    links:
      - mail
      - mysql
      - redis
    ports:
      - "80:80"
      - "443:443"
      - "10022:22"
      - "3307:3306"
    volumes:
      - ./app/:/app/
      - ./:/docker/
    cap_add:
      - SYS_PTRACE
    env_file:
      - etc/environment.yml
      - etc/environment.development.yml
    environment:
      - POSTFIX_RELAYHOST=[mail]:1025

  #######################################
  # MySQL server
  #######################################
  mysql:
    build:
      context: docker/mysql/
      dockerfile: MariaDB-10.Dockerfile
    ports:
      - "3306"
    volumes:
      - mysql:/var/lib/mysql
    env_file:
      - etc/environment.yml
      - etc/environment.development.yml

  #######################################
  # phpMyAdmin
  #######################################
  # /// #

  #######################################
  # Mail
  #######################################
  # /// #

  #######################################
  # Redis
  #######################################
  # /// #

# Volumes
volumes:
  mysql:
  phpmyadmin:
  redis:

我尝试了很多,并使用了docker-compose,但是好几个星期都没有找到解决方案。尝试使用链接,网络等。我认为我的Docker技能现在已经筋疲力尽...

我还添加了mysql.conf

bind-address = 0.0.0.0

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这是因为docker的网络结构。

docker创建3个基本接口。 docker0hostnone

每个容器默认使用docker0。那么每个容器将具有一个虚拟网络接口,用于容器之间的通信。因此您可以使用地址为mysql的数据库。

如果您要连接到地址为localhost的数据库,则应将docker配置为使用host网络模式(可以通过在docker compose文件中为应用程序服务的定义添加一行来实现) 。它将能够连接到系统上正在运行的每个应用程序。顺便说一下,您将失去与其他容器之间按其名称的通信。也许您失去了与Redis(与redis地址相关联)的连接

在这种网络模式下,应部署每个依赖项或将其公开给您的本地主机。