交叉编写网络连接
在运行 compose 项目时,可以通过服务的全名(包括项目名称前缀,例如 myproject_web_1)和服务名称(在 compose 文件中指定)访问服务,例如web。简称为network-scoped alias,表示任何连接到同一个网络的容器都可以通过这个名字访问容器。
默认情况下,docker-compose 为每个 compose 项目(projectname_default)创建一个网络,以便 compose 项目中的所有服务都可以通信。因为该网络是为每个项目单独创建的,所以两个 compose 项目不共享同一个网络,并且它们的服务与其他 compose 项目隔离。
但是,可以使 compose 项目(或 compose 项目中的单个服务)共享同一个网络。
示例 1 - 为整个项目使用共享网络
以下撰写文件为默认网络指定了一个自定义名称;两个 compose-files 都使用 sharednet 网络作为默认网络,这意味着两个 compose 项目的服务将连接到同一个网络:
编写文件 1 (compose1.yml):
version: '3.5'
services:
compose1service:
image: busybox
tty: true
networks:
default:
name: sharednet
编写文件 2 (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 项目中的服务。
编写文件 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
启动两个撰写文件:
docker-compose -f compose3.yml --project-name=compose3 up -d
docker-compose -f compose4.yml --project-name=compose4 up -d
再次,在其他 compose 项目中从 compose3service ping 到 compose4service 服务(通过简称或全名);
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 服务。