docker吧 关注:6,280贴子:6,651
  • 3回复贴,共1

Docker compose 踩坑 - network

只看楼主收藏回复

Docker compose 踩坑 - network
https://pfun.sunrui.ink/forum.php?mod=viewthread&tid=49
(出处: 编程客)
此前使用 docker-compose.yaml 的时候,都没有自己配置 network,最近在部署新的 docker-compose 的时候报了 network overlap 的问题,才知道我的 network 子网不够用了。
问题是这样的,当你的 docker-compose.yaml 未指定 network 的时候,它会自动为你创建一个文件夹名_default 的网络,网络 CIDR 是 172.x.0.0/16。
每次我创建一个未配置 network 的 docker-compose 的时候都会创建一个,于是我的宿主机上就有了一堆这种子网。
172.0.0.0/16
172.1.0.0/16
172.2.0.0/16
...
这样很快就消耗了可用的 CIDR 网段。而且 /16 这样的 CIDR 太大了,可以容纳 65536 个虚拟机,或者说 docker instance。
解决问题的方法也很简单,自己定义网络的 CIDR 确保分配的网段大小不过大,这样就肯定不会有问题。
例如:
version: "3"
services:
navidrome:
image: deluan/navidrome:latest
container_name: navidrome
user: 1000:1000 # should be owner of volumes
ports:
- "4533:4533"
restart: unless-stopped
environment:
ND_SCANSCHEDULE: 1h
ND_LOGLEVEL: trace
ND_SESSIONTIMEOUT: 24h
ND_BASEURL: ""
networks:
- navidrome
networks:
navidrome:
ipam:
driver: default
config:
- subnet: 172.26.0.40/29
ip_range: 172.26.0.40/29
gateway: 172.26.0.41
上面的代码指定了 subnet 范围是 172.26.0.40/29,可用地址范围 172.26.0.41 - 172.26.0.46,8 个,足够绝大多数 docker-compose.yaml 使用了。
这样可以极大的节约 subnet 地址空间,延缓甚至可以说杜绝地址用尽的到来。毕竟想用完这么多的地址所需要的虚拟机,我们的内存恐怕根本 hold 不住。


IP属地:美国1楼2024-04-10 16:35回复
    当容器数量足够规模,或是为了复用容器及安全,开始构建复杂拓扑的时候,network的坑确实不少,就简单说说我遇到的。
    1.容器内通过另一个桥接上自己的容器名字就能通信,但是容器外不行,这就需要容器有固定ip提供给诸如反代网关。
    2.一旦固定ip配置多了,查询管理起来非常麻烦,这就需要集中管理若干子网手段,但是compose里env_file:标签居然不支持当前目录以外的其他目录的环境文件,还要用软连接之类的绕开。
    3.当有多个容器需要同一个其他容器提供服务,如多个容器需要同一个mysql,但又不想这些容器互相通信的时候,操作目标居然是mysql那个容器,这会导致compose down掉容器的时候如果忘记了有别的容器connect过,子网就因为挂起没删掉。
    4.容器间想单向通信居然要出动防火墙。
    5.说是有个特殊域名能在容器内直接访问宿主里,结果一查居然是实验功能,正式版里没有。


    IP属地:吉林来自iPhone客户端2楼2024-05-29 03:20
    收起回复