Compose网络 | Networking in Compose
注意:只有在使用 Compose 文件格式的版本2或更高版本时,本文才适用。网络功能不支持版本1(传统)撰写文件。
默认情况下,组合设置一个网络你的应用程序。服务的每个容器都加入了默认网络,并且两者都是。可达网络上的其他容器,以及可发现由它们在主机名上与容器名称相同。
注:您的应用程序的网络是根据“项目名称”命名的,该名称基于它所在的目录的名称。可以使用
--project-name
标志或者COMPOSE_PROJECT_NAME
环境变量。
例如,假设应用程序位于一个名为myapp
,而你的docker-compose.yml
看起来是这样的:
version: "3"
services:
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
ports:
- "8001:5432"
当运行docker-compose up
的时候,发生如下情况:
myapp_default
被创造了。
- 容器是使用
web
的配置。它加入了网络myapp_default
以这个名字web
。
- 容器是使用
db
的配置。它加入了网络myapp_default
以这个名字db
。
每个容器现在都可以查找主机名。web
或db
并获取适当容器的
IP 地址。例如,web
的应用程序代码可以连接到
URL postgres://db:5432
然后开始使用 Postgres 数据库。
注意区分HOST_PORT
和区分是重要的CONTAINER_PORT
。在上面的例子中,db
中,HOST_PORT
是8001
和容器端口是5432
(postgres的默认值)。网络服务对服务通信使用CONTAINER_PORT
。何时HOST_PORT
被定义,该服务也可以在群外访问。
在web
容器,连接字符串到db
看起来就像postgres://db:5432
,从主机上看,连接字符串看起来像postgres://{DOCKER_IP}:8001
...
更新容器
如果对服务进行配置更改并运行docker-compose up
要更新它,旧容器将被删除,新容器将以不同的 IP 地址加入网络,但名称相同。正在运行的容器将能够查找该名称并连接到新地址,但旧地址将停止工作。
如果任何容器与旧容器有连接,则它们将被关闭。容器的责任是检测此状态,再次查找名称并重新连接。
链接
链接允许您定义额外的别名,通过它可以从另一个服务访问服务。他们不需要启用服务进行通信 - 默认情况下,任何服务都可以以该服务的名称到达任何其他服务。在以下示例中,db
可以从web
主机名db
和以下位置访问database
:
version: "3"
services:
web:
build: .
links:
- "db:database"
db:
image: postgres
见链接参考想了解更多信息。
多主机联网
注意:本节中的指示信息涉及传统的 Docker Swarm 操作,并且仅在针对传统 Swarm 集群时才起作用。有关将撰写项目部署到较新的集成群模式的说明,请参阅 Docker Stacks 文档。
何时将组合应用程序部署到群集集群,您可以使用内置的overlay
驱动程序,以启用容器之间的多主机通信,而不更改组合文件或应用程序代码。
请参阅多主机网络入门以了解如何设置 Swarm 群集。群集将overlay
默认使用该驱动程序,但如果您愿意,您可以明确指定它 - 请参阅下文了解如何执行此操作。
指定自定义网络
您可以使用顶级networks
密钥指定您自己的网络,而不只是使用默认的应用程序网络。这使您可以创建更复杂的拓扑并指定自定义网络驱动程序和选项。您还可以使用它将服务连接到不受
Compose 管理的外部创建的网络。
每项服务都可以使用服务级别 networks
密钥来指定要连接的网络,服务级别密钥是顶级 networks
密钥下引用条目的名称列表。
以下是定义两个自定义网络的示例撰写文件。proxy
服务与服务是隔离的db
,因为它们不共享共享的网络 - app
只能与两者通话。
version: "3"
services:
proxy:
build: ./proxy
networks:
- frontend
app:
build: ./app
networks:
- frontend
- backend
db:
image: postgres
networks:
- backend
networks:
frontend:
# Use a custom driver
driver: custom-driver-1
backend:
# Use a custom driver which takes special options
driver: custom-driver-2
driver_opts:
foo: "1"
bar: "2"
可以通过为每个连接的网络设置 ipv4_address 和/或 ipv6_address 来为网络配置静态 IP 地址。
有关可用网络配置选项的详细信息,请参阅下列参考资料:
- 顶层
networks
键
- 服务级
networks
键
配置默认网络
除了指定您自己的网络外,您还可以通过在networks
名称下定义条目来更改应用程序范围的默认网络的设置default
:
version: "3"
services:
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
networks:
default:
# Use a custom driver
driver: custom-driver-1
使用预先存在的网络
如果希望容器加入现有网络,请使用external
期权*
networks:
default:
external:
name: my-pre-existing-network
而不是试图创建一个名为[projectname]_default
,将寻找一个名为my-pre-existing-network
并将应用程序的容器连接到它。
本文档系腾讯云开发者社区成员共同维护,如有问题请联系 cloudcommunity@tencent.com