连接 docker-compose 的两个实例
Connect two instances of docker-compose
我有一个 docker 化的应用程序,其中包含一些使用 docker-compose 的服务 运行。我想使用另一个 docker-compose 应用程序 docker-elk 将此应用程序与 ElasticSearch/Logstash/Kibana (ELK) 连接起来。他们都是 运行 在开发中的同一 docker 机器上。在生产中,情况可能并非如此。
如何将应用程序的 docker-compose.yml
设置为 link 到 ELK 堆栈?
看看多主机docker网络
Networking is a feature of Docker Engine that allows you to create
virtual networks and attach containers to them so you can create the
network topology that is right for your application. The networked
containers can even span multiple hosts, so you don’t have to worry
about what host your container lands on. They seamlessly communicate
with each other wherever they are – thus enabling true distributed
applications.
如果您为第一个合成设置了一个可预测的项目名称,您可以使用 external_links 从不同的合成文件中按名称引用外部容器。
在下一个 docker-compose 版本 (1.6) 中,您将能够使用用户定义的网络,并让两个组合加入同一网络。
2016 年 6 月更新
以下答案从 docker 1.10 开始已过时。请参阅新解决方案的其他类似答案。
旧答案
创建网络:
$ 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 above which only works within one node (host). Good for dev. If you need to get two nodes to talk to each other, you need to create an overlay network。不过原理一样。您将网络名称传递给 docker-compose up 命令。
您还可以在 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 化的应用程序,其中包含一些使用 docker-compose 的服务 运行。我想使用另一个 docker-compose 应用程序 docker-elk 将此应用程序与 ElasticSearch/Logstash/Kibana (ELK) 连接起来。他们都是 运行 在开发中的同一 docker 机器上。在生产中,情况可能并非如此。
如何将应用程序的 docker-compose.yml
设置为 link 到 ELK 堆栈?
看看多主机docker网络
Networking is a feature of Docker Engine that allows you to create virtual networks and attach containers to them so you can create the network topology that is right for your application. The networked containers can even span multiple hosts, so you don’t have to worry about what host your container lands on. They seamlessly communicate with each other wherever they are – thus enabling true distributed applications.
如果您为第一个合成设置了一个可预测的项目名称,您可以使用 external_links 从不同的合成文件中按名称引用外部容器。
在下一个 docker-compose 版本 (1.6) 中,您将能够使用用户定义的网络,并让两个组合加入同一网络。
2016 年 6 月更新
以下答案从 docker 1.10 开始已过时。请参阅新解决方案的其他类似答案。
旧答案
创建网络:
$ 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 above which only works within one node (host). Good for dev. If you need to get two nodes to talk to each other, you need to create an overlay network。不过原理一样。您将网络名称传递给 docker-compose up 命令。
您还可以在 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".