php - 来自主机名 "localhost"而不是容器名称的 php 容器的数据库连接

标签 php mysql docker

我们的网站框架设计用于 xampp 和 docker 环境。我们通过主机名/IP 地址(dev、test、staging、live env)识别我们的数据库主机。使用 xampp 的人正在使用 https://localhost,因此他们获得名为 Development 的环境变量。使用 docker 的人使用 https://docker 作为他们的主机。他们获得名为 Development/Docker 的环境变量。我们需要这种区别,因为在 php 应用程序中,我们的 xampp 用户正在使用主机 localhost 连接到他们的 mysql 服务。 Docker 用户必须通过名为 mysql 的主机进行连接(这是 mysql 服务的容器名称)。

Because of the last occurred problems (not relevant to be mentioned here) we want a unique solution for both user-groups concerning the database connection: Docker users should be able to connect to their mysql service with host localhost.

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

有什么想法吗?

最佳答案

这是因为docker的网络结构。

docker 创建了 3 个基本接口(interface)。 docker0hostnone

每个容器默认使用docker0。那么每个容器都会有一个虚拟网络接口(interface),用于容器之间的通信。所以你可以使用你的数据库与 mysql 地址。

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

在这种网络模式下,每个依赖项都应该部署或暴露给您的本地主机。

关于php - 来自主机名 "localhost"而不是容器名称的 php 容器的数据库连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58976748/

相关文章:

docker - 如何找出 Docker 选择了哪个随机端口?

PHP检查登录验证

mysql - 无需 mysqldump 自动下载整个 mysql 数据库

java - 如何使用Java将特殊字符插入MySQL

mysql - 子查询上的 SQL RIGHT JOIN 不起作用

linux - 安装 Docker 时出错 - curl : (23) Failed writing body (0 ! = 13847)

php - 什么时候脚本会在 PHP 中包含两次?

PHP 请求需要正文/表单内容与报价一起发送

PHPExcel 即时写入?

docker - 将 ARG 放在 Dockerfile 顶部会阻止层重用吗?