图不link两个容器

Fig doesn't link two containers

长话短说:fig up 没有 link 2 个容器,而 docker run 可以。

场景:

有 2 个容器:一个带有 Cassandra,另一个带有客户端服务。当容器启动时,客户端希望主机文件中有 cassandra 主机名,并且能够到达它的 9042 端口。

我使用 docker 的 link 将容器紧密地连接在一起。这是一个 fig.yml:

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启动了cassandra,然后client但是client无法访问cassandra容器(它可以ping通,但无法访问9042端口)。

但是,如果我用 fig up cassandra 启动 cassandra,然后 运行:

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通信。

我检查了容器,这里是输出:
- cassandra inspect
- fig up client inspect
- docker run client inspect

我能找到的唯一区别是 HostConfig -> DevicesHostConfig -> LxcConf。在数字版本中,它们等于 null,在 docker-运行 版本中 - 等于 [].

有人可以解释一下 fig updocker run 之间的区别,以及为什么它在 'native' docker 场景中有效而在图 1 中不起作用。

可能是因为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