您现在的位置是:首页 >技术教程 >Docker Compose网络系列--网络的配置网站首页技术教程
Docker Compose网络系列--网络的配置
原文网址:Docker Compose网络系列--网络的配置_IT利刃出鞘的博客-CSDN博客
简介
说明
本文介绍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
默认情况下,服务之间可使用服务名称相互访问。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
指定一个已经存在的网络
如果多个容器不在同一个配置中(不在一个应用里),也可以进行网络通信。方法是:
第1步:
第2步:使用external选项。方法如下:
services:
# ...
networks:
default:
name: my-pre-existing-network
external: true
或者:
services:
# ...
networks:
default:
external:
name: my-pre-existing-network