นักเทียบท่า“ ข้อผิดพลาด: ไม่สามารถหากลุ่มที่อยู่ IPv4 ที่มีอยู่และไม่ทับซ้อนกันในค่าเริ่มต้นที่จะกำหนดให้กับเครือข่าย”


154

ฉันมีไดเรกทอรีที่apkmirror-scraper-composeมีโครงสร้างต่อไปนี้:

.
├── docker-compose.yml
├── privoxy
   ├── config
   └── Dockerfile
├── scraper
   ├── Dockerfile
   ├── newnym.py
   └── requirements.txt
└── tor
    └── Dockerfile

ฉันพยายามที่จะเรียกใช้ต่อไปนี้docker-compose.yml:

version: '3'

services:
  privoxy:
    build: ./privoxy
    ports:
      - "8118:8118"
    links:
      - tor

  tor:
    build:
      context: ./tor
      args:
        password: ""
    ports:
      - "9050:9050"
      - "9051:9051"

  scraper:
    build: ./scraper
    links:
      - tor
      - privoxy

ที่Dockerfileสำหรับtorคือ

FROM alpine:latest
EXPOSE 9050 9051
ARG password
RUN apk --update add tor
RUN echo "ControlPort 9051" >> /etc/tor/torrc
RUN echo "HashedControlPassword $(tor --quiet --hash-password $password)" >> /etc/tor/torrc
CMD ["tor"]

นั่นprivoxyคือ

FROM alpine:latest
EXPOSE 8118
RUN apk --update add privoxy
COPY config /etc/privoxy/config
CMD ["privoxy", "--no-daemon"]

โดยที่configประกอบด้วยสองบรรทัด

listen-address 0.0.0.0:8118
forward-socks5 / tor:9050 .

และDockerfileสำหรับscraperคือ

FROM python:2.7-alpine
ADD . /scraper
WORKDIR /scraper
RUN pip install -r requirements.txt
CMD ["python", "newnym.py"]

ที่มีเส้นเดียวrequirements.txt requestsในที่สุดโปรแกรมnewnym.pyได้รับการออกแบบมาเพื่อทดสอบว่าการเปลี่ยนที่อยู่ IP โดยใช้ Tor นั้นทำงานหรือไม่:

from time import sleep, time

import requests as req
import telnetlib


def get_ip():
    IPECHO_ENDPOINT = 'http://ipecho.net/plain'
    HTTP_PROXY = 'http://privoxy:8118'
    return req.get(IPECHO_ENDPOINT, proxies={'http': HTTP_PROXY}).text


def request_ip_change():
    tn = telnetlib.Telnet('tor', 9051)
    tn.read_until("Escape character is '^]'.", 2)
    tn.write('AUTHENTICATE ""\r\n')
    tn.read_until("250 OK", 2)
    tn.write("signal NEWNYM\r\n")
    tn.read_until("250 OK", 2)
    tn.write("quit\r\n")
    tn.close()


if __name__ == '__main__':
    dts = []
    try:
        while True:
            ip = get_ip()
            t0 = time()
            request_ip_change()
            while True:
                new_ip = get_ip()
                if new_ip == ip:
                    sleep(1)
                else:
                    break
            dt = time() - t0
            dts.append(dt)
            print("{} -> {} in ~{}s".format(ip, new_ip, int(dt)))
    except KeyboardInterrupt:
        print("Stopping...")
        print("Average: {}".format(sum(dts) / len(dts)))

การdocker-compose buildสร้างสำเร็จ แต่ถ้าฉันลองdocker-compose upฉันจะได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้:

Creating network "apkmirrorscrapercompose_default" with the default driver
ERROR: could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network

ฉันพยายามค้นหาความช่วยเหลือจากข้อความแสดงข้อผิดพลาดนี้ แต่ไม่พบ อะไรเป็นสาเหตุของข้อผิดพลาดนี้?


1
ไม่ไม่docker psแสดงคอนเทนเนอร์
Kurt Peek

