我正在玩Docker,我想Dockerize一个Postgres容器。
我跟随官方example,但我无法连接到使用psql运行的图片。
我用示例的内容创建了Dockerfile。我从Dockerfile构建了一个图像并为其指定了一个名称。然后我运行PostgreSQL服务器容器(在前台)。
~/test » docker run --rm -P --name pg_test eg_postgresql
2014-10-10 06:12:43 UTC LOG: database system was interrupted; last known up at 2014-10-10 06:12:29 UTC
2014-10-10 06:12:43 UTC LOG: database system was not properly shut down; automatic recovery in progress
2014-10-10 06:12:43 UTC LOG: redo starts at 0/1782F68
2014-10-10 06:12:43 UTC LOG: record with zero length at 0/1782FA8
2014-10-10 06:12:43 UTC LOG: redo done at 0/1782F68
2014-10-10 06:12:43 UTC LOG: last completed transaction was at log time 2014-10-10 06:12:29.2487+00
2014-10-10 06:12:43 UTC LOG: database system is ready to accept connections
2014-10-10 06:12:43 UTC LOG: autovacuum launcher started
然后我打开另一个终端找出端口:
~/test » docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aaedb0479139 eg_postgresql:latest "/usr/lib/postgresql 3 days ago Up 41 seconds 0.0.0.0:49154->5432/tcp pg_test
所以我可以使用psql连接到实例。但我不能......
~/test » psql -h localhost -p 49154 -d docker -U docker --password
Password for user docker:
psql: could not connect to server: Connection refused
Is the server running on host "localhost" (127.0.0.1) and accepting
TCP/IP connections on port 49154?
could not connect to server: Connection refused
Is the server running on host "localhost" (::1) and accepting
TCP/IP connections on port 49154?
could not connect to server: Connection refused
Is the server running on host "localhost" (fe80::1) and accepting
TCP/IP connections on port 49154?
感谢任何帮助。
答案 0 :(得分:8)
在我的Mac上运行这个为我工作:
$ boot2docker ip
The VM's Host only interface IP address is: 192.168.59.103
然后按照以下方式连接:
$ psql -h 192.168.59.103 -p 49159 -d docker -U docker --password
要完成所有操作并不理想,但是https://docs.docker.com/installation/mac/处的说明表明如果您想直接从Mac连接,这是正确的解决方案。
答案 1 :(得分:6)
如果将--publish选项添加到docker run命令
docker run --rm -P --publish 127.0.0.1:5432:5432 --name pg_test eg_postgresql
当您运行docker文件时,以下内容将起作用(请注意该端口现在为5432)
psql -h localhost -p 5432 -d docker -U docker --password
答案 2 :(得分:2)
对我来说,解决方案只是在您的连接字符串中使用host.docker.internal
而不是localhost
。
https://github.com/npgsql/Npgsql.EntityFrameworkCore.PostgreSQL/issues/225
答案 3 :(得分:1)
有人回答了这个问题here
总结:仅发布容器的端口是不够的,因为在OS x上,docker容器在虚拟机上运行。 要检索虚拟机的“真实”地址,您应该使用管理docker守护程序和容器的工具。
我建议使用docker-machine
逻辑与wf答案非常相似,但是它使用docker-machine而不是boot2docker。
1- /检索虚拟机的名称
docker-machine ls
2- /通过使用虚拟机的名称(例如,默认)来检索其IP地址
docker-machine ip default
3- /在需要指定主机值的任何地方使用此值。