Docker& Postgres:无法绑定已使用的tcp 0.0.0.0:5432地址

时间:2016-07-07 15:25:47

标签: macos postgresql docker

问题

我试图在我的Mac上的docker容器中启动postgres,但我不断收到以下错误消息

  

docker:来自守护程序的错误响应:驱动程序在端点postgres上编程外部连接失败(8392b9e5cfaa28f480fe1009dee461f97e82499726f4afc4e916358dd2d2f61e):启动userland代理时出错:无法绑定已使用的tcp 0.0.0.0:5432地址。

我在本地安装了postgres,但我停止了并运行

pg_ctl status

返回

  

pg_ctl:没有服务器正在运行

我已经运行以下内容来检查5432上运行的内容

lsof -i tcp:5432

&安培;

netstat -anp tcp | grep 5432

并且端口上没有任何东西在运行。

版本

Mac - OS X El Capitan版本10.11.2

PostgreSQL - 9.5

Docker - Docker版本1.12.0-rc2,build 906eacd,experimental

5 个答案:

答案 0 :(得分:17)

lsof -i :5432

似乎docker(1.12.0-rc3-beta18)正在使用postgres的一个实例(我杀死了服务并强制docker重启)。为了解决这个问题,我将docker-compose ports部分从5432:5432更改为5432,然后让docker自动选择端口。

答案 1 :(得分:4)

您应该做的第一件事是停止postgress服务。 在大多数情况下,它可以解决问题。

sudo service postgresql stop

如果abvoe不起作用。然后将以下行添加到/etc/postgresql/12/main/postgresql.conf

sudo vim /etc/postgresql/12/main/postgresql.conf

## good if you add under CONNECTION AND AUTHENTICATION comments
listen_addresses = "*"

答案 2 :(得分:3)

如果lsof -i :5432没有显示任何输出,则可以使用sudo ss -lptn 'sport = :5432'

按照接受kill <pid>的答案进行进一步操作

答案 3 :(得分:0)

在某些情况下,必须在停止或终止容器/进程之前对问题进行更深入的调试。

请考虑以下清单:

1)检查您当前的docker撰写环境
运行docker-compose ps
如果另一个容器正在使用该端口,则用docker-compose stop <service-name-in-compose-file>停止它,或者通过用stop替换rm来删除它。

2)检查在当前工作空间之外运行的容器
运行docker ps以查看主机下运行的所有容器的列表。
如果发现另一个容器正在使用该端口,则可以使用docker stop <container-id>停止该端口。
(*)因为您不在原始compose环境的范围内-因此,最好使用docker inspect来收集有关将要停止的容器的更多信息。

3)检查端口是否被主机上运行的其他进程使用
例如,如果端口是6379,请运行:

$ sudo netstat -ltnp | grep ':6379'
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      915/redis-server 12 
tcp6       0      0 ::1:6379                :::*                    LISTEN      915/redis-server 12

(*)您还可以使用lsof命令,该命令主要用于检索有关由各种进程打开的文件的信息(我建议在此之前运行netstat)。

因此,如果在PID以上的输出是915。现在您可以运行:

$ ps j 915
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
    1   915   915   915 ?           -1 Ssl    123   0:11 /usr/bin/redis-server 127.0.0.1:6379

并查看父进程(PPID)的ID和执行命令。
您还可以运行:$ pstree -s <PID>以可视化方式显示该流程及其相关流程(安装:brew install pstree)。

在我们的例子中,我们可以看到该进程可能是守护进程(PPID为1)-在这种情况下,请考虑运行:
A)$ cat /proc/<PID>/status,以便获得有关以下内容的更深入的信息进程,例如进程产生的线程数,其功能等。
B)$ systemctl status <PID>,以查看引起特定进程创建的单元。如果服务不是很关键-您可以stop and disable the service

4)重新启动Docker服务
运行sudo service docker restart

5)您已经达到了这一点。
仅在不给系统带来风险的情况下,请考虑重新启动服务器。

答案 4 :(得分:0)

转到项目,然后单击docker-compose.yml

version: '2'
services:
    web:
        build: .
        ports: 
            - "8000:8000"
        volumes: 
            - .:/app
        links: 
            - db
            - mail-server
    db:
        image: "postgres"
        environment: 
            POSTGRES_PASSWORD: hunter2
        ports:
            - "5432:9432"
    mail-server:
        image: "mailhog/mailhog"
        expose: 
            - 1025
        ports: 
            - "8026:8026"

” 将端口更改为8026:8026,因为此端口号上已经在运行另一个容器,请仅更改端口号。