77
คุณมีการเชื่อมต่อ VPN หรือไม่? คุณลองรีสตาร์ทคอมพิวเตอร์ของคุณแล้วหรือไม่ (ฉันเป็น googling) github.com/moby/moby/issues/30295
Robert

3
คุณลองdocker network lsและยืนยันได้ไหมว่าเครือข่ายนั้นถูกสร้างขึ้นบนโฮสต์ของคุณแล้ว
Peter Hauge

1
ขอบคุณ @Robert ฉันใช้ PIA VPN ทำงานอยู่เมื่อฉันตัดการเชื่อมต่อและออกก็จะทำงานได้
xx1xx

15
docker network prune. วิธีนี้จะแก้ไขปัญหาของคุณ
Jinna Balu

คำตอบ:


276

ฉันเห็นแล้วว่านักเทียบท่าแนะนำว่าอาจมีจำนวนสูงสุดของเครือข่ายที่สร้างขึ้น คำสั่งdocker network pruneสามารถใช้เพื่อลบเครือข่ายทั้งหมดที่ไม่ได้ใช้อย่างน้อยหนึ่งคอนเทนเนอร์

ปัญหาของฉันสิ้นสุดลงเมื่อRobertแสดงความคิดเห็นเกี่ยวกับ: ปัญหาเกี่ยวกับ openvpn service openvpn stop'แก้ไข' ปัญหา


10
หากคุณจำเป็นต้องใช้ควบคู่ไปกับนักเทียบท่า VPN นี่คือคำตอบที่เป็นไปได้: stackoverflow.com/q/45692255/7918
jb

45
บริการ OpenVPN เป็นปัญหาสำหรับฉัน
Liviu Ilea

เพื่อเพิ่มคำตอบข้างต้นถ้าคุณได้รับปัญหาใด ๆ เช่นการตัดแต่งกิ่งนี้ระบบสามารถช่วยได้จริงๆ Docker system pruneยังสามารถแก้ไขได้ แต่โปรดระวังสิ่งนี้สามารถลบ DB ของคุณใช้สิ่งนี้ถ้าคุณไม่สนใจคุณ DB หรือถ้าคอนเทนเนอร์ DB ของคุณกำลังทำงานอยู่คำสั่งนี้จะปลอดภัยเพราะมันเป็นเพียงลูกพรุนสิ่งที่ไม่ได้ใช้ โดยอย่างน้อยหนึ่งคอนเทนเนอร์
Sweet Chilly Philly

ขอบคุณ ฉันยืนยันว่าการหยุดไคลเอ็นต์ openvpn จะทำงาน ฉันเริ่มต้นเมื่อไม่กี่วันก่อนจากนั้นฉันก็วิ่งนักแต่งเพลงวันนี้และพบข้อผิดพลาดนั้น
Dat TT

1
ลองนึกภาพชีวิตที่เครื่องมือของเราให้ข้อมูลการดีบักที่เป็นประโยชน์แก่เรา
ดาเมียนโรช

157

ฉันพบปัญหานี้เพราะฉันใช้ OpenVPN ทันทีที่ฉันฆ่า OpenVPN docker-compose upยิงได้เลยและข้อผิดพลาดก็หายไป


9
เหมือนกันที่นี่กับผู้ให้บริการ VPN รายอื่น (expressvpn)
berkes

1
ปัญหาเดียวกันกับการใช้งาน OpenVPN
Nicolai

6
ดังนั้นฉันมีปัญหาเดียวกันและฉันสงสัยว่าทำไมสิ่งนี้เกิดขึ้น ทำไมเครือข่าย Docker ถึงสับสนเมื่อเชื่อมต่อกับ VPN
David Ficociello

2
ฉันมีปัญหาเดียวกันกับการเข้าถึงอินเทอร์เน็ตส่วนตัว
นิโคลัส

1
ฉันได้เพิ่มเส้นทางแทนที่จะredirect-gateway def1แก้ไขปัญหาโดยไม่ฆ่าบริการ openvpn ของฉัน
ดักลาสหลิว

59

