我试图在我的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
答案 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>
,以查看引起特定进程创建的systemd单元。如果服务不是很关键-您可以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,因为此端口号上已经在运行另一个容器,请仅更改端口号。