简介
说明
本文介绍Docker Compose的网络的配置。
官网网址
https://docs.docker.com/compose/networking/
compose的默认配置
默认情况下,Compose会为应用创建一个网络,服务(docker-compose.yaml中的services项)的每个容器都会加入该网络中。这样容器就可被该网络中的其他容器访问,而且该容器还能以服务名称作为hostname被其他容器访问。
默认的网络
例如, 假设有一个项目,目录名myapp, docker-compose.yml 配置如下:
version: "3" services: web: build: . ports: - "8000:8000" db: image: postgres ports: - "8001:5432"
当执行 docker-compose up 的时候。会发生以下事情:
- 会创建一个名字是 myapp_default的网络(networks)
- web这个容器会加入到 myapp_default网络中,并且在网络中的名称为:web 。
- db这个容器会加入到 myapp_default网络中,并且在网络中的名称为:db。
这里每个容器都能通过应用名找到对方,例如,web容器可以通过 postgres://db:5432 来使用 Pg数据库。
上面例子有一个注意点就是端口号,注意区分HOST_PORT和CONTAINER_PORT,以上面的db为例:8001 是宿主机的端口,5432(postgres的默认端口) 是容器的端口,当容器之间通讯时, 是通过 CONTAINER_PORT 来连接的。这里有宿主机端口,那么容器就可以通过宿主机端口和外部应用连接。
更新容器
当服务的配置发生变更时,可使用docker-compose up命令更新配置。
此时,Compose会删除旧容器并创建新容器。新容器会以不同的IP地址加入网络,名称保持不变。任何指向旧容器的连接都会被关闭,容器会重新找到新容器并连接上去。
默认情况下,服务之间可使用服务名称相互访问。links允许定义一个别名,从而使用给别名访问其他服务。
version: '2' services: web: build: . links: - "db:database" db: image:postgres
这样Web服务就可使用db或database作为hostname访问db了。
指定自定义网络
概述
有时默认的网络配置满足不了需求,可使用一级配置中的networks选项自定义网络。
networks选项允许创建更复杂的网络拓扑并指定自定义网络驱动和选项。不仅如此,还可使用networks将服务连接到外部创建的而且不是由Compose管理的网络。
每个service 配置下也可以指定networks配置,来指定一级配置的网络。
示例
下边的配置中,proxy与db服务隔离(不能通讯,因为不在一个网络中),app服务可与两者通信。使用networks命令,可方便实现服务间的网络隔离与连接。
version: '2' services: proxy: build: ./proxy networks: - front app: build: ./app networks: - front - back db: image: postgres networks: - back networks: front: drvier: custom-driver-1 back: driver: custom-driver-2 driver_opts: foo: "1" bar: "2"
配置默认网络
除自定义网络外,也可配置默认网络。不配置的话,默认是使用:bridge。
示例
下边的配置中,将应用的默认网络指定为一个自定义网络(custom-driver-1)。
version: '2' services: web: build . ports: - "8000:8000" db: image: postgres networks: default: driver:custom-driver-1
请先
!