ฉันพบปัญหาในการทำงานกับ OpenVPN เช่นกันและฉันพบวิธีแก้ปัญหาที่คุณไม่ควรหยุด / เริ่มเซิร์ฟเวอร์ OpenVPN

แนวคิดที่ว่าคุณควรระบุซับเน็ตที่คุณต้องการใช้ ในการdocker-compose.ymlเขียน:

networks:
  default:
    driver: bridge
    ipam:
      config:
        - subnet: 172.16.57.0/24

แค่นั้นแหละ. ตอนนี้defaultเครือข่ายจะถูกนำมาใช้และหาก VPN ของคุณไม่ได้มอบหมายบางสิ่งให้คุณจาก172.16.57.*ซับเน็ตคุณก็ใช้ได้


2
มันเยี่ยมมาก! กล่องเซิร์ฟเวอร์ของฉันไม่สามารถอยู่ได้หากไม่มี OpenVPN ดังนั้นคำแนะนำเกี่ยวกับ (แม้เป็นการชั่วคราว) การปิดใช้งาน VPN นั้นไร้สาระทั้งหมดสำหรับฉัน
iBug

4
นี่ควรเป็นคำตอบที่ได้รับการยอมรับเนื่องจากการฆ่า VPN นั้นช่างโง่เง่า
michnovka

ไม่ใช่ 172.177.57.0/24 newtork ที่กำหนดเส้นทางหรือไม่ ถ้าเป็นเช่นนั้นอาจทำให้เกิดปัญหาในการติดต่อโฮสต์ที่ จำกัด บนอินเทอร์เน็ต
dstromberg

1
ใช่ความผิดพลาดที่นี่ จะดีกว่าถ้าใช้จาก172.16.*.*เครือข่ายย่อย
Arenim

ผมไม่คิดว่าการใช้172.177.57.*ความคิดที่ดีเพราะมันไม่ได้อยู่ในen.wikipedia.org/wiki/Private_network#Private_IPv4_addresses ใช้ที่อยู่ในช่วงนี้
lucidyan

53

ต่อไปนี้ปีเตอร์ Hauge 's ความคิดเห็นเมื่อทำงานdocker network lsผมเห็น (ในสายอื่น ๆ ) ต่อไปนี้:

NETWORK ID          NAME                                    DRIVER              SCOPE
dc6a83d13f44        bridge                                  bridge              local
ea98225c7754        docker_gwbridge                         bridge              local
107dcd8aa889        host                                    host                local

บรรทัดที่มีNAMEและDRIVERตามที่ทั้งคู่hostดูเหมือนจะเป็นสิ่งที่เขาอ้างถึงด้วย "เครือข่ายที่สร้างขึ้นบนโฮสต์ของคุณ" ดังนั้นต่อไปนี้https://gist.github.com/bastman/5b57ddb3c11942094f8d0a97d461b430ฉันได้รับคำสั่ง

docker network rm $(docker network ls | grep "bridge" | awk '/ / { print $1 }')

ตอนนี้ใช้docker-compose upงานได้ (แม้ว่าจะnewnym.pyสร้างข้อผิดพลาด)


8
ใช้งานไม่ได้กับเวอร์ชันล่าสุดของdefault
Docker

หากคุณกำลังใช้ Traefik ตรวจสอบให้แน่ใจว่าได้ปิดคอนเทนเนอร์ก่อนที่จะเรียกใช้คำสั่งนี้ มิฉะนั้นจะคิดว่าเครือข่ายทั้งหมดของคุณทำงานอยู่
Allure Web Solutions

ถ้าฉันทำงานdocker network rm $(docker network ls | grep "bridge" | awk '/ / { print $1 }')ฉันจะได้รับError response from daemon: bridge is a pre-defined network and cannot be removedบน Ubuntu 20.04Docker version 19.03.9, build 9d988398e7 docker-compose version 1.25.0, build unknown
therobyouknow

47

ผมมีปัญหาเดียวกัน. ฉันวิ่งdocker system prune -a --volumes, docker network pruneแต่ไม่ช่วยให้ฉัน

