为什么特定的 docker 网络会选择一个奇怪的范围?

为什么特定的 docker 网络会选择一个奇怪的范围?

我有两个“用户”网络:LAN192.168.10.0/24和 Wireguard 192.168.20.0/24。我还托管了192.168.10.2一个 Docker 引擎,它为十几个容器和一些网络提供支持,这些容器和网络都整齐地落在 上172.XX.0.0/16。一切都运行良好。

我添加了一组新容器来托管 Graylog 服务。我使用了docker-compose.ymlrepo 提供的,并做了一些小改动:连接到 dockersrv网络,允许 Web 容器连接到caddy反向代理。完整内容docker-compose.yaml如下:

version: '2'
services:
  # MongoDB: https://hub.docker.com/_/mongo/
  mongodb:
    image: mongo:4.2
    volumes:
      - mongo_data:/data/db
    networks:
      - default
  # Elasticsearch: https://www.elastic.co/guide/en/elasticsearch/reference/7.10/docker.html
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch-oss:7.10.2
    volumes:
      - es_data:/usr/share/elasticsearch/data
    environment:
      - http.host=0.0.0.0
      - transport.host=localhost
      - network.host=0.0.0.0
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    mem_limit: 1g
    networks:
      - default
  # Graylog: https://hub.docker.com/r/graylog/graylog/
  graylog:
    image: graylog/graylog:4.3
    volumes:
      - graylog_data:/usr/share/graylog/data
    environment:
      # CHANGE ME (must be at least 16 characters)!
      - GRAYLOG_PASSWORD_SECRET=XXX
      # Password: admin
      - GRAYLOG_ROOT_PASSWORD_SHA2=XXXXX
      - GRAYLOG_HTTP_EXTERNAL_URI=https://graylog.XXXX/
    entrypoint: /usr/bin/tini -- wait-for-it elasticsearch:9200 --  /docker-entrypoint.sh
    links:
      - mongodb:mongo
      - elasticsearch
    restart: always
    depends_on:
      - mongodb
      - elasticsearch
    ports:
      # Graylog web interface and REST API
      #- 9000:9000
      # Syslog TCP
      - 1514:1514
      # Syslog UDP
      - 1514:1514/udp
      # GELF TCP
      - 12201:12201
      # GELF UDP
      - 12201:12201/udp
    networks:
      - default
      - srv
# Volumes for persisting data, see https://docs.docker.com/engine/admin/volumes/volumes/
volumes:
  mongo_data:
    driver: local
  es_data:
    driver: local
  graylog_data:
    driver: local

networks:
  default:
  srv:
    external: true
    name: srv

由于某种原因,自动创建的 docker 网络处于打开状态192.168.16.0/20,我花了很长时间才明白为什么 Wireguard 不再工作:这个网络包含192.168.20.0/24并且 wireguard 流量被路由到那里……

关闭 Graylog 并手动删除192.168.16.0/20所有内容后恢复正常。

我的问题是:为什么 docker 组合会选择一个与其他容器使用的网络截然不同的网络?如果没有任何内容docker-compose.yml可以提示要使用的网络,那么这个选择是如何驱动的?

答案1

手动删除 docker 网络后(根据问题后半部分的信息)我重新启动了Graylog containers and, behold, the created network follows the172.XX.0.0/16` 模板。

我大胆猜测,可能是强制启用了一个网络192.168...,然后 Graylog 决定遵循这个新模板,并删除了以前的网络。

相关内容