起因:#
公司部署在 hk 的爬虫服务器突然挂掉了。后来发现只是在深圳办公区无法访问。排查后发现原因是 docker 的网络(包括 docker network 的 subnet 或者是某个容器的 ip)与该 host 在内网的 ip 段相同,导致冲突。
排查过程:#
有两个方面需要排查。一个是 docker 服务启动时的默认网络。
默认网络使用 bridge 桥接模式,是容器与宿主机进行通讯的默认办法。
修改默认网段可以参考 http://blog.51cto.com/wsxxsl/2060761
除此之外,还需要注意 docker 创建的 network 的网段。
使用 docker network ls 命令查看当前的网络。
然后可以使用 docker inspect 查看每个 network 的详细信息。
也可以直接使用 ip addr 来查看各种奇怪的虚拟网卡的 ip,是否有前两位的地址和 host 的 ip 地址相同。
解决办法:#
本想在 docker-compose up 时指定默认网络的 subnet。
结果发现好像并不支持?version 1.10.0 error on gateway spec
Was there any discussion on that? I do need to customize the network, because my company uses the 172.16.0.0/16 address range at some segments and Docker will simply clash with that by default, so every single Docker server in the whole company needs a forced network setting.
Now while upgrading my dev environment to Docker 1.13 it took me hours to stumble into this Github issue, because the removal of those options was completely undocumented.
So please, if I am working on a network which requires a custom docker subnet, how am I supposed to use Docker Compose and Docker Swarm?
最后用了个比较间接的办法。
先手动创建一个 docker network,然后再在 docker-compose 的配置文件中指定。
1docker network create --subnet=172.25.0.0/16 spider-network 1version: '3.6'
2services:
3 django:
4 image: "registry.sensetime.com/spider/sensespider:v1.0"
5 volumes:
6 - spiderdata:/data
7 privileged: true
8 networks:
9 - spider-network
10 ports:
11 - "8080:8080"
12 working_dir: /home/renkuanze/workspace/sensespider
13 entrypoint: bash run.sh
14 tty: true
15 container_name: django
16 splash:
17 image: "scrapinghub/splash"
18 container_name: splash
19 network_mode: "service:django"
20 react:
21 image: "registry.sensetime.com/spider/sensespider-react:v1.0"
22 working_dir: /home/node/sensespider-react
23 entrypoint: npm start
24 container_name: node
25 network_mode: "service:django"
26volumes:
27 spiderdata:
28 driver: local-persist
29 driver_opts:
30 mountpoint: /data/spider_data
31
32networks:
33 spider-network:
34 external: true