首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >流浪者+码头+ Postgresql -无法从主机连接

流浪者+码头+ Postgresql -无法从主机连接
EN

Stack Overflow用户
提问于 2015-05-15 14:01:56
回答 1查看 2.7K关注 0票数 2

我正在尝试使用Vagrant在本地模拟我们的生产设置。在生产中,我们为postgresql数据库使用了一个码头容器,运行在centos6.5/redhat上(不是自愿的)。

因此,在本地,我安装了Vagrant,创建了一台机器,让postgresql停靠容器在这台机器上启动并运行,通过从VM连接确保了它的运行。但是,我不知道如何从主机(或从另一个VM)连接postgresql。

这是我的Vagrant文件:

代码语言:javascript
复制
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|  

  config.vm.box = "chef/centos-6.5"

  config.vm.provision "shell" do |s|
    s.inline = "ps aux | grep 'sshd:' | awk '{print $2}' | xargs kill"
  end

  config.vm.define "db" do |db|
    db.vm.synced_folder "../db", "/vagrant/db"
    db.vm.synced_folder "../deploy", "/vagrant/deploy"
    db.vm.hostname = "dbserver"
    db.vm.network :private_network, ip: "192.168.50.4"
    db.vm.network :forwarded_port, guest: 5432, host: 6543 
  end

end

注意,我正在将来宾端口5432转发给主机端口6543。

在VM上,您可以看到docker运行postgresql容器:

代码语言:javascript
复制
[vagrant@dbserver vagrant]$ sudo docker ps
CONTAINER ID        IMAGE                                     COMMAND             CREATED             STATUS              PORTS                    NAMES
075f71e9f8de        quay.io/aptible/postgresql:standardized   "run-database.sh"   12 hours ago        Up 12 hours         0.0.0.0:5432->5432/tcp   hungry_morse  

在VM上,我必须使用如下命令进行连接:

代码语言:javascript
复制
psql -h 0.0.0.0 -U <username> -d db

从主机上看,我似乎应该使用:

代码语言:javascript
复制
psql -h 192.168.50.4 -p 6543 -U <username> -d db

但这给了我:

代码语言:javascript
复制
psql: could not connect to server: Connection refused
    Is the server running on host "192.168.50.4" and accepting
    TCP/IP connections on port 6543?

请注意,这并不是postgresql特有的。我有一个红色容器设置相同的方式,以同样的问题。

我不确定这是否是我的Vagrant设置,Centos上的防火墙,或者什么的问题。对如何使这件事奏效有什么想法吗?

更新1

我们的停靠容器中的pg_hba.conf文件如下所示:

代码语言:javascript
复制
local     all   all                        peer
hostssl   all   all        0.0.0.0/0       md5

我们的停靠容器中的postgresql.conf文件如下所示:

代码语言:javascript
复制
#------------------------------------------------------------------------------
# FILE LOCATIONS
#------------------------------------------------------------------------------

data_directory = '/var/lib/postgresql/9.3/main'
hba_file = '/etc/postgresql/9.3/main/pg_hba.conf'
ident_file = '/etc/postgresql/9.3/main/pg_ident.conf'
external_pid_file = '/var/run/postgresql/9.3-main.pid'

#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------

listen_addresses = '*'
port = 5432
max_connections = 250
unix_socket_directories = '/var/run/postgresql'
ssl = on
ssl_ciphers = 'DEFAULT:!LOW:!EXP:!MD5:@STRENGTH'
ssl_cert_file = '/etc/postgresql/9.3/ssl/server.crt'
ssl_key_file = '/etc/postgresql/9.3/ssl/server.key'

#------------------------------------------------------------------------------
# RESOURCE USAGE (except WAL)
#------------------------------------------------------------------------------

shared_buffers = 128MB


#------------------------------------------------------------------------------
# QUERY TUNING
#------------------------------------------------------------------------------

log_line_prefix = '%t '
log_timezone = 'UTC'
client_min_messages = ERROR
log_min_messages = FATAL
log_min_error_statement = FATAL

#------------------------------------------------------------------------------
# CLIENT CONNECTION DEFAULTS
#------------------------------------------------------------------------------

datestyle = 'iso, mdy'
timezone = 'UTC'
lc_messages = 'C'
lc_monetary = 'C'
lc_numeric = 'C'
lc_time = 'C'
default_text_search_config = 'pg_catalog.english'

tcp_keepalives_idle = 30
tcp_keepalives_interval = 30

更新2

VM的iptable规则:

代码语言:javascript
复制
[vagrant@dbserver vagrant]$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:http 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:postgres 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            ctstate RELATED,ESTABLISHED 
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain DOCKER (1 references)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             172.17.0.3          tcp dpt:postgres 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-15 14:24:35

看起来,您误解了如何在Vagrant实例上访问服务。您可以连接到VM作为服务及其服务端口的主机,也可以使用端口转发将流量从本地端口转发到VM的端口。

从主机上看,我似乎应该使用: psql -h 192.168.50.4 -p 6543 -U <username> -d db

对于Vagrant,如果您在上面转发了端口,那么就像在localhost上一样访问它。

在您的情况下,您应该使用以下任何一种方法:

psql -h 192.168.50.4 -p 5432 -U <username> -d db

psql -h 127.0.0.1 -p 6543 -U <username> -d db

而不是<VM ip>:<forwarded port>

除此之外,您还需要确保Postgres实例配置为允许远程访问asmPostgres (开箱即用),只接受来自本地主机的连接。

要打开远程访问,您必须首先修改hba.conflisten_addresspostresql.conf

pg_hba.conf需要有一个允许Vagrant主机连接到它的行。VM通常将其视为10.0.2.2,因此需要添加的行如下所示:

代码语言:javascript
复制
# Allow connections from Vagrant host on 10.0.2.2 to all datababases for all users using an md5 hashed password
host    all         all         10.0.2.2/32    md5

您的postgresql.conf更改很简单,因为您只需要替换:

代码语言:javascript
复制
listen_addresses='localhost'

通过以下方式:

代码语言:javascript
复制
listen_addresses='*'

对于典型的VM,我建议使用提供程序进行更改,但是对于Docker,您应该通过Dockerfile设置它。有益的是,Docker在文档中提供了这方面的有用的例子

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30261458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档