繁体   English   中英

Symfony + Docker,连接被拒绝

[英]Symfony + Docker, connection refused

我在 Symfony 中经验丰富,但对 docker 很陌生,我有一个“连接被拒绝的错误”,我无法解决。

很确定这是一个初学者错误,这里的解决方案非常简单......

这是我的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

这个答案适用于 docker-compose 版本 2,它也适用于版本 3:

问题是链接容器问题。 我们需要定义额外的别名,服务可以使用这些别名来相互访问。

暴露3306端口并不能解决你的问题。 mysql 或 percona容器将默认公开该端口。 查看percona 图像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_onlinksdepends_on在于, depends_on docker-compose up会按照依赖顺序启动服务。 在以下示例中, database将在 web 之前启动。
我们还可以访问数据。 但这还不够,因为我们要确保您的 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM