Vagrant + Docker + Postgresql - 无法从主机连接
Vagrant + Docker + Postgresql - Cannot connect from host
我正在尝试使用 Vagrant 在本地模拟我们的生产设置。在生产中,我们为我们的 postgresql 数据库使用 docker 容器,在 centos6.5/redhat 上使用 运行(不是选择)。
所以,我在本地安装了 Vagrant,创建了一台机器,启动了 postgresql docker 容器,并在该机器上 运行,通过从虚拟机。但是我不知道如何从主机(或另一个虚拟机)连接到 postgresql。
这是我的 Vagrant 文件:
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 }' | 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 作为服务的主机及其服务端口,也可以使用 port forwarding.
将流量从本地端口转发到 VM 的端口
From the host, it seems like I should be using:
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 实例配置为允许远程访问asmPostgres,开箱即用,只接受来自本地主机的连接。
要开启远程访问必须先修改pg_hba.conf and the 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 更改很简单,因为您只需替换:
listen_addresses='localhost'
与:
listen_addresses='*'
对于典型的 VM,我建议使用供应器进行更改,但对于 Docker,您应该通过 Docker 文件进行设置。很有帮助的是,Docker 在他们的文档中提供了 useful example 这方面的内容。
我正在尝试使用 Vagrant 在本地模拟我们的生产设置。在生产中,我们为我们的 postgresql 数据库使用 docker 容器,在 centos6.5/redhat 上使用 运行(不是选择)。
所以,我在本地安装了 Vagrant,创建了一台机器,启动了 postgresql docker 容器,并在该机器上 运行,通过从虚拟机。但是我不知道如何从主机(或另一个虚拟机)连接到 postgresql。
这是我的 Vagrant 文件:
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 }' | 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 作为服务的主机及其服务端口,也可以使用 port forwarding.
将流量从本地端口转发到 VM 的端口From the host, it seems like I should be using:
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 实例配置为允许远程访问asmPostgres,开箱即用,只接受来自本地主机的连接。
要开启远程访问必须先修改pg_hba.conf and the 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 更改很简单,因为您只需替换:
listen_addresses='localhost'
与:
listen_addresses='*'
对于典型的 VM,我建议使用供应器进行更改,但对于 Docker,您应该通过 Docker 文件进行设置。很有帮助的是,Docker 在他们的文档中提供了 useful example 这方面的内容。