【发布时间】:2016-02-11 23:04:30
【问题描述】:
我在 Ubuntu 14.04 服务器主机上使用 Docker 版本 1.9.1 构建 a34a1d5,我有 4 个容器:redis(基于 alpine linux 3.2)、mongodb(基于 alpine linux 3.2)、postgres(基于 ubuntu 14.04 ) 以及将运行连接到这些其他容器的应用程序的应用程序(基于 alpine linux 3.2)。所有的 db 容器都在 Dockerfile 中公开了它们对应的端口。
我对数据库容器进行了修改,因此它们的服务不会绑定到本地主机 IP,而是绑定到所有地址。这样我就可以从应用程序容器连接到所有这些。 为了测试,我首先运行数据库容器,然后使用如下命令运行应用程序:
docker run --rm --name app_container --link mongodb_container --link redis_container --link postgres_container -t localhost:5000/app_image
我进入应用程序容器的终端,并验证其 /etc/hosts 文件是否包含其他容器的 IP 和名称。然后我可以 ping 所有的数据库容器。但我无法将他们的端口连接到任何数据库容器。
一个简单的:telnet mongodb_container 27017 只是坐下来永远等待,如果我尝试连接到其他数据库容器,也会发生同样的情况。如果我运行该应用程序,它还会抱怨它无法连接到指定的数据库服务。
重要提示:我可以从主机远程登录所有数据库容器的相应端口。
可能会发生什么?
编辑:我将包含 db 容器的运行命令:
docker run --rm --name mongodb_container -t localhost:5000/mongodb_image
docker run --rm --name redis_container -t localhost:5000/redis_image
docker run --rm --name postgres_container -t localhost:5000/postgres_image
【问题讨论】:
-
你能包含所有这些其他容器的运行命令吗?您是否公开了正确的端口并使用了
-p port:port标志? -
尝试
nslookup mongodb_container或ping mongedb_container看看它是否正在解析IP。--link参数应该在容器内的主机文件中写入一个条目,使它们能够解析。只是为了完整性...您可以像这样在容器中运行 shell:docker exec -it <CONTAINER_NAME> /bin/bash -
@cricket_007,当然,我添加了运行命令,我在测试时停止了 mongo 容器,然后在其运行命令中添加了
-p 27017:27017,但它仍然无法连接。在仔细检查 Dockerfile 之后,我公开了正确的端口。 -
@KevinBurdett,是的,从应用程序容器中,我可以 ping 所有其他容器,并且它们的 IP 已正确解析。是的,我使用
docker exec -it app_container bash进入我的应用容器。 -
我看到了这个帖子:stackoverflow.com/questions/31481530/… 并且 OP 的最后一条评论是“奇怪。也许 1.7.1 在 Ubuntu 14.04 上运行不佳?它现在对我有用,因为我降级了所以我’我要继续前进。”。也许我正在遭受同样的影响?
标签: docker