Docker network 之 network_mode

通过多个 docker network,容器之间可以通过容器名进行网络访问。这一点不必多说。Network_mode 的 container 模式提供了直接接入容器网络的方式,而无需专门创建网络。

通常使用 docker network 时,都会先使用 docker network create 创建一个网络,然后让需要通信的容器加入这个网络。Docker compose 类似:

services:
	service1:
		networks:
			- test_network
	service2:
		networks:
			- test_network
networks:
	test_network:
		name: test_network
	external_test_network:  # Or reuse an external network
		external: true
		name: test_network

除此之外,还可以通过 network_mode 连接多个容器。任何容器在创建时会创建一个独立的网络,其他容器可以通过直接接入这个网络来实现通信。比如,让服务 2 接入服务 1 的网络:

services:
	service1:
		...
	service2:
		network_mode: service:service1

值得注意的是 network_mode 的语法。冒号后显然是容器名,冒号前的 service 是 docker compose 的一个语法糖,会自动解析同一 yaml 配置中其他的容器。

所以如果服务需要接入当前配置中不存在的服务,比如目标服务之前已经起起来了,那么就需要使用 container:

# service1.yaml
services:
	service1:
		...
# service2.yaml
services:
	service2:
		network_mode: container:service1

network_mode 对应的是 docker CLI 的 --net=container:service1