我遇到了一个奇怪的问题。我已经创建了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;
答案 0 :(得分:1)
容器相互通信的唯一方法是通过IP。通过--link
(或links
中的docker-compose
)将多个容器链接在一起,docker在这两个容器之间创建了一个安全隧道,因此我们不需要在外部公开任何端口。
如果您尝试通过数据库客户端从本地环境连接到数据库,则可以从127.0.0.1:5433
连接到数据库,因为端口通过docker-compose文件向您的主机公开。这就是您的架构更新命令成功的原因。
Docker公开源容器的连接信息 收件人容器有两种方式:
- 环境变量,
- 更新/ etc / hosts文件。
醇>参考: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
中的值相同。