首页 > 解决方案 > 来自主机名“localhost”而不是容器名的php容器的数据库连接

问题描述

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

由于最近发生的问题(此处不相关),我们希望为两个用户组提供一个关于数据库连接的独特解决方案:Docker 用户应该能够使用 host 连接到他们的 mysql 服务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,但几周都没有找到解决方案。尝试使用链接、网络等。我想我的码头工人技能现在已经筋疲力尽了......

我还添加到mysql.conf

bind-address = 0.0.0.0

有任何想法吗?

标签: phpmysqldocker

解决方案


这是因为 docker 的网络结构。

docker 创建 3 个基本接口。docker0,hostnone.

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

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

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


推荐阅读