ไม่มีการเชื่อมต่ออินเทอร์เน็ตภายในคอนเทนเนอร์ Docker


24

ฉันไม่สามารถดำเนินการคำสั่งใด ๆ ที่ต้องการการเชื่อมต่ออินเทอร์เน็ตภายในคอนเทนเนอร์ Docker ใด ๆ

ผลงาน:

docker run ubuntu /bin/echo 'Hello world'

ไม่ทำงาน, ไม่เป็นผล:

docker run ubuntu apt-get update

Err:1 http://archive.ubuntu.com/ubuntu xenial InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Err:2 http://archive.ubuntu.com/ubuntu xenial-updates InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Err:3 http://archive.ubuntu.com/ubuntu xenial-security InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Reading package lists...
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial/InRelease  Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial-updates/InRelease  Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial-security/InRelease  Temporary failure resolving 'archive.ubuntu.com'

คล้ายกันกับและpipping

ฉันใช้ Ubuntu 16.04 และไม่ได้ใช้ไฟร์วอลล์หรือพร็อกซีเซิร์ฟเวอร์องค์กรและพยายามรีสตาร์ท Docker

UPD:

การปรับปรุงในโหมดโต้ตอบล้มเหลวในลักษณะเดียวกัน

docker exec -ti angry_goodall /bin/bash
apt-get update
#fails
ping google.com
#fails with "unknown host" message
ping 8.8.8.8 
# shows PING 8.8.8.8 (8.8.8.8): 56 data bytes
# and than hangs indefinetly

sudo apt-get update ทำงานบนโฮสต์สำเร็จเช่นบนคอมพิวเตอร์ของฉันที่อยู่ด้านนอกตัวเชื่อมต่อ

การอัพเดต Docker เวอร์ชั่น 1.12.1, สร้าง 23cf638


คุณสามารถ ping โดเมนจากโฮสต์ได้หรือไม่ คุณสามารถทำงานapt-get updateในขณะที่อยู่ในโหมดโต้ตอบกับนักเทียบท่าได้หรือไม่?
adampski

ผลลัพธ์แสดงข้อผิดพลาด: การแก้ไขความล้มเหลวชั่วคราว 'archive.ubuntu.com' ... ลอง .. ping www.google.com .. ดูว่าคุณได้รับคำตอบเดียวกัน .. จากนั้นลอง ... ping 8.8.8.8 .. . ถ้า IP ใช้งานได้และชื่อโฮสต์ไม่ได้แสดงว่า DNS ของคุณไม่ทำงาน (เพิ่มเติม /etc/resolv.conf เพื่อดูว่ามีการใช้เซิร์ฟเวอร์ DNS ใด)
TG2

@adampski ฉันได้อัปเดตคำถามตามคำแนะนำของคุณแล้ว
Sashko Lykhenko

@ TG2 ฉันอัปเดตคำถามตามคำแนะนำของคุณเช่นกัน
Sashko Lykhenko

เอ็นจิ้นนักเทียบท่ารุ่นใดที่คุณใช้อยู่
adampski

คำตอบ:


14

ตามที่แนะนำโดยcreack ใน GitHub รุ่น # 866 สำหรับ Docker :

pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
docker -d

"มันจะบังคับให้นักเทียบท่าสร้างสะพานขึ้นมาใหม่และเสริมกฎเครือข่ายทั้งหมด"


1
ฉันลองแล้วและนี่เป็นการฆ่าเครือข่ายในคอมพิวเตอร์ทั้งหมดของฉัน
petersohn

สิ่งนี้มีประโยชน์และแก้ไขปัญหาสำหรับฉัน ขอขอบคุณ.
Rao

10
-dธงไม่ได้ทางออก
Luís de Sousa

2
สวัสดี @ LuísdeSousaมันเป็นความอัปยศที่คุณลงคะแนน แต่ให้พิจารณาถึงความเป็นไปได้ที่บางทีสวิตช์บางตัวอาจถูกลบหรือเปลี่ยนแปลงในรุ่นที่ใหม่กว่า โดยเฉพาะอย่างยิ่งตั้งแต่เมื่อปีที่แล้ว
adampski

3
แทนที่จะเป็นเพียงคัดลอก / ที่ผ่านมาคำสั่งที่คุณสามารถอธิบายสิ่งเหล่านี้ :) เฉลี่ย
Adelin

12

มีปัญหาที่คล้ายกันที่ StackOverflow ซึ่งวิธีการแก้ปัญหาที่แตกต่างกันแก้ปัญหานี้ด้วย Docker 17.09 บน Ubuntu 16.04:

ตรวจสอบเนื้อหาของresolv.conf:

$ cat /etc/resolv.conf

หากมีบรรทัดเหมือนnameserver 127.0.1.1หมายความว่าคอนเทนเนอร์ได้รับเซิร์ฟเวอร์ชื่อที่ไม่ถูกต้อง เพื่อแก้ไขการแก้ไขNetworkManager.confไฟล์:

$ sudo pico /etc/NetworkManager/NetworkManager.conf