ฉันใช้ VPN ฉันปิด VPN และหลังจากที่นักเทียบท่าเริ่มปกติแล้วก็สามารถสร้างเครือข่ายได้ หลังจากนั้นคุณสามารถเปิดใช้งาน VPN อีกครั้ง


3
การเชื่อมต่อ VPN ของฉันอยู่บนซับเน็ตเดียวกันกับที่นักเทียบท่าคนหนึ่งพยายามใช้ การตัดการเชื่อมต่อช่วยแก้ปัญหาสำหรับฉัน :)
XtraSimplicity

1
ahhhVPN กำลังทำงานอยู่
Adiii

25

ตามคำตอบอื่น ๆ ที่กล่าวถึงbridgeเครือข่ายเริ่มต้นของ Docker สนับสนุนเครือข่ายที่ต่างกันเพียง 30 เครือข่ายเท่านั้น หากคุณไม่ได้ใช้พวกเขาdocker network pruneจะทำเคล็ดลับ

อย่างไรก็ตามคุณอาจสนใจสร้างตู้คอนเทนเนอร์มากกว่า 30 ตู้แต่ละตู้มีเครือข่ายของตัวเอง คุณสนใจที่จะทำเช่นนั้นแล้วคุณจะต้องกำหนดoverlayเครือข่าย นี้เป็นเรื่องยุ่งยากมากขึ้นอีกนิด แต่เอกสารเป็นอย่างดีที่นี่

แก้ไข (พฤษภาคม 2020): การเชื่อมโยงได้กลายเป็นที่ใช้งานไม่ได้จะผ่านเอกสารมีไม่เปลี่ยนแน่นอน แต่ผมจะแนะนำให้เริ่มต้นจากที่นี่


ลิงก์ของคุณคือ 404
chovy

@ chovy ขอบคุณที่แจ้งให้เราทราบพวกเขาได้จัดระเบียบเอกสารของพวกเขาอีกครั้ง อัปเดตทันที
Carlos Segarra

13

ฉันมีปัญหาเหมือนกันกับข้อความแสดงข้อผิดพลาดเดียวกัน แต่การแก้ปัญหาด้วยการลบเครือข่ายนักเทียบท่าที่ไม่ได้ใช้ไม่ได้ช่วย ฉันลบเครือข่ายนักเทียบท่าที่ไม่ใช่ค่าเริ่มต้นทั้งหมด (และรูปภาพและคอนเทนเนอร์ทั้งหมดด้วย) แต่มันก็ไม่ได้ช่วย - นักเทียบท่ายังไม่สามารถสร้างเครือข่ายใหม่ได้

สาเหตุของปัญหาอยู่ในอินเทอร์เฟซเครือข่ายที่เหลือหลังจากการติดตั้ง OpenVpn (มันถูกติดตั้งบนโฮสต์ก่อนหน้านี้) ฉันพบพวกเขาโดยใช้ifconfigคำสั่ง:

...
tun0  Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
      inet addr:10.8.0.2  P-t-P:10.8.0.2  Mask:255.255.255.0
      UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
      RX packets:75 errors:0 dropped:0 overruns:0 frame:0
      TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:100 
      RX bytes:84304 (84.3 KB)  TX bytes:0 (0.0 B)

tun1  Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
      inet addr:10.8.0.2  P-t-P:10.8.0.2  Mask:255.255.255.0
      UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
      RX packets:200496 errors:0 dropped:0 overruns:0 frame:0
      TX packets:148828 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:100 
      RX bytes:211583838 (211.5 MB)  TX bytes:9568906 (9.5 MB)
...

ฉันพบว่าฉันสามารถลบออกได้ด้วยคำสั่งสองสามข้อ:

ip link delete tun0
ip link delete tun1

หลังจากนี้ปัญหาก็หายไป


สิ่งนี้ใช้ได้กับฉันหลังจากลองใช้หลายตัวเลือก - หยุด openvpn, รีสตาร์ทพีซี,
แมตต์

