撰写网络
预计阅读时间:6分钟
默认情况下,Compose为您的应用设置单个 网络。服务的每个容器都加入默认网络,并且都可以被该网络上的其他容器访问,并且可以在与容器名称相同的主机名下被它们发现。
笔记
为应用程序的网络提供一个基于“项目名称”的名称,该名称基于其所在目录的名称。您可以使用
--project-name
flag 或COMPOSE_PROJECT_NAME
环境变量覆盖项目名称。
例如,假设您的应用程序位于名为的目录中myapp
,并且您的docker-compose.yml
外观如下所示:
version: "3.9"
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
。
在v2.1 +中,覆盖网络始终
attachable
从Compose文件格式2.1开始,覆盖网络始终创建为
attachable
,并且这是不可配置的。这意味着独立容器可以连接到覆盖网络。在撰写文件格式3.x中,您可以选择将
attachable
属性设置为false
。
现在,每个容器都可以查找主机名web
或db
获取相应容器的IP地址。例如,web
的应用程序代码可以连接到URLpostgres://db:5432
并开始使用Postgres数据库。
要注意区分是很重要的HOST_PORT
和CONTAINER_PORT
。在上面的示例中,对于db
,HOST_PORT
is是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.9"
services:
web:
build: .
links:
- "db:database"
db:
image: postgres
有关更多信息,请参见链接参考。
多主机联网
在启用Swarm模式的Docker引擎上部署Compose应用程序时,可以使用内置overlay
驱动程序来启用多主机通信。
请参阅Swarm模式部分,以了解如何设置Swarm集群,以及《多主机网络入门》 以了解多主机覆盖网络。
指定自定义网络
您不仅可以使用默认的应用程序网络,还可以使用顶级networks
密钥指定自己的网络。这使您可以创建更复杂的拓扑并指定自定义网络驱动程序和选项。您还可以使用它将服务连接到不受Compose管理的外部创建的网络。
每个服务都可以使用服务级别 networks
密钥指定要连接的网络,该服务级别密钥是引用顶级 networks
密钥下条目的名称的列表。
这是一个示例Compose文件,定义了两个自定义网络。该proxy
服务与该服务是隔离的db
,因为它们不共享公共网络-只能app
与两者通信。
version: "3.9"
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地址。
也可以为网络指定一个自定义名称(从3.5版开始):
version: "3.9"
services:
# ...
networks:
frontend:
name: custom_frontend
driver: custom-driver-1
有关可用的网络配置选项的完整详细信息,请参阅以下参考:
配置默认网络
除了(或同时)指定自己的网络,您还可以通过在networks
named下定义一个条目来更改应用程序范围内默认网络的设置default
:
version: "3.9"
services:
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
networks:
default:
# Use a custom driver
driver: custom-driver-1
使用预先存在的网络
如果您希望容器加入预先存在的网络,请使用以下external
选项:
services:
# ...
networks:
default:
external:
name: my-pre-existing-network
[projectname]_default
Compose不会尝试创建一个名为的网络,而是查找一个名为的网络my-pre-existing-network
并将您的应用程序的容器连接到该网络。