连接两个 docker-compose 实例
Posted
技术标签:
【中文标题】连接两个 docker-compose 实例【英文标题】:Connect two instances of docker-compose 【发布时间】:2016-03-27 09:58:01 【问题描述】:我有一个 dockerized 应用程序,其中有一些使用 docker-compose 运行的服务。我想使用另一个 docker-compose 应用程序docker-elk 将此应用程序与 ElasticSearch/Logstash/Kibana (ELK) 连接起来。它们都在开发中的同一台 docker 机器上运行。在生产中,情况可能并非如此。
如何配置我的应用程序的 docker-compose.yml
以链接到 ELK 堆栈?
【问题讨论】:
你不能。您要么需要使用主机网络连接到应用程序,要么使用 docker compose 覆盖网络,我认为这对于生产用例来说还不够成熟。 【参考方案1】:2016 年 6 月更新
从 docker 1.10 开始,以下答案已过时。有关新解决方案,请参阅其他类似的答案。 https://***.com/a/34476794/1556338
旧答案
创建网络:
$ docker network create --driver bridge my-net
在 docker-compose.yml 文件中将该网络作为环境变量 ($NETWORK
) 引用。例如:
pg:
image: postgres:9.4.4
container_name: pg
net: $NETWORK
ports:
- "5432"
myapp:
image: quay.io/myco/myapp
container_name: myapp
environment:
DATABASE_URL: "http://pg:5432"
net: $NETWORK
ports:
- "3000:3000"
注意http://pg:5432
中的pg
会解析到pg服务(容器)的ip地址。无需硬编码 IP 地址; pg 的条目会自动添加到 myapp 容器的 /etc/host 中。
调用 docker-compose,将您创建的网络传递给它:
$ NETWORK=my-net docker-compose up -d -f docker-compose.yml -f other-compose.yml
我在上面创建了一个bridge network,它只能在一个节点(主机)内工作。对开发人员有好处。如果您需要让两个节点相互通信,您需要创建一个 overlay network。不过原理一样。您将网络名称传递给 docker-compose up 命令。
【讨论】:
【参考方案2】:你也可以在你的 docker-compose 之外用 docker 创建一个网络:
docker network create my-shared-network
在你的 docker-compose.yml 中:
version: '2'
services:
pg:
image: postgres:9.4.4
container_name: pg
expose:
- "5432"
networks:
default:
external:
name: my-shared-network
在你的第二个 docker-compose.yml 中:
version: '2'
myapp:
image: quay.io/myco/myapp
container_name: myapp
environment:
DATABASE_URL: "http://pg:5432"
net: $NETWORK
expose:
- "3000"
networks:
default:
external:
name: my-shared-network
而且两个实例都可以互相看到,主机上没有开放端口,你只需要暴露端口,就可以通过网络互相看到:“my-shared-network”。
【讨论】:
第二个 docker-compose.yml 中是否需要net: $NETWORK
?
如果一个服务必须先于另一个启动,我们如何实现link或depends_on。【参考方案3】:
看看多主机 docker 网络
网络是 Docker 引擎的一项功能,它允许您创建 虚拟网络并将容器附加到它们,以便您可以创建 适合您的应用程序的网络拓扑。网络化的 容器甚至可以跨越多个主机,因此您不必担心 关于您的容器所在的主机。他们无缝沟通 无论他们身在何处,都可以相互联系——从而实现真正的分布式 应用程序。
【讨论】:
虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review @tmoreau 我同意。但这个问题太宽泛,话题太复杂,无法给出简短的回答。我删除了链接,以便 OP 可以 google。 如果问题太宽泛,就这样标记。您的回答可能是评论。 见仁见智。答案太笼统,不是问题。答案用于为问题添加解决方案。用于添加基本信息、要求澄清、要求额外信息等的评论。虽然答案很简短,但可以作为未来的参考。【参考方案4】:如果您为第一个合成设置了可预测的项目名称,则可以使用 external_links 从不同的合成文件中按名称引用外部容器。
在下一个 docker-compose 版本 (1.6) 中,您将能够使用用户定义的网络,并让两个组合加入同一个网络。
【讨论】:
以上是关于连接两个 docker-compose 实例的主要内容,如果未能解决你的问题,请参考以下文章
docker-compose wordpress mysql连接被拒绝
使用 docker-compose 无法在同一网络中连接 mysql 和 spring boot