10
  1. ตรวจสอบว่าคอนเทนเนอร์อื่นกำลังทำงานอยู่หรือไม่ถ้าใช่ให้ทำดังนี้ docker-compose down
  2. หาก VPN เชื่อมต่ออยู่ให้ยกเลิกการเชื่อมต่อแล้วลองอีกครั้งเพื่อตั้งค่าตัวเทียบท่า

    docker-compose up -d container_name

ฉันไม่ได้ใช้ VPN แต่docker-compose downแก้ไขให้ฉัน
IMB


8

ฉันเข้ารหัสปัญหาเดียวกันสาเหตุที่คุณถึงเครือข่ายสูงสุด:

ทำ: docker network ls เลือกหนึ่งรายการเพื่อลบโดยใช้:docker network rm networkname_default


7

TL; DR

เพิ่ม

version: "3.7"
services:
  web:
    ...
    network_mode: "bridge"

อ่านข้อมูลเกี่ยวกับnetwork_modeในเอกสาร

รุ่นยาว

ข้อจำกัดความรับผิดชอบ : ฉันไม่ค่อยมีความรู้เกี่ยวกับการเชื่อมต่อเครือข่ายนักเทียบท่า แต่นี่เป็นเคล็ดลับสำหรับฉัน YMMV

เมื่อฉันรันdocker run my-imageเครือข่ายก็ไม่มีปัญหา แต่เมื่อฉันแปลงคำสั่งนี้เป็นdocker-compose.ymlไฟล์ฉันได้รับข้อผิดพลาดเดียวกับ OP

ฉันอ่านคำตอบของ Arenimและสิ่งอื่น ๆ บนอินเทอร์เน็ตที่แนะนำให้ใช้เครือข่ายที่มีอยู่อีกครั้ง

คุณสามารถค้นหาเครือข่ายที่มีอยู่เช่นนี้:

# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
ca0415dfa442        bridge              bridge              local
78cbbda034dd        host                host                local
709f13f4ce2d        none                null                local

ฉันต้องการใช้bridgeเครือข่ายเริ่มต้นอีกครั้งดังนั้นฉันจึงเพิ่ม

services:
  web:
    ...

networks:
  default:
    external:
      name: bridge

ไปที่รากของฉันdocker-compose.yml(ดังนั้นไม่อยู่ภายในหนึ่งของฉัน servicesแต่ที่เยื้องราก)

ฉันได้รับข้อผิดพลาดต่อไปนี้:

ข้อผิดพลาด: สำหรับนามแฝงที่กำหนดขอบเขตเครือข่ายคอนเทนเนอร์ของคุณรองรับเฉพาะคอนเทนเนอร์ในเครือข่ายที่ผู้ใช้กำหนด

สิ่งนี้นำไปสู่ปัญหานักเทียบท่า Githubซึ่งกล่าวอย่างชัดเจนว่าฉันควรเพิ่มnetwork_modeวัตถุลงในของฉันdocker-compose:

version: "3.7"
services:
  web:
    ...
    network_mode: "bridge"

ผมใช้รุ่นหาง18.09.8, docker-composeรุ่นและรูปแบบไฟล์เขียน1.24.13.7


1
นี่เป็นคำถามหรือคำตอบหรือไม่?
chovy

มากขึ้น: การผจญภัยของฉันในดินแดนนักเทียบท่าและวิธีการที่ฉันสะดุดสิ่งที่ติดอยู่
Stefan van den Akker

6

OpenVPNเรื่องนี้เกิดขึ้นกับผมเพราะผมใช้ ฉันพบวิธีที่ฉันไม่จำเป็นต้องหยุดใช้ VPN หรือเพิ่มเครือข่ายด้วยตนเองไปยังไฟล์นักเทียบท่าหรือรันสคริปต์ใด ๆ ที่บ้า

ผมเปลี่ยนแทนWireGuard OpenVPNโดยเฉพาะอย่างยิ่งเมื่อฉันใช้งานโซลูชัน nordvpn ฉันติดตั้ง WireGuard และใช้ NordLynx เวอร์ชันของพวกเขา


