ปิดใช้งาน Docker Networking: คำเตือน: การส่งต่อ IPv4 ถูกปิดใช้งาน เครือข่ายจะไม่ทำงาน


109

คอนเทนเนอร์ในโฮสต์ "จู่ๆ" ก็สูญเสียการเชื่อมต่อกับคอนเทนเนอร์นอกโลก อย่างไรก็ตามโฮสต์บางคนได้รับการรีเฟรชและทันใดนั้นเราก็มีสถานการณ์ต่อไปนี้:

  1. โฮสต์สามารถสื่อสารกับโฮสต์อื่น ๆ
  2. คอนเทนเนอร์ที่ทำงานในโฮสต์ไม่สามารถสื่อสารกับโฮสต์อื่นได้

นี่คือตัวอย่าง:

[root@pprdespap322 deploy]# ping ci.docker.company.net
PING pprdespap324.corp.company.net (10.137.55.22) 56(84) bytes of data.
64 bytes from pprdespap324.corp.company.net (10.137.55.22): icmp_seq=1 ttl=64 time=0.282 ms
64 bytes from pprdespap324.corp.company.net (10.137.55.22): icmp_seq=2 ttl=64 time=0.341 ms
^C
--- pprdespap324.corp.company.net ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.282/0.311/0.341/0.034 ms

ตอนนี้จากคอนเทนเนอร์เราไม่สามารถ ping โฮสต์เดียวกันได้:

[root@pprdespap322 deploy]# docker run -ti quay.io/coreos/registry ping ci.docker.company.net
WARNING: IPv4 forwarding is disabled. Networking will not work.
ping: unknown host ci.docker.company.net

ครั้งแรกที่ฉันเห็นคำเตือนนี้อยู่ใน Docker เวอร์ชันเริ่มต้น ... มี Docker 1.9.1 และ 1.10.3 จะแก้ปัญหานี้ได้อย่างไร?

คำตอบ:


187

ฉันตรวจสอบhttp://chrisgilmerproj.github.io/ubuntu/network/docker/2013/09/05/ipv4-forwarding-and-docker.htmlและมันช่วยฉันแก้ปัญหาบนโฮสต์

ฉันเพิ่มสิ่งต่อไปนี้ใน/etc/sysctl.conf :

net.ipv4.ip_forward=1

จากนั้นฉันเริ่มบริการเครือข่ายใหม่และตรวจสอบการตั้งค่า:

[root@pprdespap322 deploy]#  systemctl restart network
[root@pprdespap322 deploy]# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
[root@pprdespap322 deploy]# docker run -ti quay.io/coreos/registry ping ci.docker.company.net
PING pprdespap324.corp.company.net (10.137.55.22) 56(84) bytes of data.
64 bytes from pprdespap324.corp.company.net (10.137.55.22): icmp_seq=1 ttl=63 time=0.329 ms
64 bytes from pprdespap324.corp.company.net (10.137.55.22): icmp_seq=2 ttl=63 time=0.306 ms
^C
--- pprdespap324.corp.company.net ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.306/0.317/0.329/0.021 ms

ตอนนี้คอนเทนเนอร์ทั้งหมดสามารถสื่อสารกับคอนเทนเนอร์นอกโลกได้แล้ว!


15
บน Ubuntu ฉันจำเป็นต้องsudo sysctl -pโหลดการตั้งค่าใหม่ (ไม่พบ systemctl)
Nacho Coloma

2
จำเป็นต้องใช้โซลูชันนี้ใน Centos 7 เมื่อพยายามเข้าถึงคอนเทนเนอร์จากโฮสต์ (สำหรับการทดสอบ)
Dave C

ฉันมีคอนเทนเนอร์ที่คล้ายกันที่ทำงานบนโฮสต์ Windows (บน Hyper-V) มีการตั้งค่าที่คล้ายกันสำหรับ Windows หรือไม่?
Anthony Mastrean

4
แต่ทำไมถึงต้องการ? เครือข่ายทำงานได้อย่างสมบูรณ์โดยไม่ต้องส่งต่อดังนั้นนักเทียบท่าไม่ควรต้องการมันเช่นกัน ...
user3338098

2
@ user3338098 เนื่องจากเครือข่ายภายในกำลังส่งต่อการรับส่งข้อมูลระหว่างอินเทอร์เฟซเพื่อเข้าถึงอินเทอร์เน็ต สิ่งนี้จำเป็นเพื่อระบุให้ระบบ linux ใด ๆ กำหนดเส้นทางการรับส่งข้อมูลระหว่างอินเทอร์เฟซในแบบที่เราเตอร์เครือข่ายใช้เป็นเวลานาน สิ่งนี้ถูกปิดโดยค่าเริ่มต้นเนื่องจากกล่อง linux ส่วนใหญ่ไม่มีการส่งต่อและการส่งต่อการรับส่งข้อมูลโดยไม่ได้ตั้งใจจะเป็นภัยคุกคามด้านความปลอดภัยที่เลวร้ายที่สุดหรือทำให้เครือข่ายของคุณซับซ้อนที่สุด
Josiah

29

ลองเริ่มบริการ Docker ใหม่

เช่นสำหรับ Ubuntu:

$ sudo systemctl restart docker


6
ใน CentOS7 ก็ปรากฏปัญหานี้ขึ้นมาทันทีและการรีสตาร์ทบริการนักเทียบท่าก็ทำงานได้อย่างสมบูรณ์
steven87vt

1
สิ่งนี้ได้ผลทำให้ฉันกังวลว่าไม่รู้ว่าทำไมมันถึงได้ผล ใครมีเบาะแส? หรืออย่างน้อยขั้นตอนในการทำซ้ำความล้มเหลว?
Josiah

การสืบพันธุ์? เกิดขึ้นที่นี่หลังจากอัปเกรด Docker และรีบูตเครื่อง (บน Oracle Linux Server เวอร์ชัน 7.8 พร้อมเคอร์เนล: - 3.10.0-1127.el7.x86_64 # 1 SMP พุธ 1 เมษายน 10:20:09 PDT 2020 x86_64 x86_64 x86_64 GNU / Linux - อัปเกรด Docker ถึง: docker-ce-3: 19.03.8-3.el7.x86_64 ผ่าน yum repo: @ docker-ol7-prod)
JohannesB

1
ได้ผลขอบคุณ! แต่ใครจะรู้ว่ามันทำงานอย่างไร?
c0degeas

18

ลองเพิ่ม--network=hostพร้อมกับdocker runคำสั่งเพื่อแก้ไขปัญหานี้

https://medium.com/@gchandra/docker-ipv4-forwarding-is-disabled-8499ce59231e


2
มีประโยชน์สำหรับคอนเทนเนอร์เดียวในขณะทำงาน พารามิเตอร์คือ--net=host
สูงสุด 13

1
ตอนนี้ปัญหาเกี่ยวกับวิธีนี้คือถ้าคุณมีหลายคอนเทนเนอร์ที่ทำงานควบคู่กันเช่นบน Jenkins พอร์ตจะถูกแชร์และคุณเสี่ยงต่อการกดปุ่มบนพอร์ตที่แชร์เหล่านั้น เพื่อความชัดเจนเรากำลังทำการทดสอบ e2e กับ Cypress และเราพบปัญหาเกี่ยวกับ Xvfb ที่ไม่สามารถสร้างอินสแตนซ์ใหม่ได้เนื่องจากมีการใช้พอร์ตแล้ว
Alex Rashkov

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