我们的网站框架设计用于 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)。 docker0
、host
和 none
。
每个容器默认使用docker0。那么每个容器都会有一个虚拟网络接口(interface),用于容器之间的通信。所以你可以使用你的数据库与 mysql
地址。
如果你想连接到地址为 localhost
的数据库,你应该将 docker 配置为使用 host
网络模式(你可以通过在应用程序的定义中添加一行来实现docker compose 文件中的服务)。它将能够连接到您系统上运行的每个应用程序。顺便说一下,你会通过他们的名字失去与其他容器的通信。也许你失去了与你的 redis 的连接(它与 redis
地址连接)
在这种网络模式下,每个依赖项都应该部署或暴露给您的本地主机。
关于php - 来自主机名 "localhost"而不是容器名称的 php 容器的数据库连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58976748/