流浪汉+;Docker&x2B;Postgresql-无法从主机连接
我正在尝试使用Vagrant在本地模拟我们的生产设置。在生产中,我们为postgresql数据库使用docker容器,运行在centos6.5/redhat上(不是选择) 因此,在本地,我安装了Vagrant,创建了一台机器,安装了postgresql docker容器并在该机器上运行,通过从VM连接来确保其运行。但是,我不知道如何从主机(或其他VM)连接到postgresql 这是我的流浪汉档案:流浪汉+;Docker&x2B;Postgresql-无法从主机连接,postgresql,docker,vagrant,Postgresql,Docker,Vagrant,我正在尝试使用Vagrant在本地模拟我们的生产设置。在生产中,我们为postgresql数据库使用docker容器,运行在centos6.5/redhat上(不是选择) 因此,在本地,我安装了Vagrant,创建了一台机器,安装了postgresql docker容器并在该机器上运行,通过从VM连接来确保其运行。但是,我不知道如何从主机(或其他VM)连接到postgresql 这是我的流浪汉档案: VAGRANTFILE_API_VERSION = "2" Vagrant.configure
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
请注意,这并非特定于postgresql。我有一个redis容器设置,以相同的方式给出相同的问题
我不确定这是否是我的流浪设置、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
虚拟机的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
看起来您误解了如何访问流浪实例上的服务。您可以作为服务的主机及其服务端口连接到VM,也可以使用将流量从本地端口转发到VM的端口 从主机上看,我似乎应该使用:
psql -h 192.168.50.4 -p 6543 -U <username> -d db
psql-h192.168.50.4-p6543-U-ddb
使用Vagrant时,如果您将端口转发到您的主机上,则可以像在本地主机上一样访问它
在您的情况下,您应该使用:
psql-h192.168.50.4-p5432-U-ddb
或
psql-h127.0.0.1-p6543-U-ddb
而不是:
除此之外,您还需要确保您的Postgres实例配置为允许远程访问asmPostgres,即插即用,只接受来自本地主机的连接
要打开远程访问,必须首先修改侦听地址
pg_hba.conf需要有一条线路,允许您的流浪主机连接到它。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更改很简单,只需替换:
listen_addresses='localhost'
与:
对于典型的VM,我建议使用provisioner进行更改,但是对于Docker,您应该通过Dockerfile进行设置。Docker在他们的文档中提供了这方面的帮助。因此,我可以深入了解我们针对postgresql的Dockerfile的详细信息,但我认为这已经设置好了。我把这个完全相同的Docker容器放到AWS上,能够从外部主机连接,没有问题。我将在我的问题的更新中发布pg_hba.confg和postgresql.conf的详细信息。似乎我在我的postgresql资料中有了所需的设置。我正在监听所有地址,并允许所有连接。因此,问题似乎更多地出现在Centos级别或流浪者级别(或两者的某种组合)。您是否也可以在Centos VM上显示
iptables-L
?另外,您最好使用Vagrant直接提供Docker映像,或者如果您在Windows/Mac上,则使用boot2docker。这里的整个想法是模拟生产,因此我们在Centos上安装了Docker,就像在生产中一样。据我所知,boot2docker根本没有被使用。看起来您的CentOS虚拟机正在接受5432而不是转发6543上的连接。您可以在VM上尝试iptables-A INPUT-p tcp--dport 6543-j ACCEPT
?
listen_addresses='localhost'
listen_addresses='*'