Vagrant + Docker + Postgresql – 无法从主机连接

我试图用Vagrant在本地模拟我们的生产设置。 在生产中,我们在我们的postgresql数据库中使用docker容器,在centos6.5 / redhat上运行(而不是select)。

所以,在本地,我安装了Vagrant,创build了一台机器,启动了postgresql docker容器并在该机器上运行,通过连接虚拟机确保它正在运行。 但是我不知道如何从主机(或从另一个虚拟机)连接到postgresql。

这是我的stream浪文件:

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容器:

 [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上时,我必须使用如下命令进行连接:

 psql -h 0.0.0.0 -U <username> -d db 

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

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

但那是给我的:

 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。 我有一个redis容器设置相同的方式给出相同的问题。

我不确定这是否是我的Vagrant设置,Centos上的防火墙或什么的问题。 任何想法如何使这项工作?

更新1

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

 local all all peer hostssl all all 0.0.0.0/0 md5 

我们的docker容器中的postgresql.conf文件看起来像这样:

 #------------------------------------------------------------------------------ # 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的iptables规则:

 [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 

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

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

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

有了Vagrant,如果你转发你的端口,然后像在本地主机上一样访问它。

在你的情况下,你应该使用:

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实例configuration为允许远程访问asmPostgres,开箱即用,只接受来自localhost的连接。

要打开远程访问,您必须首先修改pg_hba.conf和listen_address postresql.conf 。

pg_hba.conf需要一个允许你的Vagrant主机连接的线路。 这通常被VM视为10.0.2.2,所以你需要添加的行看起来像这样:

 # 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更改很简单,因为您只需要replace:

 listen_addresses='localhost' 

有:

 listen_addresses='*' 

对于一个典型的虚拟机,我build议使用configuration文件进行更改,但是使用Docker,您应该通过Dockerfile来设置它。 有帮助的是,Docker在他们的文档中提供了一个有用的例子 。