似乎是一个常见的问题,但是具有不同的上下文,但是在使用Docker时我无法连接到本地数据库。
如果我使用docker inspect
检查mysql容器并找到IP地址并将其作为CMS的一部分用作数据库主机,则它运行良好...唯一的问题是mysql容器IP地址已更改(在每个docker-compose up
上(如果我更改了wifi网络),因此理想情况下,我想使用“ localhost”或“ 127.0.0.1”,但是由于某种原因,这会导致SQLSTATE[HY000] [2002] Connection refused
错误。
在CMS应用程序中如何使用“ localhost”或“ 127.0.0.1”作为数据库主机名,这样我就不必随着容器IP地址的更改而不断更改它?
这是我的docker-compose.yml文件:
version: "3"
services:
webserver:
build:
context: ./bin/webserver
restart: 'always'
ports:
- "80:80"
- "443:443"
links:
- mysql
volumes:
- ${DOCUMENT_ROOT-./www}:/var/www/html
- ${PHP_INI-./config/php/php.ini}:/usr/local/etc/php/php.ini
- ${VHOSTS_DIR-./config/vhosts}:/etc/apache2/sites-enabled
- ${LOG_DIR-./logs/apache2}:/var/log/apache2
networks:
mynet:
aliases:
- john.dev
mysql:
image: 'mysql:5.7'
restart: 'always'
ports:
- "3306:3306"
volumes:
- ${MYSQL_DATA_DIR-./data/mysql}:/var/lib/mysql
- ${MYSQL_LOG_DIR-./logs/mysql}:/var/log/mysql
environment:
MYSQL_ROOT_PASSWORD: example
networks:
- mynet
phpmyadmin:
image: phpmyadmin/phpmyadmin
links:
- mysql
environment:
PMA_HOST: mysql
PMA_PORT: 3306
ports:
- '8080:80'
volumes:
- /sessions
networks:
- mynet
networks:
mynet:
答案 0 :(得分:1)
尝试使用mysql
代替localhost
。
您正在定义webserver
容器和mysql
容器之间的链接,因此webserver
容器能够解析mysql
IP。
Docker Cloud为您的容器提供了两种查找其他服务的方式:
直接使用服务和容器名称作为主机名
使用基于Docker Compose链接的服务链接
服务和容器主机名在服务时自动更新 放大或缩小或重新部署。作为用户,您可以配置服务 名称,而Docker Cloud使用这些名称来查找 为您提供服务和容器。您可以在代码中使用主机名来 提供抽象,使您可以轻松交换服务容器 或组件。
服务链接创建环境变量,使容器可以 在堆栈中相互通信,或与其他服务通信 在堆栈之外。您可以在您明确指定服务链接时 创建新服务或编辑现有服务,或在 服务堆栈的堆栈文件。
来自Docker compose documentation:
可以使用与别名相同的主机名访问链接服务的容器,如果未指定别名,则可以访问服务名称。