所以我是docker的新手,这是我尝试使用它运行的第一个项目。我遇到了我的php-apache容器无法连接到我的mysql容器的问题,而只能在浏览器中。我可以做到:
docker exec -it <php container id> bash
然后运行
composer install
和所有
php bin/console doctrine:<>
命令很好,没有数据库错误或连接问题。当我尝试在浏览器中实际加载网站时,遇到“ SQLSTATE [HY000] [2002]连接被拒绝”错误。我不太确定为什么会这样,并且在网络上找不到任何结果似乎有效。这是我的文件:
docker-compose.yml
version: '3'
services:
db:
restart: always
container_name: hcp-db
build:
context: ../
dockerfile: docker/db/Dockerfile
environment:
- MYSQL_ALLOW_EMPTY_PASSWORD=yes
- MYSQL_DATABASE=symfony
- MYSQL_USER=root
- MYSQL_PASSWORD=password
volumes:
- db:/var/lib/mysql
expose:
- 3306
ports:
- "4306:3306"
application:
container_name: hcp-symfony
build:
context: ../
dockerfile: docker/Dockerfile
working_dir: /app
expose:
- 80
ports:
- 8000:80
depends_on:
- db
volumes:
- ../:/app
environment:
- SYMFONY_ENV=dev
- SYMFONY_DEBUG=1
volumes:
db:
parameters.yml
parameters:
database_driver: pdo_mysql
database_host: db
database_port: 3306
database_name: symfony
database_user: root
database_password: null
当我的容器运行时,我也可以使用Sequel Pro很好地连接到数据库,使用我在参数中提供的相同凭据,但主机名为“ 127.0.0.1”,这很有趣。>
对于可能出问题的任何帮助将不胜感激。
答案 0 :(得分:1)
抱歉,由于我是新手,因此我无法发表更多细节,所以我会做出一个疯狂的猜测,并假设您的应用程序没有问题。
这种问题通常与防火墙有关。 Docker为我们做了很多防火墙配置,因此我们不必自己处理ufw或IP表,但这也意味着我们需要指定每个容器如何通过docker compose彼此交互。 / p>
您必须指定您的应用容器链接到数据库容器,以允许主机名访问,因为每次容器启动时docker都会修改容器/etc/hosts
文件,以便它映射每个容器的当前IP,如下所示:>
services:
...
application:
...
depends_on:
- db
links:
- db
完成此操作后,只需确保按照@dbrumann所指出的那样正确配置参数文件,database_password应该包含您的密码而不是空值。
为您的Docker项目创建自定义网络也是一种好习惯,这样您就可以在容器之间使用漂亮的私有局域网,而无需使用docker的默认网络打开任何其他容器,具有默认值的自定义网络可以很好地完成工作,像这样:
services:
db:
...
networks:
- my_project_network
application:
...
depends_on:
- db
links:
- db
networks:
- my_project_network
networks:
my_project_network:
您实际上并不需要将数据库端口公开给主机,但要公开它可以使检查数据库时的开发方式更容易,因此请记住在进入生产环境时请删除数据库容器端口语句,以避免安全问题。
希望这会有所帮助,如果您想了解更多,这是指向docker网络文档的链接:https://docs.docker.com/compose/compose-file/#network-configuration-reference