Docker Compose - Compose 中的网络
原文地址https://docs.docker.com注意:只有在使用 Compose 的版本 2 或更高版本时,本文才适用。网络功能不支持版本1(传统)的 Compose 文件。默认情况下,Compose 会为你的应用程序设置一个 网络。服务的每个容器都加入默认网络,并且该网络上的其他容器都可以访问它们,并且可以通过与容器名称相同的主机名来发现它们。注意:根据“pr...
注意:只有在使用 Compose 的版本 2 或更高版本时,本文才适用。网络功能不支持版本1(传统)的 Compose 文件。
默认情况下,Compose 会为你的应用程序设置一个 网络。服务的每个容器都加入默认网络,并且该网络上的其他容器都可以访问它们,并且可以通过与容器名称相同的主机名来发现它们。
注意:根据“project name 项目名称”为你的应用程序的网络提供了一个名称,该名称基于其所处目录的名称可以使用
--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的配置的容器,并且加入在web名下的myapp_default网络 - 创建使用
db的配置的容器,并且加入在db名下的myapp_default网络
在 v2.1+ 中,
overlay网络一直可用attachable
从 Compose 2.1 开始,overlay网络总是被创建为attachable,并且这是不可配置的。这意味着独立容器可以连接到overlay网络。
在 Compose 3.x 中,可以选择将attachable属性设置为 false。
现在每个容器可以查找主机名 web 或 db,并获取适当的容器的 IP 地址。例如,web 的应用程序代码可以连接到 postgres://db:5432 这个 URL 并开始使用 Postgres 数据库。
注意 HOST_PORT 和 CONTAINER_PORT 之间的区别很重要。在上面的例子中,对于 db,HOST_PORT 是 8001 而 CONTAINER_PORT 是 5432(postgres 默认值)。 联网的服务到服务通信使用 CONTAINER_PORT。当定义 HOST_PORT 时,该服务也可以在 swarm 外访问。
在 web 容器中,你的到 db 的连接字符串看起来像 postgres://db:5432,并且主机的连接字符串看起来像 postgres://{DOCKER_IP}:8001。
1. 更新容器
如果你对服务的配置进行更改并运行 docker-compose up 进行更新,则旧容器将被删除,并且新的容器将以不同的 IP 地址加入网络,但名称相同。正在运行的容器可以查找该名称并连接到新地址,旧地址停止工作。
如果有任何容器连接到旧容器,这些容器将会关闭。检测这种情况,再次查找名称并重新连接是容器的责任。
2. Links
Links 允许你定义额外的别名,通过它可以从另一个服务访问服务。他们不需要启用服务进行通信 - 默认情况下,任何服务都可以通过该服务的名称到达任何其他服务。在以下示例中,可通过主机名 db 和 database 从 web 访问 db:
version: "3"
services:
web:
build: .
links:
- "db:database"
db:
image: postgres
更多资料参考 links 手册。
3. 多主机网络
注意:本节中的指示信息涉及 传统的 Docker Swarm 操作,并且仅在定位传统 Swarm 集群时起作用。有关将 Compose 项目部署到较新的集成 swarm 模式的说明,请参阅 Docker Stacks 文档。
在 将 Compose 应用程序部署到 Swarm 集群 时,可以使用内置的 overlay 驱动程序启用容器之间的多主机通信,而不会更改你的 Compose 文件或应用程序代码。
请参阅 多主机网络入门 以了解如何设置 Swarm 集群。集群默认使用 overlay 驱动程序,但如果你愿意,可以明确指定它 - 请参阅下文了解如何执行此操作。
4. 指定自定义网络
可以在顶层上下文使用 networks 关键字指定你自己的网络,而不仅仅使用默认的应用程序网络。这使你可以创建更复杂的拓扑并指定 自定义网络驱动程序 和选项。还可以使用它将服务连接到不受 Compose 管理的外部创建的网络。
每项服务都可以使用服务级上下文中的 networks 关键字来指定要连接的网络,该关键字是顶层上下文中使用的 networks 关键字列表中的一个条目。
以下是定义两个自定义网络的示例 Compose 文件。代理服务与数据库服务是隔离的,因为它们不共享共享的网络 - 只有应用程序可以与两者通信。
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 and/or ipv6_address 来为网络配置静态 IP 地址。
有关可用网络配置选项的完整详细信息,请参阅以下参考资料:
5. 配置默认网络
除了指定自己的网络外,还可以通过在 networks 下的名为 default 的网络下定义条目来更改应用程序范围的默认网络的设置:
version: "3"
services:
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
networks:
default:
# Use a custom driver
driver: custom-driver-1
6. 使用已经存在的网络
如果想让容器加入一个已经存在的网络,使用 external 选项:
networks:
default:
external:
name: my-pre-existing-network
与其试图创建名为 [projectname] _default 的网络,Compose 查找称为 my-pre-existing-network 的网络,并将应用的容器连接到它。
更多推荐



所有评论(0)