我在Symfony经验丰富,但对码头工作者来说很新,我有一个"连接拒绝错误"我无法解决问题。
很确定这是一个初学者错误,这里的解决方案非常简单......
以下是我的docker-compose
文件的内容:
version: '3.2'
services:
cg-demo:
build: docker/cg-demo
container_name: cg-demo
working_dir: /var/www/html
volumes:
- .:/var/www/html
- ./docker/demo/vhost.conf:/etc/apache2/sites-available/000-default.conf:ro
- ./docker/demo/php.ini:/usr/local/etc/php/php.ini:ro
- ~/.ssh:/var/www/.ssh
- ~/.composer:/var/www/.composer
environment:
- SYMFONY_ENV
- DOMAIN_NAME: cg-demo.docker
- VIRTUAL_HOST: cg-demo.docker
depends_on:
- database
env_file: .env
ports:
- 8000:80
database:
image: percona:5.6
ports:
- 3306:3306
expose:
- 3306
container_name: cg-demo-database
volumes:
- /docker/database:/etc/mysql/conf.d
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: demo
tmpfs:
- /var/lib/mysql
- /tmpfs:size=300M
这是基于另一个有效的项目,但我不确定这里发生的所有事情......
我还有一个phpmyadmin容器,这里没有显示。 PhpMyAdmin正确连接到数据库,可以在没有任何Web服务器问题的情况下使用它。但是,当谈到symfony容器时,每当尝试使用数据库时我都会这样做:
[Doctrine\DBAL\Exception\ConnectionException]
An exception occured in driver: SQLSTATE[HY000] [2002] Connection refused
[Doctrine\DBAL\Driver\PDOException]
SQLSTATE[HY000] [2002] Connection refused
[PDOException]
SQLSTATE[HY000] [2002] Connection refused
.env
文件中的连接信息如下:
# Database credentials
DATABASE_HOST=database
DATABASE_PORT=3306
DATABASE_USER=root
DATABASE_PASSWORD=root
DATABASE_DB=cg-demo
致电docker ps
告诉我:
CONTAINER ID IMAGE COMMAND
CREATED STATUS PORTS NAMES
16a67dadeebb phpmyadmin/phpmyadmin "/run.sh phpmyadmin" 15 minutes ago Up 15 minutes 0.0.0.0:8001->80/tcp cg.phpmyadmin.docker
8bd783aa1dd1 cg_cg-demo "entrypoint.sh apa..." 15 minutes ago Up 15 minutes 0.0.0.0:8000->80/tcp cg-demo
2fc7cd9105ba percona:5.6 "docker-entrypoint..." 15 minutes ago Up 15 minutes (healthy) 3306/tcp cg-database
我已经尝试从演示容器ping database
开始工作......
编辑1:
将以下内容添加到数据库容器中:
ports:
- 3306:3306
编辑2:
从所有容器中删除以下内容:
networks:
- default
编辑3:
app/config/config.yml
中的我的学说配置:
dbal:
host: "%env(DATABASE_HOST)%"
port: "%env(DATABASE_PORT)%"
dbname: "%env(DATABASE_DB)%"
user: "%env(DATABASE_USER)%"
password: "%env(DATABASE_PASSWORD)%"
charset: UTF8
mapping_types:
enum: string
server_version: 5.6
编辑4:
在数据库配置中添加了以下内容:
expose:
- 3306
答案 0 :(得分:1)
此答案适用于docker-compose版本2,也适用于版本3:
问题是链接容器问题。我们需要定义服务可以用来互相联系的其他别名。
暴露 3306端口不会解决您的问题。 mysql或percona 容器将通过默认配置暴露该端口。看一下percona image. 的docker hub。在这里提到:
从另一个Docker容器中的应用程序连接到MySQL
此图像公开了标准的MySQL端口(3306),因此容器 链接使MySQL实例可用于其他应用程序 容器。像这样启动您的应用程序容器,以便 将其链接到MySQL容器:
$ docker run --name some-app --link some-percona:mysql -d application-that-uses-mysql
因此,您应该将数据库链接到您的 cg-demo 容器。有两种解决方案:
1)在配置下添加链接:
services:
cg-demo:
build: docker/cg-demo
container_name: cg-demo
.
.
.
links:
- mysql
depeds_on 和链接之间的区别在于depends_on
docker-compose up
将以依赖关系顺序启动服务。在您的以下示例中,database
将在网络之前启动。
我们还可以访问数据。但这还不够,因为我们要确保您的Web容器(cg-demo)始终连接到数据库容器。
链接允许您定义额外的别名,通过该别名可以从另一个服务访问服务。
在以下示例中,可以从Web(cg-demo
)上的主机名数据库访问数据库。这意味着cg-demo
可以从3306端口连接数据库容器。
2)第二种解决方案是配置默认网络,而不是自定义自己的网络(或在其基础上)。只需在网络下定义一个默认条目:
networks:
bridge_name:
driver: bridge
然后您应该通过networks
标签将每个容器链接到该网桥:
cg-demo:
.
.
networks:
- bridge_name
database:
.
.
networks:
- bridge_name