คำสั่งที่เฉพาะเจาะจงที่จะเปลี่ยนจาก OpenVPN โปรโตคอล WireGuard สำหรับ NordVPN nordvpn set technology NordLynxคือ มันไม่ได้เป็นผลิตภัณฑ์ที่แยกต่างหากและในปัจจุบันมีให้บริการบน Linux & iOS เท่านั้น
tephyr

6

ไม่จำเป็นต้องฆ่า vpn

ความคิดเห็นอื่น ๆเกี่ยวกับการใช้เครือข่ายใหม่ค่อนข้างใกล้เคียงกับโซลูชันสำหรับฉันแล้วและใช้งานได้ระยะหนึ่ง แต่ฉันพบวิธีที่ดีกว่าด้วยการพูดคุยในคำถามอื่น

สร้างเครือข่ายด้วย:

docker network create your-network --subnet 172.24.24.0/24

จากนั้นที่ด้านล่างของ docker-compose.yaml ให้ใส่สิ่งนี้:

networks:
  default:
    external: 
      name: your-network

เสร็จสิ้น ไม่จำเป็นต้องเพิ่มเครือข่ายลงในคำจำกัดความคอนเทนเนอร์ทั้งหมดและคุณสามารถใช้เครือข่ายกับไฟล์นักเทียบท่าเขียนไฟล์อื่นได้เช่นกันหากคุณต้องการ


4

หากคุณต้องการเครือข่ายจำนวนมากคุณสามารถควบคุมจำนวนนักเทียบท่าพื้นที่ IP มอบให้กับแต่ละเครือข่ายผ่านการdefault-address-poolsตั้งค่า deamon ดังนั้นคุณสามารถเพิ่มสิ่งนี้ใน/etc/docker/daemon.json:

{
  "bip": "10.254.1.1/24",
  "default-address-pools":[{"base":"10.254.0.0/16","size":28}],
}

ที่นี่ฉันสงวนไว้10.254.1.1/24(254 ที่อยู่ IP) สำหรับเครือข่ายบริดจ์

สำหรับเครือข่ายอื่น ๆ ที่ฉันสร้างขึ้นนักเทียบท่าจะแบ่ง10.254.0.0พื้นที่ (โฮสต์ 65k) ออกเป็น 16 โฮสต์ต่อครั้ง ( "size":28หมายถึงCIDR maskสำหรับ 16 โฮสต์)

ถ้าฉันสร้างเครือข่ายไม่กี่แห่งและทำงานdocker network inspect <name>กับพวกเขามันอาจแสดงสิ่งนี้:

        ...
        "Subnet": "10.254.0.32/28",
        "Gateway": "10.254.0.33"
        ...

10.254.0.32/28หมายถึงเครือข่ายนี้สามารถใช้ 16 IP ที่อยู่จาก-10.254.0.3210.254.0.47


1

ฉันพบปัญหาเดียวกัน

การสร้างเครือข่าย "schemaregistry1_default" ด้วยไดรเวอร์เริ่มต้น
ข้อผิดพลาด: ไม่สามารถหากลุ่มที่อยู่ IPv4 ที่มีอยู่และไม่ทับซ้อนกันในค่าเริ่มต้นที่จะกำหนดให้กับเครือข่าย

และไม่มีอะไรช่วยจนกว่าฉันจะปิด Cisco VPN หลังจากที่นักเทียบท่าแต่งขึ้นทำงาน


-3

ฉันแก้ไขปัญหานี้เป็นขั้นตอน:

  1. ปิดเครือข่ายของคุณ (ไร้สายหรือใช้สาย ... )

  2. รีบูทระบบของคุณ

  3. ก่อนที่จะเปิดเครือข่ายของคุณบนพีซีรันคำสั่งนักเทียบท่าแต่งมันจะสร้างเครือข่ายใหม่

  4. จากนั้นคุณสามารถเปิดเครือข่ายและดำเนินการต่อ ...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.