概述
默认状况下,Compose 会为咱们的应用建立一个网络,服务的每一个容器都会加入该网络中。这样,容器就可被该网络中的其余容器访问,不只如此,该容器还能以服务名称做为 Hostname 被其余容器访问。web
默认状况下,应用程序的网络名称基于 Compose 的工程名称,而项目名称基于 docker-compose.yml
所在目录的名称。如需修改工程名称,可以使用 --project-name
标识或 COMPOSE_PORJECT_NAME
环境变量。docker
假如一个应用程序在名为 myapp 的目录中,而且 docker-compose.yml
以下所示:网络
version: '2' services: web: build: . ports: - "8000:8000" db: image: postgres
当咱们运行 docker-compose up
时,将会执行如下几步:app
- 建立一个名为 myapp_default 的网络
- 使用 web 服务的配置建立容器,它以 web 这个名称加入网络 myapp_default
- 使用 db 服务的配置建立容器,它以 db 这个名称加入网络 myapp_default
容器间可以使用服务名称(web 或 db)做为 Hostname 相互访问。例如,web 这个服务可以使用 postgres://db:5432
访问 db 容器。post
当服务的配置发生更改时,可以使用 docker-compose up
命令更新配置。此时,Compose 会删除旧容器并建立新容器。新容器会以不一样的 IP 地址加入网络,名称保持不变。任何指向旧容器的链接都会被关闭,容器会从新找到新容器并链接上去。ui
使用 links
默认状况下,服务之间可以使用服务名称相互访问。links 容许咱们定义一个别名,从而使用该别名访问其余服务。spa
version: '2' services: web: build: . links: - "db:database" db: image: postgres
自定义网络
一些场景下,默认的网络配置知足不了咱们的需求,此时咱们可以使用 networks 命令自定义网络。networks 命令容许咱们建立更加复杂的网络拓扑并指定自定义网络驱动和选项。不只如此,咱们还可以使用 networks 将服务链接到不是由 Compose 管理的、外部建立的网络。code
version: '2' services: proxy: build: ./proxy networks: - front app: build: ./app networks: - front - back db: image: postgres networks: - back networks: front: # Use a custom driver driver: custom-driver-1 back: # Use a custom driver which takes special options driver: custom-driver-2 driver_opts: foo: "1" bar: "2"
其中,proxy 服务与 db 服务隔离,二者分别使用本身的网络;app 服务可与二者通讯。使用 networks 命令,便可方便实现服务间的网络隔离与链接。ci
配置默认网络
version: '2' services: web: build: . ports: - "8000:8000" db: image: postgres networks: default: # Use a custom driver driver: custom-driver-1
这样,就可为该应用指定自定义的网络驱动io
已存在的网络
咱们能够预先建立一个名为 myapp 的网络,让 Compose 加入这个新建立的网络,使全部 Compose 能够通讯,此时使用 external 选项。
# 建立网络 docker network create <Network Name> # 查看已存在的网络 docker network list networks: default: external: name: myapp