docker compose配置 network
2023-11-04 01:03 youxin 阅读(9416) 评论(0) 编辑 收藏 举报docker-compose配置networks
默认网络
例如, 假设有一个项目,目录名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
的时候,旧容器删除,然后创建一个新的容器。
新容器会加入到网络,相同的网络名称,但容器IP是不一样的。已经连接的其他容器会自己重连到新的容器IP上。
自定义网络
可能通过一级配置networks
来自定义网络,可以创建更复杂的网络选项和配置,也可以用来连接已经存在的网络(不是通过compose创建的)
每个service
配置下也可以指定networks
配置,来指定一级配置的网络。
例如:
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"
- 一级配置
networks
用来创建自定义的网络 。这里配置了两个frontend
和backend
. 且自定义了网络类型。 - 每一个serviceg下,
proxy
,app
,db
都定义了一下networks
配置。proxy
只加入到frontend
网络。db
只加入到backend
网络。app
同时加入到frontend
和backend
。db
和proxy
不能通讯,因为不在一个网络中。app
和两个都能通讯,因为app
在两个网络中都有配置。db
和proxy
要通讯,只能通过app
这个应用来连接。
配置默认网络
不指定网络时,默认的网络也是可以配置的。不配置的话,默认是使用:brige
,也可以修改为其他 的。
version: "3"
services:
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
networks:
default:
# Use a custom driver
driver: custom-driver-1
指定一个已经存在的网络
多个容器,不在相同的配置中,也会有网络通讯的需求 。那么就可以使用公共的网络配置。
容器可以加入到已经存在的网络。
networks:
default:
external:
name: my-pre-existing-network
这里name
就是指定已经存在的网络名称。
链接:https://www.jianshu.com/p/3004fbce4d37
先,我们需要理解Docker Compose文件中的“networks”部分。这个部分允许我们定义一个或多个自定义网络,并指定每个服务应该连接到哪些网络。
例如:
version: '3'
services:
web:
build: .
networks:
- mynet
networks:
mynet:
上述代码创建了一个名为“mynet”的自定义网络,并指定了web服务将连接到这个网路。
接下来就是IP和主机名(hosts)设置问题了。默认情况下,在同一docker-compose文件内创建的所有容器都会被添加到同一默认网路上,并且可以通过其服务名称作为主机名相互通信。
然而,在某些情况下,默认设置可能无法满足需求,比如你可能需要手动设定某些容器或者服务的IP地址和主机名映射关系等等。这时候就可以使用docker-compose文件内 extra_hosts
字段来进行手动设定:
version: '3'
services:
webapp1:
image: myapp1
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
在这个例子中,我们为webapp1服务添加了两个额外的主机名映射。这样,webapp1服务内的应用程序就可以通过主机名"somehost"和"otherhost"来访问对应的IP地址。
如果你需要为某个服务指定一个静态IP地址,可以在网络配置中使用 ipv4_address
或者 ipv6_address
字段:
version: '3'
services:
web:
image: nginx
networks:
mynet:
ipv4_address: 172.20.0.5
networks:
mynet:
ipam:
config:
- subnet: 172..20..0..0/16
在上述例子中,我们创建了一个自定义网络mynet,并且指定了其子网。然后我们为web服务分配了一个静态IP地址。
总结一下,在Docker Compose中进行网络配置和设置IP、主机名并不复杂。只需要理解并合理使用Docker Compose文件内相关字段即可满足大部分需求。希望本文能帮助你更好地理解和使用Docker Compose进行网络配置。
注意:以上所有操作都需要根据实际情况进行调整,并确保所有设置都符合你的实际需求和环境限制。
docker-compose 容器固定IP(network subnet)
由于默认的bridge桥接网络,重启容器后会改变ip地址。在一些场景下我们希望固定容器IP地址。
docker-compose是docker的一个编排工具,相对于命令模式创建网络,容器等。使用配置文件相对来说更方便,可追溯问题。
docker-compose.yml 参考官网 https://docs.docker.com/compose/compose-file/#network-configuration-reference
https://www.cnblogs.com/BillyLV/articles/12896624.html
https://blog.csdn.net/huangjinjin520/article/details/124054043
ipv4_address、ipv6_address
加入网络后,为此服务的容器指定一个静态IP地址。在顶层networks配置项中的相应网络配置必须有子网配置覆盖每个静态地址的ipam配置。例如:
version: "3.8" services: app: image: nginx:alpine networks: app_net: ipv4_address: 172.16.238.10 ipv6_address: 2001:3984:3989::10 networks: app_net: ipam: driver: default config: - subnet: "172.16.238.0/24" - subnet: "2001:3984:3989::/64"
注意:如果需要IPv6寻址,则必须使用V2.x版本的Compose配置文件并设置顶层networks配置项下的enable_ipv6选项。在当前swarm mode下IPv6选项不会起作用。
https://docs.docker.com/compose/compose-file/06-networks/
ipam IPAM (IP Address Management)
ipam
specifies a custom IPAM configuration. This is an object with several properties, each of which is optional:
driver
: Custom IPAM driver, instead of the default.config
: A list with zero or more configuration elements, each containing a:subnet
: Subnet in CIDR format that represents a network segmentip_range
: Range of IPs from which to allocate container IPsgateway
: IPv4 or IPv6 gateway for the master subnetaux_addresses
: Auxiliary IPv4 or IPv6 addresses used by Network driver, as a mapping from hostname to IP
options
: Driver-specific options as a key-value mapping.