如何从主机连接到docker中的postgres?
搬运工-compose.yml
version: '2'
networks:
database:
driver: bridge
services:
app:
build:
context: .
dockerfile: Application.Dockerfile
env_file:
- docker/Application/env_files/main.env
ports:
- "8060:80"
networks:
- database
depends_on:
- appdb
appdb:
image: postdock/postgres:1.9-postgres-extended95-repmgr32
environment:
POSTGRES_PASSWORD: app_pass
POSTGRES_USER: www-data
POSTGRES_DB: app_db
CLUSTER_NODE_NETWORK_NAME: appdb
NODE_ID: 1
NODE_NAME: node1
ports:
- "5432:5432"
networks:
database:
aliases:
- database
docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------------------------------------
appname_app_1 /bin/sh -c /app/start.sh Up 0.0.0.0:8060->80/tcp
appname_appdb_1 docker-entrypoint.sh /usr/ ... Up 22/tcp, 0.0.0.0:5432->5432/tcp
从容器我可以成功连接。来自app容器和db容器。
在容器内运行psql的dbs和用户列表:
# psql -U postgres
psql (9.5.13)
Type "help" for help.
postgres=# \du
List of roles
Role name | Attributes | Member of
------------------+------------------------------------------------------------+-----------
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
replication_user | Superuser, Create role, Create DB, Replication | {}
www-data | Superuser | {}
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
----------------+------------------+----------+------------+------------+-----------------------
app_db | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
replication_db | replication_user | UTF8 | en_US.utf8 | en_US.utf8 |
template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
| | | | | postgres=CTc/postgres
(5 rows)
DB图像不是官方的postgres图像。但GitHub中的Dockerfile看起来很好看。
数据库容器中的cat /var/lib/postgresql/data/pg_hba.conf:# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 trust
# IPv6 local connections:
host all all ::1/128 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
#local replication postgres trust
#host replication postgres 127.0.0.1/32 trust
#host replication postgres ::1/128 trust
host all all all md5
host replication replication_user 0.0.0.0/0 md5
我试过两个没有运气的用户
$ psql -U postgres -h localhost
psql: FATAL: role "postgres" does not exist
$ psql -h localhost -U www-data appdb -W
Password for user www-data:
psql: FATAL: role "www-data" does not exist
在我的主机上看起来已经在该端口上运行了PSQL。我怎么检查呢?
答案 0 :(得分:2)
我在Ubuntu 16.04上运行了此
$ psql -h localhost -U www-data app_db
Password for user www-data:
psql (9.5.13)
Type "help" for help.
app_db=# \du
List of roles
Role name | Attributes | Member of
------------------+------------------------------------------------------------+-----------
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
replication_user | Superuser, Create role, Create DB, Replication | {}
www-data | Superuser | {}
然后从我的Mac到运行docker的VM(192.168.33.100是docker VM的IP地址)
$ psql -h 192.168.33.100 -U www-data app_db
Password for user www-data:
psql (9.6.9, server 9.5.13)
Type "help" for help.
app_db=# \du
List of roles
Role name | Attributes | Member of
------------------+------------------------------------------------------------+-----------
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
replication_user | Superuser, Create role, Create DB, Replication | {}
www-data | Superuser | {}
他们俩都为我工作。
VM上的PSQL版本
$ psql --version
psql (PostgreSQL) 9.5.13
Mac上的PSQL版本
$ psql --version
psql (PostgreSQL) 9.6.9
答案 1 :(得分:1)
我相信您在pg_hba.conf
中遇到问题。在这里,您指定了1台具有访问权限的主机-127.0.0.1/32。
您可以将其更改为此:
# IPv4 local connections:
host all all 0.0.0.0/0 md5
这将确保您的主机(完全不同的IP)可以连接。
要检查是否已运行postgresql实例,可以执行
netstat -plnt | grep 5432
。如果从中得到任何结果,则可以获取PID并验证过程本身。
答案 2 :(得分:1)
我相信问题是您在本地计算机上的端口5432上运行了postgres。 可以通过将Docker容器的端口5432映射到主机中的另一个端口来解决问题。 这可以通过更改docker-compose.yml
来实现。更改
"5432:5432"
到
"5433:5432"
重新启动docker-compose
现在docker容器postgres在5433上运行。(本地安装的postgres在5432上) 您可以尝试连接到Docker容器。
psql -p 5433 -d db_name -U user -h localhost
答案 3 :(得分:0)
我有一个相对类似的设置,下面的工作对我来说是将主机上的psql
会话打开到docker postgres实例中:
docker-compose run --rm db psql -h db -U postgres -d app_development
位置:
db
是容器的名称postgres
是用户名app_development
是数据库的名称对您来说,它看起来像docker-compose run --rm appdb psql -h appdb -U www-data -d app_db
。
答案 4 :(得分:0)
由于它是在OSX中运行的,因此您始终可以使用预安装的 Network Utility 应用在主机上运行 Port Scan ,并确定Postgres是否服务器正在运行(如果是,则在哪个端口上运行)。
但是我不认为您的主机上正在运行一个。问题是默认情况下Postgres在
5432
上运行,而您尝试运行的docker-compose
文件在同一端口(即5432
)上公开db容器。如果Postgres服务器已经在您的主机上运行,则Docker会尝试将容器暴露给已在使用的端口,从而产生错误。
另一种可能的解决方案:
从该answer中可以看出,mysql
用localhost
打开了一个unix套接字,而不是tcp套接字。也许这里发生了类似的事情。
在连接到容器中的服务器时,尝试使用127.0.0.1
代替localhost
。
答案 5 :(得分:0)
虽然在运行postgres 10官方docker容器时在基本OS 5.0上遇到了相同的问题。我能够使用正在运行的容器的ip从主机进行连接。
sudo docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name/id
获取IP后进行测试: psql -h 172.17.0.2 -U postgres