跨组合网络连接
运行组合项目时,服务可以通过其完整名称(包括项目名称前缀,例如myproject_web_1
)和服务名称(在组合文件中指定)进行访问,例如web
。短名称是网络范围别名,这意味着任何连接到同一网络的容器都可以通过此名称访问容器。
默认情况下,docker-compose
为每个组合项目创建一个网络(projectname_default
),以便组合项目中的所有服务可以通信。由于该网络为每个项目单独创建,因此两个组合项目不共享相同的网络,它们的服务与其他组合项目隔离。
然而,可以使组合项目(或组合项目中的单个服务)共享相同的网络。
示例1 - 使用共享网络整个项目
以下组合文件指定默认网络的自定义名称; 两个组合文件都使用sharednet
网络作为默认网络,这意味着两个组合项目的服务将连接到同一个网络:
组合文件1 (compose1.yml):
version: '3.5'
services:
compose1service:
image: busybox
tty: true
networks:
default:
name: sharednet
Compose文件V2(compose2.yml):
version: '3.5'
services:
compose2service:
image: busybox
tty: true
networks:
default:
name: sharednet
为了说明这一点:
启动两个组合文件:
docker-compose -f compose1.yml --project-name=compose1 up -d
docker-compose -f compose2.yml --project-name=compose2 up -d
使用短名称 (compose2service
) 在 compose1service
容器内部从服务中ping通compose2service
是可行的;
docker exec compose1_compose1service_1 ping -c1 compose2service
PING compose2service (172.20.0.3): 56 data bytes
64 bytes from 172.20.0.3: seq=0 ttl=64 time=0.134 ms
--- compose2service ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.134/0.134/0.134 ms
反之亦然:
docker exec compose2_compose2service_1 ping -c1 compose1service
PING compose1service (172.20.0.2): 56 data bytes
64 bytes from 172.20.0.2: seq=0 ttl=64 time=0.151 ms
--- compose1service ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.151/0.151/0.151 ms
和项目前缀一样,全名也需要包含;
docker exec compose2_compose2service_1 ping -c1 compose1_compose1service_1
PING compose1_compose1service_1 (172.20.0.2): 56 data bytes
64 bytes from 172.20.0.2: seq=0 ttl=64 time=0.151 ms
--- compose1_compose1service_1 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.151/0.151/0.151 ms
示例 2 - 在项目中使用共享网络提供某些服务
在这个示例中,两个Compose项目都有自己的(“默认”)网络,但是另外添加了一个共享网络,以允许一些服务连接到其他Compose项目中的服务。
Compose文件1(compose3.yml):
version: '3.5'
services:
compose3service:
image: busybox
tty: true
networks:
- default
- sharednet
compose3otherservice:
image: busybox
tty: true
networks:
sharednet:
name: mysharednetwork
注意: 如果您指定了服务应连接到哪些网络,则会覆盖默认设置,这意味着该服务不再自动连接到default
网络。请将default
网络包含在网络列表中,以允许服务与组成项目中的其他服务通信。
Compose文件2(compose4.yml):
version: '3.5'
services:
compose4service:
image: busybox
tty: true
networks:
- default
- sharednet
compose4otherservice:
image: busybox
tty: true
networks:
sharednet:
name: mysharednetwork
启动两个Compose文件:
docker-compose -f compose3.yml --project-name=compose3 up -d
docker-compose -f compose4.yml --project-name=compose4 up -d
再次提醒,从compose3service
向另一个compose项目中的compose4service
服务进行ping测试是有效的(可以使用简称或全名);
docker exec compose3_compose3service_1 ping -c1 compose4service
PING compose4service (172.22.0.3): 56 data bytes
64 bytes from 172.22.0.3: seq=0 ttl=64 time=0.110 ms
--- compose4service ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.110/0.110/0.110 ms
docker exec compose3_compose3service_1 ping -c1 compose4_compose4service_1
PING compose4_compose4service_1 (172.22.0.3): 56 data bytes
64 bytes from 172.22.0.3: seq=0 ttl=64 time=0.093 ms
--- compose4_compose4service_1 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.093/0.093/0.093 ms
然而,尝试连接到
compose4otherservice
将失败,因为该服务未连接到
mysharednetwork
网络:
docker exec compose3_compose3service_1 ping -c1 compose4otherservice
ping: bad address 'compose4otherservice'
docker exec compose3_compose3service_1 ping -c1 compose4_compose4otherservice_1
ping: bad address 'compose4_compose4otherservice_1'
注意:
如果两个Compose项目中有相同名称的服务(例如,都有一个名为web
的服务),则需要小心处理。在这种情况下,web
可能随机解析为任一项目中的web
服务。
web
)在同一堆栈中的服务之间进行通信(这也是建议的做法,因为它不会使它们依赖于用于部署堆栈的项目名称)。 - thaJeztah