และแสดงความคิดเห็นออกมาด้วยdns=dnsmasq; ไฟล์ควรมีลักษณะดังนี้:

[main]
plugins=ifupdown,keyfile,ofono
#dns=dnsmasq

[ifupdown]
managed=false

ในที่สุดรีสตาร์ทตัวจัดการเครือข่าย:

$ sudo systemctl restart network-manager

ทดสอบภาชนะอีกครั้ง:

$ docker run ubuntu:16.04 apt-get update
Get:1 http://archive.ubuntu.com/ubuntu xenial InRelease [247 kB]
Get:2 http://archive.ubuntu.com/ubuntu xenial-updates InRelease [102 kB]

การติดตั้งของฉันตรงกับคำอธิบายและวิธีการด้านบนแก้ปัญหาให้ฉันได้
krcools

อัปเดตคำตอบสำหรับ Ubuntu 18.04: superuser.com/a/1335054
wisbucky

7

สิ่งแรกที่ต้องตรวจสอบจะดำเนินการcat /etc/resolv.confในภาชนะนักเทียบท่า หากมีเซิร์ฟเวอร์ DNS ที่ไม่ถูกต้องเช่นnameserver 127.0.x.xนั้นคอนเทนเนอร์จะไม่สามารถแก้ไขชื่อโดเมนเป็นที่อยู่ IP ดังนั้นping google.comจะล้มเหลว

สิ่งที่สองที่การันcat /etc/resolv.confบนเครื่องโฮสต์ นักเทียบท่าโดยทั่วไปจะคัดลอกโฮสต์/etc/resolv.confไปยังคอนเทนเนอร์ทุกครั้งที่เริ่มคอนเทนเนอร์ ดังนั้นถ้าโฮสต์ของ/etc/resolv.confผิดแล้วจะเทียบท่าภาชนะ

หากคุณพบว่าโฮสต์/etc/resolv.confผิดคุณมี 2 ตัวเลือก:

  1. ฮาร์ดโค้ดเซิร์ฟเวอร์ DNS ใน daemon.json นี่เป็นเรื่องง่าย แต่ไม่เหมาะหากคุณคาดว่าเซิร์ฟเวอร์ DNS จะเปลี่ยนแปลง

  2. /etc/resolv.confแก้ไขโฮสต์ของ นี่เป็นเรื่องเล็กน้อย แต่สร้างขึ้นแบบไดนามิกและคุณไม่ได้เข้ารหัสเซิร์ฟเวอร์ DNS


1. เซิร์ฟเวอร์ Hardcode DNS ใน docker daemon.json

  • แก้ไข /etc/docker/daemon.json

    {
        "dns": ["10.1.2.3", "8.8.8.8"]
    }
    
  • รีสตาร์ท docker daemon เพื่อให้การเปลี่ยนแปลงมีผล:
    sudo systemctl restart docker

  • ตอนนี้เมื่อคุณเรียกใช้ / เริ่มต้นคอนเทนเนอร์นักเทียบท่าจะเติม/etc/resolv.confค่าdaemon.jsonด้วย


2. แก้ไขโฮสต์ /etc/resolv.conf

A. Ubuntu 16.04 และก่อนหน้า

  • สำหรับ Ubuntu 16.04 และก่อนหน้า/etc/resolv.confนั้นสร้างโดย NetworkManager

  • ใส่เครื่องหมายความคิดเห็นในบรรทัดdns=dnsmasq(ด้วย#) ใน /etc/NetworkManager/NetworkManager.conf

  • รีสตาร์ท NetworkManager เพื่อสร้างใหม่/etc/resolv.conf:
    sudo systemctl restart network-manager

  • ยืนยันกับโฮสต์: cat /etc/resolv.conf

B. Ubuntu 18.04 และใหม่กว่า

  • อูบุนตู 18.04 เปลี่ยนไปใช้ในการสร้างsystemd-resolved /etc/resolv.confตอนนี้โดยค่าเริ่มต้นจะใช้แคช DNS ท้องถิ่น 127.0.0.53 สิ่งนี้จะไม่ทำงานภายในคอนเทนเนอร์ดังนั้นนักเทียบท่าจะใช้ค่าเริ่มต้นกับเซิร์ฟเวอร์ DNS 8.8.8.8 ของ Google ซึ่งอาจแตกสำหรับคนที่อยู่หลังไฟร์วอลล์

  • /etc/resolv.confเป็น symlink ( ls -l /etc/resolv.conf) ซึ่งชี้ไปที่/run/systemd/resolve/stub-resolv.conf(127.0.0.53) ตามค่าเริ่มต้นใน Ubuntu 18.04

  • เพียงแค่เปลี่ยน symlink ให้ชี้ไป/run/systemd/resolve/resolv.confที่ซึ่งแสดงรายการเซิร์ฟเวอร์ DNS จริง:
    sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

  • ยืนยันกับโฮสต์: cat /etc/resolv.conf

ตอนนี้คุณควรมีสิทธิใช้งาน/etc/resolv.confบนโฮสต์สำหรับนักเทียบท่าเพื่อคัดลอกลงในคอนเทนเนอร์

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