我有两个独立的docker-compose。Yml文件在两个不同的文件夹:
~/front/docker-compose.yml
~/api/docker-compose.yml
我如何确保前面的容器可以在api中向容器发送请求?
我知道——default-gateway选项可以使用docker run为单个容器设置,这样就可以为该容器分配特定的IP地址,但似乎在使用docker-compose时这个选项不可用。
目前,我结束了一个docker检查my_api_container_id,并查看输出中的网关。它是有效的,但问题是这个IP是随机分配的,所以我不能依赖它。
这个问题的另一种形式可能是:
我可以使用docker-compose将一个固定的IP地址归属于特定的容器吗?
但最终我所追求的是:
两个不同的docker-compose项目如何相互通信?
我有一个类似的例子,我正在使用单独的docker-compose文件,在一个覆盖网络的docker swarm上工作,我所要做的就是改变网络参数:
第一个docker-compose.yaml
version: '3.9'
.
.
.
networks:
net:
driver: overlay
attachable: true
docker-compose -p app up
因为我已经使用-p将应用程序名称指定为app,初始网络将是app_net。
现在,为了运行另一个docker-compose与多个使用同一网络的服务,你需要这样设置:
第二个docker-compose.yaml
version: '3.9'
.
.
.
networks:
net-ref:
external: true
name: app_net
docker stack deploy -c docker-compose.yml mystack
无论给堆栈取什么名字,网络都不会受到影响,它总是引用名为app_net的现有外部网络。
PS:确保检查docker-compose版本是很重要的。
之前的帖子信息是正确的,但是没有详细说明如何链接容器,应该连接为“external_links”。
希望这个例子能让你更清楚:
假设您有app1/docker-compose。Yml,包含两个服务(svc11和svc12),以及app2/docker-compose。Yml和另外两个服务(svc21和svc22),假设你需要以交叉方式连接:
Svc11需要连接到svc22的容器
Svc21需要连接到svc11的容器。
所以构型应该是这样的:
这是app1/docker-compose.yml:
version: '2'
services:
svc11:
container_name: container11
[..]
networks:
- default # this network
- app2_default # external network
external_links:
- container22:container22
[..]
svc12:
container_name: container12
[..]
networks:
default: # this network (app1)
driver: bridge
app2_default: # external network (app2)
external: true
这是app2/docker-compose.yml:
version: '2'
services:
svc21:
container_name: container21
[..]
networks:
- default # this network (app2)
- app1_default # external network (app1)
external_links:
- container11:container11
[..]
svc22:
container_name: container22
[..]
networks:
default: # this network (app2)
driver: bridge
app1_default: # external network (app1)
external: true
继续JohnHarris的回答,只是添加一些可能对某些人有用的细节:让我们取两个docker-compose文件,并通过网络将它们连接起来:
第一文件夹/ docker-compose . yml:
version: '2'
services:
some-contr:
container_name: []
build: .
...
networks:
- somenet
ports:
- "8080:8080"
expose:
# Opens port 8080 on the container
- "8080"
environment:
PORT: 8080
tty: true
networks:
boomnet:
driver: bridge
docker-compose.yml 2:
version: '2'
services:
pushapiserver:
container_name: [container_name]
build: .
command: "tail -f /dev/null"
volumes:
- ./:/[work_dir]
working_dir: /[work dir]
image: [name of image]
ports:
- "8060:8066"
environment:
PORT: 8066
tty: true
networks:
- foldername_somenet
networks:
foldername_somenet:
external: true
现在你可以对另一个服务(b/w diff容器)进行api调用,比如:
第一个docker-compose.yml文件中的一些代码调用http://pushapiserver:8066/send_push
两个常见错误(至少我犯过几次):
注意docker-compose所在的[foldername]。Yml文件存在。请看上面的第二篇docker-compose。我已经在网络BC docker中添加了文件夹名,通过[foldername]_[networkname]创建网络
Port:这个很常见。请注意,我在尝试连接时使用了8066,即http://pushapiserver:8066/…8066是docker容器的端口(第二个docker-compose.yml),所以当尝试与不同的docker compose对话时。
Docker将使用Docker容器端口[8066],而不是主机映射端口
[8060]
您只需要确保希望相互通信的容器位于同一网络上。网络是一流的docker结构,并不是特定于组合。
# front/docker-compose.yml
version: '2'
services:
front:
...
networks:
- some-net
networks:
some-net:
driver: bridge
...
# api/docker-compose.yml
version: '2'
services:
api:
...
networks:
- front_some-net
networks:
front_some-net:
external: true
注意:你的应用程序的网络是根据“项目名”来命名的,而“项目名”是基于它所在目录的名称,在这种情况下,添加了一个前缀front_
然后,它们可以使用服务名相互通信。从前面你可以做ping api,反之亦然。