无法从Symfony 4 + Docker连接到Postgres

时间:2018-03-08 21:28:19

标签: postgresql symfony docker

我遇到了一个奇怪的问题。我已经创建了docker-compose文件来构建php + nginx + postgres服务:

version: '2'
services:
    db:
        image: orchardup/postgresql
        ports:
            - "5433:5432"
        environment:
            LC_ALL: C.UTF-8
            POSTGRESQL_USER: postgres
            POSTGRESQL_DB:   db
            POSTGRESQL_PASS: postgres

    php:
        build: .docker/php-fpm
        ports:
            - "9002:9002"
        volumes:
            - .:/var/www/symfony:cached
            - ./var/log/symfony:/var/www/symfony/var/log:cached
        links:
            - db

    nginx:
        build: .docker/nginx
        ports:
            - "8001:80"
        links:
            - php
        volumes_from:
            - php
        volumes:
            - ./var/log/nginx/:/var/log/nginx:cached

之后,我通过运行 bin / console doctrine:schema:update --force 来创建数据库模式。表和迁移创建得很好。好像DB连接好。我通过使用来自 .env 的凭据通过psql从我的机器连接到db来检查这个,表格就在那里。

但是当我进入网页并尝试授权时,我收到错误告诉我连接不正常:

Connection refused Is the server running on host "127.0.0.1" and accepting TCP/IP connections on port 5433?"

我检查了两种情况,我都有开发环境 - 来自网页和控制台。我尝试了5433和5432端口没有成功。我尝试了我能找到的所有东西3个小时。

这是postgres容器的输出:

# netstat -tlpn | grep 5432
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 0.0.0.0:5432            0.0.0.0:*               LISTEN      12/postgres
tcp6       0      0 :::5432                 :::*                    LISTEN      12/postgres

# grep listen /etc/postgresql/9.3/main/postgresql.conf
listen_addresses = '*'     # what IP address(es) to listen on;

1 个答案:

答案 0 :(得分:1)

容器相互通信的唯一方法是通过IP。通过--link(或links中的docker-compose)将多个容器链接在一起,docker在这两个容器之间创建了一个安全隧道,因此我们不需要在外部公开任何端口。

如果您尝试通过数据库客户端从本地环境连接到数据库,则可以从127.0.0.1:5433连接到数据库,因为端口通过docker-compose文件向您的主机公开。这就是您的架构更新命令成功的原因。

  

Docker公开源容器的连接信息   收件人容器有两种方式:

     
      
  1. 环境变量,
  2.   
  3. 更新/ etc / hosts文件。
  4.         

    参考:https://docs.docker.com/network/links/#communication-across-links

为了从db容器连接到您的数据库(在php容器中运行),您需要通过环境获取db容器的主机变量DB_PORT_5432_TCP_ADDR(我可能错了,但在env容器的终端中输入php进行验证。您需要SSH到您的php容器中)。

或者,您可以使用第二种方法,它只是db作为主机名而不是127.0.0.1,因为docker更新了/etc/hosts容器中的php文件以进行映射您的链接容器的名称为其IP,在这种情况下,映射到主机名db的值与存储在环境变量DB_PORT_5432_TCP_ADDR中的值相同。