Docker Compose网络配置

注意:本文涉及的compose只适用于compose文件格式为version 2的版本。verion 1(旧的)不支持网络功能。

默认下compose为你的app配置一个单独的网络。服务中的每个容器都加入到这个默认的网络且在这个网络的容器都能互相通信,它们也能通过与容器名称相同的主机名发现对方。

注意:app的网络基于“项目名称”设置网络名称,这个项目名称基于项目所处的目录名称。可以使用–project-name选项或COMPOSE_PROJECT_NAME环境变量来覆盖它。

例如,假设app在一个名为myapp的目录,docker-compose.yml类似如下:

  1. version: ‘2’
  2.  
  3. services:
  4.   web:
  5.     build: .
  6.     ports:
  7.       – "8000:8000"
  8.   db:
  9.     image: postgres

当执行docker-compose up时,网络部分设置如下:
1.创建了称为myapp_default的网络。
2.使用web的配置创建了容器,然后这个容器加入到myapp_default网络。
3.使用db的配置创建容器,这个容器加入到myapp_default网络。

每个容器现在能查找web或db来得到容器的IP地址。例如,web应用程序的代码可以连接URL postgres://db:5432并开始使用postgres数据库。

由于web明确地映射了一个端口,外部网络也就能通过在docker主机的网络接口的8000端口连接容器。

更新容器

如果更改了服务的配置并执行docker-compose up来更新它,将删除旧的容器并且新的容器加入到相同的网络,分配到了不同的IP地址不过主机名不变。运行中的容器应该能够查找主机名并连接到新的地址,不过旧的地址将失效。

如果任何一个容器与旧的容器有连接,它们会被关闭掉。容器有责任检测这种情况然后重新查找旧容器的主机来重新连接。

链接

链接可以为一个容器定义额外的别名。它们不需要启用服务进行通信 – 默认情况下,任何服务都可以通过该服务的名称访问任何其他服务。在下面的示例中,在web容器中可以通过db和database访问db容器。

  1. version: ‘2’
  2. services:
  3.   web:
  4.     build: .
  5.     links:
  6.       – "db:database"
  7.   db:
  8.     image: postgres

指定自定义网络

除了使用默认的app网络之外,还可以使用最顶层networks关键词指定自己定义的网络。这让你可以创建更复制的网络拓扑并指定自定义网络驱动及其选项。也可以使用它来连接服务到不由compose管理的外部创建的网络。

每个服务都能指定连接由networks关键词配置的网络。

下面的示例compose文件定义了两个自定义网络。proxy服务与db服务隔离,因为它们没有指定相同的网络。

  1. version: ‘2’
  2.  
  3. services:
  4.   proxy:
  5.     build: ./proxy
  6.     networks:
  7.       – front
  8.   app:
  9.     build: ./app
  10.     networks:
  11.       – front
  12.       – back
  13.   db:
  14.     image: postgres
  15.     networks:
  16.       – back
  17.  
  18. networks:
  19.   front:
  20.     # Use a custom driver
  21.     driver: custom-driver-1
  22.   back:
  23.     # Use a custom driver which takes special options
  24.     driver: custom-driver-2
  25.     driver_opts:
  26.       foo: "1"
  27.       bar: "2"

也可以通过设置ipv4_address和/或ipv6_address为每个附着的网络配置静态的IP地址。