长话短说:fig up
docker run
时,cassandra
无法正确链接2个容器。
情境:
有两个容器:一个是Cassandra,另一个是客户服务。当容器启动时,客户端希望在hosts文件中具有fig.yml
主机名,并且能够访问它的9042端口。
我将docker的链接用于紧密的容器。这是cassandra:
image: "myrepo/cassandra"
ports:
- "7199:7199"
- "9042:9042"
- "9160:9160"
- "61621:61621"
- "2222:22"
hostname: cassandra
client:
image: myrepo/client
links:
- cassandra
ports:
- "8098:8098"
- "8099:8099"
hostname: client
:
fig up client
当我执行fig up cassandra
时,fig启动cassandra,然后客户端但客户端无法访问cassandra容器(它可以ping通,但无法到达9042端口)。
但是,如果我使用docker run --link tramm_cassandra_1:cassandra --link tramm_cassandra_1:cassandra_1 --link tramm_cassandra_1:tramm_cassandra_1 -p 8098:8098 -p 8099:8099 myrepo/client
启动cassandra,然后运行:
HostConfig -> Devices
然后客户端可以毫无问题地与cassandra进行通信。
我检查了容器,这是输出:
- cassandra inspect
- fig up client inspect
- docker run client inspect
我能找到的唯一区别是HostConfig -> LxcConf
和null
。在fig-up版本中,它们在docker-run version中等于[]
到fig up
。
有人可以解释docker run
和{{1}}之间的区别以及为什么它可以在本地' docker场景并没有在图中。
答案 0 :(得分:2)
这可能是因为cassandra需要花费大量时间才能真正开始收听端口。尝试fig up cassandra
,等待一段时间,然后fig up --no-recreate client
。
另见:
Proposal: Containers should not be considered started until the TCP ports they expose are open
Is there a way to delay container startup to support dependant services with a longer startup time