php - 来自主机名“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
有任何想法吗?
解决方案
这是因为 docker 的网络结构。
docker 创建 3 个基本接口。docker0
,host
和none
.
每个容器默认使用 docker0。那么每个容器都会有一个虚拟网络接口用于容器之间的通信。所以你可以使用你的数据库mysql
地址。
如果您想使用地址连接到数据库,localhost
您应该将 docker 配置为使用host
网络模式(您可以通过在 docker compose 文件中添加一行来定义您的应用服务)。它将能够连接到您系统上运行的每个应用程序。顺便说一句,你会通过他们的名字与其他容器失去联系。也许你失去了与你的 redis 的联系(与redis
地址相关)
在这种网络模式下,每个依赖项都应该被部署或暴露给你的本地主机。
推荐阅读
- flutter - Flutter 网页上的 Index.html
- r - 有了这些等式,如果我们知道一年内每个部门工作的初始人数,我们就可以估计下一年的人数
- sql-server - 为什么我的应用程序 docker 没有连接到我的数据库 docker?
- python - 使用 .fillna 将一列中的 NA 值替换为另一列中的值
- rabbitmq - 磁盘满后的 RabbitMQ 恢复队列
- java - 如何从android studio中的recycler视图将数据添加到SQLite数据库中
- java - 生成像素样式真实类型字体的位图(Java.awt)
- angular - 为什么选项/标志在我的角度 CLI 上不起作用?
- react-native - React Native - 如果数组中的所有内容都包含
- python - django和django rest框架的区别