所以我对docker是新手,这是我第一次尝试使用它来运行项目。我遇到的问题是我的php apache容器无法连接到我的mysql容器,而只能在浏览器中。我能做到:
docker exec -it <php container id> bash
然后跑
composer install
所有的
php bin/console doctrine:<>
命令没有数据库错误或连接问题。当我试图在浏览器中实际加载站点时,我遇到了“sqlstate[hy000][2002]connection-rejected”错误。我不太清楚为什么会这样,我在网上找到的结果似乎都不管用。这是我的档案:
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:
参数.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”,我觉得这很有趣。
任何可能出错的帮助都将不胜感激。
1条答案
按热度按时间eoigrqb61#
sup,我还不能评论,因为我是新来的,所以我会猜测你的应用程序没有问题。
这类问题通常与防火墙相关。docker为我们做了很多防火墙配置,所以我们不必自己处理ufw或ip表,但这也意味着我们需要指定每个容器如何使用docker compose文件进行交互。
您必须指定应用程序容器链接到数据库容器,以便允许主机命名访问,因为docker修改了容器
/etc/hosts
每次启动一个容器时,它都会将每个容器Map到当前ip,如下所示:完成后,您只需确保参数文件配置正确,正如@dbrumann所指出的,数据库密码应该包含您的密码,而不是空值。
为docker项目创建自定义网络也是一种很好的做法,这样您就可以在容器之间拥有一个很好的专用lan,而不必使用docker的默认网络对任何其他容器开放,具有默认值的自定义网络可以很好地完成此任务,如下所示:
您实际上不需要将数据库端口公开给主机就可以工作,但是公开它会使检查数据库时的开发方式更容易,所以在进入生产环境时请记住删除database container ports语句,以避免安全问题。
希望这对您有所帮助,以下是docker network文档的链接,以防您想了解更多:https://docs.docker.com/compose/compose-file/#network-配置参考